<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[汐忆时空:CHIRS:蝶衣人生]]></title> 
<link>http://zhoujin.com/index.php</link> 
<description><![CDATA[一曲歌尽,回眸,双目盈盈,为谁?辗转.从一个怀抱到另一个怀抱,如飞舞的蝶.倦么?笑对人生::^_^ ]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[汐忆时空:CHIRS:蝶衣人生]]></copyright>
<item>
<link>http://zhoujin.com/post/201/</link>
<title><![CDATA[韩寒：写给张国荣]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Sun, 01 Apr 2012 06:41:54 +0000</pubDate> 
<guid>http://zhoujin.com/post/201/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2003年4月1日，我在开车从北京回上海的途中。在那之前，我并不是你的歌迷，我只知道你唱过《倩女幽魂》，我甚至觉得，你好久没做宣传，没出作品，已经过气了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对你的了解从京沪高速的山东段开始。那里的山上都是顽石，少见绿色。以往开车路过河北，山东和江苏，打开电台，要不是卖春药的，就是治性病的，还不停的有托打电话和主持人互动，说疗效好，去哪才能再买到。我常想，这么明显的忽悠，怎么可能有人相信。这个世界上真的充斥着荒诞。但那一次开车的旅程，我能调到所有的频率里都只有你的生平介绍，当然还有你唱过的歌。我甚至发现，有时候，我偶然会哼唱两句的不知名旋律，原来都是你的。路过临沂，电台主持人甚至自己开唱《奔向未来日子》。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对你来说，已经没有未来的日子了。你奔向了永远不会来的日子。那些岁月里，我是一个轻狂气傲的无知少年，对所谓港台巨星嗤之以鼻，这也让我错过了你。那几年我在北京，迷茫的就像在能见度只有一米起了大雾的国道上开车，好在我一直没开进逆行车道。等我懂你，再没机会来看你的演唱会。回想起来，你若在，无论我有钱没钱，一定会买一张离你最近的票。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;没有什么夸你的。我甚至想，如果你还活着，机缘巧合，兴许能和你吃上一顿饭，说上几句话。那次从北京回上海是一次奇妙的旅程，开过长江大桥，我就找了一个休息站停靠了下来，吃了一碗泡面，清楚记得江水声就在耳边。我买了两张你的盗版唱片。这不能怪我，在高速公路服务区里没有正版的。我启程上路，把唱片塞进了碟机。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;不幸的是，我没能听见你的声音，因为我买了VCD。家乡离我越来越近。1200公里路程，我并未为你落泪。毕竟我们刚认识，你得理解。到了上海，身边的朋友常常谈起你，有黯然神伤的，有伤心哭泣的，更多的是，哦，是嘛，他这么有钱，干嘛要自杀，可惜了。还有恶意揣测的——至今我的身边依然有人相信你是得了绝症或做了什么事情，不得已才跳楼，我每次都要和他们争辩。但两个星期以后，也便这样了，大家开始很少谈起你。一个月后，劳动节，大家依然不爱劳动，两个月后，儿童节，小孩依然欢声笑语，三个月后，四个月后，周年祭，到现在，九年了，这世界没有什么变化。这九年里，你陪伴我度过很多困难的时光，可惜那些激励我的歌并没能激励你自己。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我想我懂你了，Leslie。这眼前的世界并不是你我想象的那样。你改变不了。我改变不了。我今年三十岁，没有你那么多的作品，你死去了，你的歌也许能被别人再唱五十年，一百年，我若死去了，我的文字也许只能被别人记得五年，十年。又也许更短。我也许比你长寿很多，又也许不能。说不定我会成为一个老顽童，说不定我忍受不了自己衰老。谁知道呢。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Leslie，多年以后，我们终会相见。我获得的成就比你少很多，但争议倒也不少，算能作为谈资。和你一样，很多争议要到死后才能平息，或许不能，甚至更多。他日我们相见，你若不嫌弃，让我为你写一段歌词。不会差的，只是辛苦你要用普通话唱。你说你一生没做坏事，为何这样。我想我可以试着告诉你为何。因为，你一生没做坏事，所以，就是这样。<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a> , <a href="http://zhoujin.com/tags/%25E5%25BC%25A0%25E5%259B%25BD%25E8%258D%25A3/" rel="tag">张国荣</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/199/</link>
<title><![CDATA[日记一角：我的另一半]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Fri, 02 Mar 2012 04:30:12 +0000</pubDate> 
<guid>http://zhoujin.com/post/199/</guid> 
<description>
<![CDATA[ 
	我一直都在努力的勾勒我未来的另一半是什么样子，作为一个生活在社会中的人，孤独的生存并不是一个好的选择方案，但是有时候这是唯一的选择方案。<br/>不过好在，我运气还不算差。<br/><br/>说实话，我一直在追的人，是个直的不能再直的男孩，有点傻呼呼的样子，但是很好玩。众所周知追直男真是一件艰苦卓绝的事情，对于我这个魅力平平的人来说也同样如此。我坚持了两年，没有成功。<br/>与此同时队里另一个人慢慢的进入了我的生活。说慢慢的也不恰当，似乎我们热起来很快，也就是去年11月份中旬吧。我一直有四处调戏别人的爱好，当然他也在我的“调戏”猎物范围内。似乎整个事情开始于那一次晚上把他拽到我床上调戏开始。<br/>从那之后，我经常的骚扰也没有见到他的反抗，似乎有越来越顺从的趋势。<br/><br/>当然，我敏感的抓住了这一点，关系逐步升温。<br/><br/>人们说，忘掉一个人最好的办法就是和另一个人开始，果然不假。对于原来的那个傻小子我现在跟他只是最好最好的朋友，而现在的这个他……<br/><br/>我不知道我们能走多远，我只知道有闺蜜帮我刺探他是不在乎别人的看法的，当然我也是。不过嘛……这种事情还是越隐密越好，低调一点总是没错的。<br/><br/>有时候想想，幸福真的来的太突然，而且未来——还有半年毕业，我们的专业是3+1，还有一年不知道分配到那个学校去进修，以后更不知道分配到什么地方去工作，但我想，只要是有可能，这段感情我还是要努力的继续下去的，即便这份感情很艰难，但它来之不易。<br/><br/>说了这么多，说说他吧。<br/><br/>他……是个很闷骚的男人，不过闷骚嘛，就是对不熟悉的人闷，对喜欢的人骚，哈哈。我们关系刚刚开始升温的时候，基本上每天晚上他都在加班，原因嘛——我基本上每天晚上都加班学习/游戏，而且到学习室没人。他就一直陪着我，一直到一起回各自寝室睡觉，来一个晚安吻。<br/><br/>周末是我们自由活动的时候，他能一早上+一下午的看视频、看帖子，当然……也有跑过来蹭着我脸问我在干嘛的时候。<br/><br/>他身材不赖，但也没有超级好，上次摔了一跤尾骨受伤接近两个月没有运动让他胖了一圈呢~不过嘛，身材还是很好~<br/><br/>这就是我现在的另一半，我希望他一直都是。<br/>Tags - <a href="http://zhoujin.com/tags/%25E6%2584%259F%25E6%2583%2585/" rel="tag">感情</a> , <a href="http://zhoujin.com/tags/%25E5%25B9%25B8%25E7%25A6%258F/" rel="tag">幸福</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/198/</link>
<title><![CDATA[中国人想要什么？网民拉出“改革清单”]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Thu, 01 Mar 2012 02:29:04 +0000</pubDate> 
<guid>http://zhoujin.com/post/198/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;改革“要杀出一条血路”，“不改革，就是死路一条”，这样仅仅字面上就血淋淋的“改革”誓言，让广大民众听在耳里看在眼里，都是不寒而栗的。“改革”，何以变得如此令人生畏令人背嵴发凉？<br/>&nbsp;&nbsp;&nbsp;&nbsp;针对这三十多年来的“改革”，王梦恕老院士第一个站了出来直陈其弊“改革什么，什么就失败，老百姓就遭殃”。如此为民请命、如此直陈现实的真正知识分子精英，已经多年未见了，这是国家民族人民之幸，也是改革者们之幸阿。<br/>&nbsp;&nbsp;&nbsp;&nbsp;从王梦恕院士对这些年来改革的总结和定性，就不难看出老百姓是有充分理由对“改革”感到不寒而栗的，更何况那些血淋淋且带威胁恐吓的改革陈述。——不改革，死路一条！！<br/>&nbsp;&nbsp;&nbsp;&nbsp;但是，民众真的就拒绝和排斥改革吗？非也。相反，民众是热切盼望和期待改革的。为此，本帖子就暂且“代表”一次老百姓，给改革者们拉出一份民众最热切盼望的改革清单来，并敦请改革者们立即切实地改革之，不要“不改革”！<br/>&nbsp;&nbsp;&nbsp;&nbsp;1，公布官员个人及家族财产，公布官员直系亲属财产及就业信息；公布全国裸官信息，尤其要公布裸官用以亲属移民的资金来源，并逐步将所有裸官逐出中华人民共和国的官场；<br/>&nbsp;&nbsp;&nbsp;&nbsp;2，全国人大切实履行对“一府两院”的严格监督和工作审查，强化对国务院近年来频密的“非公XX条”及整个政府系统“招商引资，引进外资”等涉及国家经济安全的政策和部分法规进行系统全面审查；<br/>&nbsp;&nbsp;&nbsp;&nbsp;3、统一全民退休养老保险制度，立即将官员公务员退休养老统一纳入目前已经运行多年的社会保险系统，与目前参保市民一样，由官员公务员及其所在单位自缴保费参保，而且由政府替公务员缴交的部分保费必须全部明细公开，缴交费率及金额必须提交人大审议表决通过后再执行；<br/>&nbsp;&nbsp;&nbsp;&nbsp;4、立即实行全国12年全免费义务教育，政府统一均衡配置城乡教育资源，尤其农村校舍、师资配备及待遇不得低于当地城市教育资源配置，针对农村特殊情况，大幅度提高农村教师待遇以引导优秀师资到农村工作；<br/>&nbsp;&nbsp;&nbsp;&nbsp;5、立即降低高校教育收费，逐步实现财政经费支持的公办高校全部免费；“上不起学”是之前教育改革的恶果，必须立即纠正过来，而直接第一步学费减半，第二步全免费，是立即改变“上不起学”改革恶果的直接有效也是最简单的新改革措施；<br/>&nbsp;&nbsp;&nbsp;&nbsp;6、国家教育经费支出占GDP的比重，必须从目前全球倒数末尾的状况，提升到当前的世界平均水平即4%，并逐步改革过渡和国际接轨到与欧美国家持平即超过5%；我国已经是世界第二大经济体富国，根本不存在没钱的理由，教育支出必须跟上；<br/>&nbsp;&nbsp;&nbsp;&nbsp;7、立即全面彻底降低医药费，医疗设备诊治费等；通过深入系统调查医药制造企业生产成本尤其是目前其出厂价，然后强制实行远低于目前价格的医药医疗设备诊疗费用，并全部公开，接受民众的监督和举报，一经举报查实对医院实行一票否决制；<br/>&nbsp;&nbsp;&nbsp;&nbsp;8、立即对全国二套及以上住房实行高额累进级差房产税，比如第二套房每年征收房屋市价15%的房产税，第三套征收30%，高档豪宅别墅征收税率不低于50%；如此方可立即降低房价到合理水平，解除高房价对经济和民生福利的绑架与劫掠；<br/>&nbsp;&nbsp;&nbsp;&nbsp;9、立即建立全国统一的由中央多部门联合监管监督的反腐败网络平台如论坛等，不设限制地接受全国民众的举报投诉，并且除涉及国家国防领土主权等国家安全可 能是机密的除外以外，其他所有涉及经济腐败行政腐败司法腐败黑恶保护伞等举报投诉哪怕是怀疑等帖子，必须全过程公开，并却全过程公开调查及处理结果；<br/>&nbsp;&nbsp;&nbsp;&nbsp;10、全面评估国家生态环境安全，所有稀有战略矿产资源立即大幅减量出口，并大幅提高出口价格，在三年内过渡到稀有战略矿产资源零出口，并同时建立各种战略资源储备，积极从国外进口战略资源；<br/>&nbsp;&nbsp;&nbsp;&nbsp;11、立即彻底废除吸引外资引狼入室式的主动让外资控制我国各产业的旧政策，将国民经济发展壮大的主力转到依靠国内14亿人民的力量，而不是依靠洋人，以此将大量产业利润留在国内藏富于民，如此则内需不用拉就会自然兴旺起来；<br/>&nbsp;&nbsp;&nbsp;&nbsp;12、立即行政命令各级政府部分，全面搜寻和救援流浪乞讨儿童，并全部安排入学就读；立即行政命令各级政府，全面系统深入清理清查血汗工厂，对拖欠薪资、劳工条件不符合规定的、非法用工的血汗工厂全部关停并转、限期整改出成效；<br/>&nbsp;&nbsp;&nbsp;&nbsp;13、全国煤矿立即全部重新国有化，并将所有临时挖煤民工纳入过去的煤矿永久职工体系，组织科技力量和相关产业攻克煤矿垮塌瓦斯爆炸等矿难不止的根源，煤矿下井职工必须实行休假调养制度；<br/>&nbsp;&nbsp;&nbsp;&nbsp;14、公布目前所有国企尤其是大型央企高管层所有人员的个人简历信息及家庭情况，因为国企央企是全民全国共有财产，其掌门人及管理层的重要性很大程度上比 政府公务员还要重要，必须等同甚至更加严格于对官员公务员的监督，因此国企央企高管必须参照官员实行财产公开公示，接受全社会监督；而且，国企央企高官薪 酬标准必须提交人大审议表决后执行，把国企央企没有经营管理好的必须滚蛋；<br/>&nbsp;&nbsp;&nbsp;&nbsp;15、立即停止目前所有的“三公消费”拨款和财务报销，各级政府财政拨款经费只限于办公设备及人员工资薪酬发放，即等同于公司企业的经营管理成本支出；而 且仅按目前各级政府“公车”配备情况，十年不增加新购车辆，都足够用了的；出国“考察”一律提交省级及国务院备案批准方可；“公款吃喝招待”全部取消，仅 限于中央部委和省级外事接待保留并统一标准和费用标准；<br/>&nbsp;&nbsp;&nbsp;&nbsp;16、全面清理清查历次改革以来的国资“流失”情况，追查相关责任人和犯罪分子，必须将借改革之名侵吞国资的国贼们悉数捉拿归案，接受人民的公开审判。<br/>&nbsp;&nbsp;&nbsp;&nbsp;类似以上广大民众最急迫最热切盼望的改革清单，还有许多许多。民众并不是不愿意改革，更不是反对改革，民众是最最希望实施真正的强国富民的改革！毛主席说过“群众的眼睛是雪亮的”，广大民众对谁是真改革，谁是借改革之名中饱私囊甚至卖国，都是看得一清二楚，心里透亮的！<br/>Tags - <a href="http://zhoujin.com/tags/%25E6%2595%2599%25E8%2582%25B2/" rel="tag">教育</a> , <a href="http://zhoujin.com/tags/%25E6%2594%25B9%25E9%259D%25A9/" rel="tag">改革</a> , <a href="http://zhoujin.com/tags/%25E5%25AE%2598%25E5%2591%2598/" rel="tag">官员</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/200/</link>
<title><![CDATA[韩寒:让一部分人先选起来]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Wed, 29 Feb 2012 06:17:53 +0000</pubDate> 
<guid>http://zhoujin.com/post/200/</guid> 
<description>
<![CDATA[ 
	（由于美剧从来都是要偷偷下载的，所以上一篇的《重庆美剧》被屏蔽了，有网友帮我校对了错别字，但我暂时无权限修改，抱歉.）<br/><br/>首先，这篇文章的原名叫《彼岸花》，也就是年前回应麦田的文章里说的正写了一半的那篇。很遗憾年前美好的讨论气氛被一场闹剧摧毁了。那次讨论其实使我获益匪浅。看了很多人的文章以后，我有一些对原来观点的修正，由于这会儿还在保养期，就先不修了。待春暖花开时，我想《再谈革命》，《再谈自由》，《再谈民主》。让我意外的是，我以为这些枯燥的话题不会有多少人关心，因为我问过一些年轻的朋友，他们都表示最爱看我写的⋯⋯影评。我甚至看见过这样一段话：中国是个毛邓社会，华解不了，胡搞几年，赵样不行，江就一下，再胡搞几年，就习以为常了。这段话的信息量很大，同时也表明了你所有的关心，都是无用的，弄不好自己还要惹一身麻烦。<br/><br/>但是当有一个口子的时候，你会发现，其实对国家前途的关心就是对自己的关心，大家或深或浅或多或少都会愿意谈论，甚至为社会的改变而行动。期间发生了台湾的选举。虽然台湾和大陆在生态上有诸多的不同，但是无论是蒋介石，还是毛泽东，都不曾想到，国民党居然是通过了这种方式反攻大陆，没有一兵一卒，不用一枪一弹。于是我开始回想自己的履历，终于让我想起了我经历的的一次选举——<br/><br/>在我还是小学生的时候，班里选班长。我们班级好像一共是42人，每个同学可以选多人。我因为人见人爱，学习成绩突出（我小学的确是学习委员，不用诧异，每个胖子都瘦过），得了满票的42票，而我的竞争对手则比我少了一票。遗憾的是，最终的结果我并不是班长，因为老师说，你这个同学，太不谦虚了，居然能全票通过。你怎么好意思投自己一票。<br/><br/>于是，我落选了。虽然现在我是反对在学校进行班干部选举的，但那次在黑板上画“正”字，至今深印在记忆里。从那次以后，我至今没有见过选票。改革开放到现在已经二十多年，大家都记得邓小平在1985年说的一句话——让一部分人先富起来。这句话最终成为一个非正式的口号。毫无疑问，这个口号已经实现了，而且似乎已经超额实现，有一部分人太他妈富了，虽然中产阶层也在增多，但在这一部分暴富者的映衬之下，老百姓好像更穷了。经济改革已经过去了很多年，我们先不去管经济改革的成败得失，但政治改革依然不见起色，你看，十八大还没召开，老百姓都已经习以为常了。<br/><br/>说实话，我觉得现今中国一人一票选主席未必实际，社会各个阶层人数差别太大了，互相割裂，地区发展也不均衡。能做到一步到位朝发夕至的似乎也只有霸权和独裁，而非民主与改革。其实我能接受现在就知道2012年谁当主席，谁当总理，就像当年邓小平钦点接班人也没问题——邓立君，正常。但是我代表身边的很多年轻人朋友（这不是泛指，真的是我认识的朋友们，经过对民主和改革的讨论，他们授权我代表），郑重的希望改革开放的口号能够再加一句——让一部分先选起来。<br/><br/>至于这是哪一部分人，哪些地区，都无所谓，但是选什么很重要。中国很早就开始了村一级的行政选举，但是这种实践步子走的太小了。政权成立快一百年了，我们好歹也该一人一票选市长了。当然，在一开始，我甚至无所谓其中必须有民选代表，哪怕都是由官方指派的候选人都没关系。比如上海市，完全可以由当权者指定三个候选市长，让他们在电视台和报纸上自由辩论，提出各自设想，然后再去各个区县公开演讲。村级选举的贿选很容易（贿选也比不选强），市级选举的贿选就不那么容易了。在某个大城市进行公开市长选举的同时，全国人民也都可以围观和进行虚拟投票，培养培养情操，准备迎接实战。同时，市长可以每三年选举一次，人民代表可以联手弹劾市长，那人民代表就不再形同虚设。如果我们一个城市一个城市开始选举市长，那饱受诟病的上访制度也可以休息了。因为我坚信，只要市长是选出来的，哪怕暂时都是党的人，都会顾忌人民，反之就只会讨好上级。只要你不犯法，大不了人民把你选下去，你无非是能力不足，也不用为了保命而躲到美国领事馆去。这对于官员来说，也是一种解脱和保全，对于国民来说，则是最生动的民主练习。<br/><br/>社会之稳固，不应该靠中宣部，而应该靠往前迈几步。<br/>PS:原文已经和谐了。<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a> , <a href="http://zhoujin.com/tags/%25E9%2580%2589%25E4%25B8%25BE/" rel="tag">选举</a> , <a href="http://zhoujin.com/tags/%25E6%2594%25B9%25E9%259D%25A9/" rel="tag">改革</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/udpip-vpn/</link>
<title><![CDATA[udpip: 用UDP封装IP数据包建立VPN]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Thu, 23 Feb 2012 01:35:05 +0000</pubDate> 
<guid>http://zhoujin.com/udpip-vpn/</guid> 
<description>
<![CDATA[ 
	原理<br/><br/>使用Linux内核提供的tun设备建立可以在脚本读写的虚拟网卡，然后通过UDP将两个网卡的数据连接。<br/><br/>此方法能够使用以下特殊环境下：<br/><br/>1、客户端所在网络的路由不支持ppp，或者网络受到限制<br/>2、TCP数据包被劫持或者受到限制<br/>3、服务器是OpenVZ等不支持建立pptp，像我的burst的VPS就是这样子。<br/><br/>使用<br/><br/>服务器：<br/><br/># python udptun.py -s 86 -l 10.0.0.1/24<br/>Configuring interface t0 with ip 10.0.0.1/24<br/><br/>客户端：<br/><br/># python udptun.py -c zhoujin.com,86 -l 10.0.0.2/24<br/>Configuring interface t0 with ip 10.0.0.2/24<br/>Setting up new gateway ...<br/>Do login ...<br/>Logged in server succefully!<br/><br/>脚本代码<br/><br/>udptun.py:<div class="code">#!/usr/bin/python<br/><br/>&#039;&#039;&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;UDP Tunnel VPN<br/>&nbsp;&nbsp;&nbsp;&nbsp;Xiaoxia (xiaoxia@xiaoxia.org)<br/>&nbsp;&nbsp;&nbsp;&nbsp;Updated: 2012-2-21<br/>&#039;&#039;&#039;<br/><br/>import os, sys<br/>import hashlib<br/>import getopt<br/>import fcntl<br/>import time<br/>import struct<br/>import socket, select<br/>import traceback<br/>import signal<br/>import ctypes<br/>import binascii<br/><br/>SHARED_PASSWORD = hashlib.sha1(&quot;chirs&quot;).digest()<br/>TUNSETIFF = 0x400454ca<br/>IFF_TUN&nbsp;&nbsp; = 0x0001<br/><br/>BUFFER_SIZE = 8192<br/>MODE = 0<br/>DEBUG = 0<br/>PORT = 0<br/>IFACE_IP = &quot;10.0.0.1/24&quot;<br/>MTU = 1500<br/>TIMEOUT = 60*10 # seconds<br/><br/>class Tunnel():<br/>&nbsp;&nbsp;&nbsp;&nbsp;def create(self):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tfd = os.open(&quot;/dev/net/tun&quot;, os.O_RDWR)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tfd = os.open(&quot;/dev/tun&quot;, os.O_RDWR)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ifs = fcntl.ioctl(self.tfd, TUNSETIFF, struct.pack(&quot;16sH&quot;, &quot;t%d&quot;, IFF_TUN))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tname = ifs&#91;:16&#93;.strip(&quot;&#92;x00&quot;)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;def close(self):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.close(self.tfd)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;def config(self, ip):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Configuring interface %s with ip %s&quot; % (self.tname, ip)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&quot;ip link set %s up&quot; % (self.tname))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&quot;ip link set %s mtu 1000&quot; % (self.tname))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&quot;ip addr add %s dev %s&quot; % (ip, self.tname))<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;def config_routes(self):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if MODE == 1: # Server<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else: # Client<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Setting up new gateway ...&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Look for default route<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;routes = os.popen(&quot;ip route show&quot;).readlines()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaults = &#91;x.rstrip() for x in routes if x.startswith(&quot;default&quot;)&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not defaults:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise Exception(&quot;Default route not found, maybe not connected!&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.prev_gateway = defaults&#91;0&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.prev_gateway_metric = self.prev_gateway + &quot; metric 2&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.new_gateway = &quot;default dev %s metric 1&quot; % (self.tname)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.tun_gateway = self.prev_gateway.replace(&quot;default&quot;, IP)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.old_dns = file(&quot;/etc/resolv.conf&quot;, &quot;rb&quot;).read()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Remove default gateway<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&quot;ip route del &quot; + self.prev_gateway)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Add default gateway with metric<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&quot;ip route add &quot; + self.prev_gateway_metric)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Add exception for server<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&quot;ip route add &quot; + self.tun_gateway)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Add new default gateway<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&quot;ip route add &quot; + self.new_gateway)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Set new DNS to 8.8.8.8<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file(&quot;/etc/resolv.conf&quot;, &quot;wb&quot;).write(&quot;nameserver 8.8.8.8&quot;)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;def restore_routes(self):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if MODE == 1: # Server<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else: # Client<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Restoring previous gateway ...&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&quot;ip route del &quot; + self.new_gateway)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&quot;ip route del &quot; + self.prev_gateway_metric)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&quot;ip route del &quot; + self.tun_gateway)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.system(&quot;ip route add &quot; + self.prev_gateway)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file(&quot;/etc/resolv.conf&quot;, &quot;wb&quot;).write(self.old_dns)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;def run(self):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global PORT<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.udpfd = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if MODE == 1:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.udpfd.bind((&quot;&quot;, PORT))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.udpfd.bind((&quot;&quot;, 0))<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.clients = &#123;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.logged = False<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.try_logins = 5<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.log_time = 0<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while True:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if MODE == 2 and not self.logged and time.time() - self.log_time &gt; 2.:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Do login ...&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.udpfd.sendto(&quot;LOGIN:&quot; + SHARED_PASSWORD + &quot;:&quot; +<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IFACE_IP.split(&quot;/&quot;)&#91;0&#93;, (IP, PORT))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.try_logins -= 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if self.try_logins == 0:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;raise Exception(&quot;Failed to log in server.&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.log_time = time.time()<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rset = select.select(&#91;self.udpfd, self.tfd&#93;, &#91;&#93;, &#91;&#93;, 1)&#91;0&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for r in rset:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if r == self.tfd:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if DEBUG: os.write(1, &quot;&gt;&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data = os.read(self.tfd, MTU)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if MODE == 1: # Server<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;src, dst = data&#91;16:20&#93;, data&#91;20:24&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for key in self.clients:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if dst == self.clients&#91;key&#93;&#91;&quot;localIPn&quot;&#93;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.udpfd.sendto(data, key)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Remove timeout clients<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curTime = time.time()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for key in self.clients.keys():<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if curTime - self.clients&#91;key&#93;&#91;&quot;aliveTime&quot;&#93; &gt; TIMEOUT:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Remove timeout client&quot;, key<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;del self.clients&#91;key&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else: # Client<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.udpfd.sendto(data, (IP, PORT))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif r == self.udpfd:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if DEBUG: os.write(1, &quot;&lt;&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data, src = self.udpfd.recvfrom(BUFFER_SIZE)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if MODE == 1: # Server<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key = src<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if key not in self.clients:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# New client comes<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if data.startswith(&quot;LOGIN:&quot;) and data.split(&quot;:&quot;)&#91;1&#93;==SHARED_PASSWORD:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;localIP = data.split(&quot;:&quot;)&#91;2&#93;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.clients&#91;key&#93; = &#123;&quot;aliveTime&quot;: time.time(),<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;localIPn&quot;: socket.inet_aton(localIP)&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;New Client from&quot;, src, &quot;request IP&quot;, localIP<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.udpfd.sendto(&quot;LOGIN:SUCCESS&quot;, src)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;except:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Need valid password from&quot;, src<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.udpfd.sendto(&quot;LOGIN:PASSWORD&quot;, src)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# Simply write the packet to local or forward them to other clients ???<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.write(self.tfd, data)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.clients&#91;key&#93;&#91;&quot;aliveTime&quot;&#93; = time.time()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else: # Client<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if data.startswith(&quot;LOGIN&quot;):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if data.endswith(&quot;PASSWORD&quot;):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.logged = False<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Need password to login!&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif data.endswith(&quot;SUCCESS&quot;):<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.logged = True<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.try_logins = 5<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Logged in server succefully!&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.write(self.tfd, data)<br/><br/>def usage(status = 0):<br/>&nbsp;&nbsp;&nbsp;&nbsp;print &quot;Usage: %s &#91;-s port&#124;-c serverip&#93; &#91;-hd&#93; &#91;-l localip&#93;&quot; % (sys.argv&#91;0&#93;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;sys.exit(status)<br/><br/>def on_exit(no, info):<br/>&nbsp;&nbsp;&nbsp;&nbsp;raise Exception(&quot;TERM signal caught!&quot;)<br/><br/>if __name__==&quot;__main__&quot;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;opts = getopt.getopt(sys.argv&#91;1:&#93;,&quot;s:c:l:hd&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;for opt,optarg in opts&#91;0&#93;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if opt == &quot;-h&quot;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usage()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif opt == &quot;-d&quot;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DEBUG += 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif opt == &quot;-s&quot;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODE = 1<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORT = int(optarg)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif opt == &quot;-c&quot;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MODE = 2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IP, PORT = optarg.split(&quot;,&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IP = socket.gethostbyname(IP)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORT = int(PORT)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elif opt == &quot;-l&quot;:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IFACE_IP = optarg<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;if MODE == 0 or PORT == 0:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;usage(1)<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;tun = Tunnel()<br/>&nbsp;&nbsp;&nbsp;&nbsp;tun.create()<br/>&nbsp;&nbsp;&nbsp;&nbsp;tun.config(IFACE_IP)<br/>&nbsp;&nbsp;&nbsp;&nbsp;signal.signal(signal.SIGTERM, on_exit)<br/>&nbsp;&nbsp;&nbsp;&nbsp;tun.config_routes()<br/>&nbsp;&nbsp;&nbsp;&nbsp;try:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tun.run()<br/>&nbsp;&nbsp;&nbsp;&nbsp;except KeyboardInterrupt:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pass<br/>&nbsp;&nbsp;&nbsp;&nbsp;except:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print traceback.format_exc()<br/>&nbsp;&nbsp;&nbsp;&nbsp;finally:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tun.restore_routes()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tun.close()<br/></div><br/>Tags - <a href="http://zhoujin.com/tags/python/" rel="tag">python</a> , <a href="http://zhoujin.com/tags/%25E7%25BF%25BB%25E5%25A2%2599/" rel="tag">翻墙</a> , <a href="http://zhoujin.com/tags/%25E4%25BB%25A3%25E7%2590%2586/" rel="tag">代理</a> , <a href="http://zhoujin.com/tags/tup/" rel="tag">tup</a> , <a href="http://zhoujin.com/tags/vps/" rel="tag">vps</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/196/</link>
<title><![CDATA[韩寒：重庆美剧]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Fri, 10 Feb 2012 16:06:10 +0000</pubDate> 
<guid>http://zhoujin.com/post/196/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp; 昨天夜晚，相信很多网友和我一样，拼命刷屏人民网。我估计这是人民网第一次迎接来这么多真正的人民。刷屏的目的只为了三个字：王立军。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;宫廷大戏一出，我这样的民间闹剧就相形见绌了。在这次闹剧中，由于我猪一样的发挥，深感愧对观众。没有想到王立军出现了，而主人公又去了美国领事馆，这就是美剧了。再次回头看看自己扮演的国产连续剧，真的太小儿科了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;这又让我突然想到了常年在各个县城参加拉力赛发车时的情景。因为我是种子车手，所以都是县里的领导给我发车，但到了第二年，主持人喊着一样的头衔，出现的却是不一样的脸。发车过程结束以后，伴随着主持人的一句“请领导下台”，我注视领导的背影，感慨万千。当然这其中有升迁的有被栽的，而重庆具体发生了什么，在这种政治八卦里，我们终究是看不清楚的。大陆消息深藏不露，人民网不仁，我就只能顺着小道一路攀爬，拼凑出了个大概。在这个过程里，我顺入了王立军同志的内心，得出了一个字：累。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;中国的官员本身就是极其分裂的，他们上午进会场，晚上进会所，一方面要学习和领会六十年代风格的文件，一方面又要在互联网上仔细分辨微博和QQ的区别，而他们在批评美国的同时也要精确地知道美领馆的位置。在这里，你读不懂中国。我由衷地替他们觉得辛苦。今天只是跟了一个晚上的重庆美剧，过程跌宕起伏，消息层出不穷，连我都觉得需要休假式治疗了，何况当事人王立军，估计已经休克了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;所以我不明白，中国的官员们究竟是怎么想的。很多人都想当官，这是肯定的，尤其是当了大官，想做生意的时候根本不用像吴英那样自己想办法筹钱，最后还换个死刑，只需要安排一个亲属，垄断一块资源，致电一下银行。官员做到了一定的程度，上上下下都不是我们普通人可以理解的。因为上海大火而辞职的官员很快就可以去新疆当官，好在不是被派往克拉玛依。今天能调动舆论机构的，明天就成负面新闻，今天能开动国家机器的，明天就被国家机器带走。对于官员，大家已经不再用腐败和清廉来形容了，只有得势和失宠。而大家也不知道重庆将要发生些什么，尽管这个城市刚刚去香港唱过红，而在此之前，香港人只听过张国荣唱的《红》。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;这次的扑朔迷离，让我知道未来的中国，其实不需要预想一个什么颜色，红也好，蓝也好，都抵不过透明。<br/>PS:原站已经被和谐了<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a> , <a href="http://zhoujin.com/tags/%25E7%258E%258B%25E7%25AB%258B%25E5%2586%259B/" rel="tag">王立军</a> , <a href="http://zhoujin.com/tags/%25E7%25BE%258E%25E5%2589%25A7/" rel="tag">美剧</a> , <a href="http://zhoujin.com/tags/%25E5%25AE%2598%25E5%2591%2598/" rel="tag">官员</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/the-broken-window-again/</link>
<title><![CDATA[再谈破窗户]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Mon, 06 Feb 2012 12:22:11 +0000</pubDate> 
<guid>http://zhoujin.com/the-broken-window-again/</guid> 
<description>
<![CDATA[ 
	破窗户理论大家耳熟能详。身处一个相当糟糕的环境中的时候，如果恶得不到制止，那么恶就会蔓延；如果善得不到赞扬，善也就没有容身之处。这里要说的，却依然是该死的Windows.<br/><br/>Windows 7据媒体声称好了不止一点两点。我也愚蠢的购买了正版。平心而论Windows 7本身还是不错的。然而中文Windows世界长久依赖的混乱，并没有在新版本的到来显得更加和谐一些。各式的应用程序争先恐后的向你炫耀着他们的存在，各式的中文网站则更加火爆的挑战着底线。他们不是流氓软件，他们只是在玻璃渣满地的环境中寻思着下一个能敲的东西。只要是个程序，就恨不得待在右下角状态栏开机就待着，伺机干点什么。<br/><br/>搜狗输入法——一个输入法你开什么新闻窗口啊？还把“不再显示”的那个选择框弄那么小？QQ——安装之后你就不能不推销你的电脑管家？捆绑金山毒霸你也说一声啊？至于迅雷、PPS之类，弹出窗口、换皮肤、常驻右下角，时不时给你弹出个小泡泡说你的机器超过了全国多少多少的机器之类，无法一一而足。<br/><br/>我几乎不用Windows——除了每个月还房贷的时候需要登录网银。每次使用Windows的时候这种愤怒油然而生。可以说这不是Windows的问题，是应用程序的问题——但这种视用户注意力如粪土的破窗户到底从何而生呢？<br/><br/>回到Mac。Mac上几乎不存在打扰你的软件。我正在使用的搜狗输入法Mac版本，没见弹出该死的新闻窗口；偶尔使用的QQ，也没有滴滴滴闹心的声音。甚至我现在正在使用的OmmWriter软件，恨不得把自己藏起来，让你全心的写作。到底是什么，让这些原本鲁莽的流氓斯文起来了？<br/><br/>当衣冠不整进入窗明几净的大厅，人们会自惭形秽；而夹着拖板进入人声鼎沸的集贸市场，对周围的环境自然甘之如饴。Apple（或者说乔布斯）刻意营造出来的这种干净整齐的环境，是一种隐含的暗示：那些糟糕的应用程序，走开吧，这里只接受高质量！<br/><br/>我无数的嘲笑Android手机，及其生态系统。在Android Market中，粗制滥造的程序占据了绝大多数。嵌入的广告也粗鄙不堪。然而Google并不在意。他并不像如同图书馆长一般，建立独一无二的秩序，产生高质量的应用。相比Facebook，人人网显得如同一个乱糟糟的海鲜市场，不合时宜的动画，无处不在的广告，低劣的开发文档，注定了高质量的应用不会出现在这个平台上。<br/><br/>现在已经搞不清楚Windows或者Android秩序的破坏初因何在。但如今平台创建者对敲破玻璃者的姑息引发了更大范围的生态质量的降低。因此，当你创建了一个应用程序，特别是一个某种平台性质的系统，创建只是一小步。要让这个平台成为没有破窗户的完美环境，还有很多的工作。化学中有熵增大原理，生活中，事情也总是在朝混乱方向发展。要想让一件事情自始而终，偏执，近乎信仰的坚持才行。有了乔布斯近乎变态的坚持，才有今天的苹果公司；基于类似的原因，才有了路易斯的《Wired》杂志。<br/><br/>最后突然记起来<a href="http://v.youku.com/v_show/id_XMjgzMTQzNDY0.html" target="_blank">乔布斯与比尔盖茨唯一的一次电视谈话</a>。最后盖茨由衷的说：我希望拥有乔布斯的品味。而这种品味，是许多人所缺乏的。<br/>Tags - <a href="http://zhoujin.com/tags/windows/" rel="tag">windows</a> , <a href="http://zhoujin.com/tags/mac/" rel="tag">mac</a> , <a href="http://zhoujin.com/tags/android/" rel="tag">android</a> , <a href="http://zhoujin.com/tags/%25E7%25B2%2597%25E5%2588%25B6%25E6%25BB%25A5%25E9%2580%25A0/" rel="tag">粗制滥造</a> , <a href="http://zhoujin.com/tags/%25E5%2593%2581%25E5%2591%25B3/" rel="tag">品味</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/194/</link>
<title><![CDATA[恢复Revue固件的方法]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[GOOGLETV]]></category>
<pubDate>Fri, 03 Feb 2012 02:22:22 +0000</pubDate> 
<guid>http://zhoujin.com/post/194/</guid> 
<description>
<![CDATA[ 
	下面的方法要求你在电脑上安装了adb（Android SDK中）。<br/><br/><br/>步骤一：下载Recovery.img(<a href="http://www.kuaipan.cn/index.php?ac=file&oid=15142109065520984" target="_blank">地址</a>)<br/>步骤二：获取到 Revue的ip地址 ，方法是在Revue上：settings->network->status中<br/>步骤三：开启 adbd，方法是settings->applications->development，选择 "Remote Debugging".<br/>步骤四：将你的计算机的地址添加到revue中，这样你的计算机才能连接到revue。方法是：settings->applications->development<br/>步骤五：用以下命令，连接到Revue：<br/>adb connect <步骤二看到的Revue地址><br/><br/>步骤六：以root方式重启adbd:<br/>adb root<br/>步骤七：重新连接revue：<br/>adb connect <步骤二看到的Revue地址><br/>步骤八：<br/>adb push recovery.img /tmp/recovery.img<br/>adb shell flash_image recovery /tmp/recovery.img<br/><br/>成功后将看到如下输出：<br/><br/>mtd: successfully wrote block at 0<br/>mtd: successfully wrote block at 40000<br/>mtd: successfully wrote block at 80000<br/>mtd: successfully wrote block at c0000<br/>mtd: successfully wrote block at 100000<br/>mtd: successfully wrote block at 140000<br/>mtd: successfully wrote block at 180000<br/>mtd: successfully wrote block at 1c0000<br/>mtd: successfully wrote block at 200000<br/>mtd: successfully wrote block at 240000<br/>mtd: successfully wrote block at 280000<br/>mtd: successfully wrote block at 2c0000<br/>mtd: successfully wrote block at 300000<br/>mtd: successfully wrote block at 340000<br/>mtd: successfully wrote block at 380000<br/>mtd: successfully wrote block at 3c0000<br/>mtd: successfully wrote block at 400000<br/>mtd: successfully wrote block at 440000<br/>mtd: successfully wrote block at 480000<br/>mtd: successfully wrote block at 4c0000<br/>mtd: successfully wrote block at 500000<br/>mtd: successfully wrote block at 540000<br/>mtd: successfully wrote block at 580000<br/>mtd: successfully wrote block at 5c0000<br/>mtd: successfully wrote block at 600000<br/>mtd: successfully wrote block at 0<br/><br/>如果连接不上，则需要重新刷一下新版本的固件.此固件放在快盘上：<a href="http://www.kuaipan.cn/index.php?ac=file&oid=15142109065520985" target="_blank">下载</a><br/>Tags - <a href="http://zhoujin.com/tags/google/" rel="tag">google</a> , <a href="http://zhoujin.com/tags/tv/" rel="tag">tv</a> , <a href="http://zhoujin.com/tags/revue/" rel="tag">revue</a> , <a href="http://zhoujin.com/tags/%25E5%259B%25BA%25E4%25BB%25B6/" rel="tag">固件</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/193/</link>
<title><![CDATA[愿世上所有的疯狗都安息。]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Wed, 01 Feb 2012 03:22:48 +0000</pubDate> 
<guid>http://zhoujin.com/post/193/</guid> 
<description>
<![CDATA[ 
	一月底的成都，春寒料峭。我悠长的假期已经接近尾声。<br/><br/>这些天微博上热热闹闹的事，本来一直没想插嘴。一是深知人在江湖飘，哪能不挨刀。老韩少年成名，早经历无数腥风血雨，这事对他不算大事。二是我这人很不擅长与人打笔仗，怕一张嘴，立刻有人上来讲：你丫是不是想趁机炒作，吧啦吧啦~~~讲一大堆，我便灰头土脸败下阵来。但今日看到老韩居然拿出了手稿以及韩父晒出的家书，心里很不是滋味，这都什么世道呢， 一个作家好不容易写了书，好不容易出了书，好不容易卖得好，现在，还得好不容易证明那些字是自己写的，这叫哪门子事！<br/><br/>回想一下，十四岁的时候，我爱上了写作。上课写，下课写，有时间写，没时间挤时间写。我纯朴的爸爸妈妈总是苦口婆心地对我说，你别以为你写的东西可以发表，发表要靠什么——关系！但是，毫无关系的我第一次投稿就顺利地发表了，因为没有投稿经验，地址电话也没留，稿子发出来，我才看见。那篇作品给我赚了一大笔钱（三百多块，当时我爸一个月工资不到一百元）不说，从此开启了我的创作道路 。我收到的读者来信，是用麻袋拖回家的，那个编辑，叫顾宪漠，那本杂志，名叫《少年文艺》（江苏版）。他们给我这个无名小辈的肯定和待遇，都让我觉得我已经是如日中天的大作家了。如果没有遇见顾老师，如果没有遇见《少年文艺》，我很难去想像，今天的我会是什么样。<br/><br/>大学毕业后，因为一次机缘，在少年文艺当时的主编章文焙老师的力荐下，我去《少年文艺》做了编辑。负责的栏目，正是让当年的我走上文学之路的“少年创作之页”。我去的时候，因为没有编辑负责，这个栏目已经差不多要停办，读者的来信和作者的来稿，堆在编辑部的角落，无人问津。韩寒的稿子，就是从这一堆信中翻出来的。首先吸引我的，是他的字，非常漂亮，工整。（韩父晒的家书可作证）。然后就是他的稿子，文笔很特别，与众不同。透着一股少年特有的机灵劲儿。由于年代久远，我早就不记得那稿子的名称了，据他后来在《零下一度》里写的，说是他的处女作。 我应该还发了他另外的一些短篇，也应该给他写过一两封信，除此之外，我们彼此并无任何联系，没有打过电话，更没有见过面。我当编辑的时间很短，只有半年。后来，我调回镇江电台工作，依依不舍地离开了这个岗位。但在这期间，我最看好的少年作家有两个，除了韩寒，还有一个是女生，叫李静睿，微博上她叫阿花的伊萨卡岛。她也是自贡人，爸爸是作家李开杰，曾经写过一篇我的报告文学，也是发表在少年文艺上。但我发表静睿的小说与他父亲是完全没有关系的，因为她之前一直不想让她父亲知道她写作，而我夸她写得比她父亲要好得多的时候，她父亲也明显不信。令我感到非常可惜的是，静睿并没有以写作为生 ，她选择了记者这个职业，尽管干得风声水起，也不能填补我心里的空白和遗憾。<br/><br/>还好，有韩寒。我对他的了解很少，也不知道他父亲是谁。但他让我骄傲，也让我们的杂志《少年文艺》深感骄傲。<br/><br/>时间过得很快。很多年以后，我在路金波的办公室和韩寒偶遇。那是我们的第一次见面。他很高兴地跟我握手，过了一会儿，又过来再握了一次。那一次，他替我的作品《离歌》拍摄MTV。拍摄地点是在他的家乡，他说找了很多地儿，还是发现那里最美。我去探班的时候，他给我定了宾馆里最大最豪华的那个套间让我住，给我的小跟班，他的小粉丝秦猫猫夹菜。态度亲和，毫无架子。也是那一次，他跟我咨询到做杂志的事情。他总觉得，让读者反复花钱买他写的字不太好，我说，我的影响力不够，所以杂志一直做不好，你跟我不一样，你如果愿意做，可能会给很多新人机会，让他们出来，青春文学不能就这几个人在写。你想一想，当年的《少年文艺》。<br/><br/>他说，我想想。<br/><br/>后来，他果然推了杂志，但他的杂志我和的杂志最终的命运，都很让人郁闷，我不想多谈。<br/><br/>我写离歌的时候，他应该是在写《他的国》（也有可能是一座城池，我记不太清了）。那时候我们都在老路那里出书，计划的出版档期也一样，路金波纸也准备好了，印厂也准备好了。就差我们的稿子。责编吴叔叔急得像热锅上的蚂蚁。我是个拖进度大王，觉得挺对不起老路。韩寒偶尔爬上MSN，我便问他写得如何，很好，他比我还要懒，每次发来的稿子都比上一次长不了多少。终于有两次稍微写得快些，我夸他，他诚实地说：“不努力不行，卡上只有三千块。”<br/><br/>想想，如果有团队，何至于此？<br/><br/>那些叫叫嚷嚷的人，其实你们根本不懂，文学创作不是吵架，它肯定是一个人的事，我写作已经近三十年，之前写的很多东西，很多句子，其实我自己早就不记得了。我十四岁的时候写不出四十岁的东西，四十岁的时候也写不出十四岁的感觉。我当时懂的，现在已经模糊，现在明白的，当时也许一窍不通。一个创作者，他写的是文学作品又不是科普论文，他只要把他的人物写活了，故事写好看了，它写的句子别人愿意读，读了开心，喜欢，他就成功了。他又不是百科全书，凭什么他什么都要知道？！我写作的时候遇到不懂的东西就百度，用起来顺手得很。有些东西你现在在问我，我肯定不记得，那你是不是就说我找人“代笔”的呢？更有甚者，脑子残到要把韩寒关起来写三天，看看他是不是真有才！你以为写作是唱卡拉OK吗，大家来评定是不是唱上去了，音色是不是优美？还是当写作是技工作模具，做完后比一比到底是谁做得更合格，更标准？！<br/><br/>一边去吧，我只能说，不要再用你的无知来挑战我的忍耐极限了。<br/><br/>我希望这件事情就此打住。因为，如果再继续下去，这不仅是对韩寒一个人的侮辱，也是所有写作者的侮辱。在这个美好的新春佳节，一个作家，本来可以陪老婆聊聊天，陪女儿晒晒太阳，睡睡懒觉，打打麻将，享受一下美好的生活。却不得不花这些精力，来对付那些不停地扑上来要咬他一口的疯狗。我更为担心的是，这件事，会不会从些给韩寒和其它的年轻的写作者心里加上阴影，这些事，我不太了解，这个人，我不认识，我是不是不能在我的作品里提及，不然，会很容易被骂“代笔”哦。<br/><br/>从去年开始做出版人，我的公司出版了很多的好书，但是，销量都平平。我在等一个新的韩寒，等了很多年，一直没有等到。这个世界从来都不少疯狗，但是我们只有一个韩寒。请爱护，请珍惜，请信任，请尊重。<br/><br/>原这世上所有的疯狗都安息。<br/><br/><br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a> , <a href="http://zhoujin.com/tags/%25E7%2596%25AF%25E7%258B%2597/" rel="tag">疯狗</a> , <a href="http://zhoujin.com/tags/%25E5%2586%2599%25E4%25BD%259C/" rel="tag">写作</a> , <a href="http://zhoujin.com/tags/%25E6%259D%2582%25E5%25BF%2597/" rel="tag">杂志</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/192/</link>
<title><![CDATA[王晓阳：打倒韩寒咱就能出头]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Mon, 30 Jan 2012 05:45:22 +0000</pubDate> 
<guid>http://zhoujin.com/post/192/</guid> 
<description>
<![CDATA[ 
	我很感谢这个国家在这种时局下能出来一个韩寒。但是有人不这么认为。<br/><br/>最近，韩寒被某些人围攻了。麦田首义，方舟子接力。总设计师说的好，这场风波是迟早要来的，晚来不如早来。文章写那么好也就算了，赛车也开那么好，人还长得挺帅，这也太让别人讨厌了，嫉妒了。所以，如果有人上去踹他两脚，肯定有人叫好。能趁乱上去加踹两脚，也是一些人愿意做的。如果能把韩寒踹趴下，那更是要欢呼的。<br/><br/>韩寒的文章是否团队所做，我根本不关心。毛泽东选集中的文章是谁写的？胡主席的新年贺词是谁写的？美国总统那让人激动万分的就职文章是谁写的？2000年陈水扁的就职演讲，2012年蔡英文的败选演讲……辩曰：“政治家可以找人代笔，作家不可以”。好的。<br/><br/>那么，梁效是谁？辩曰：“那是文革”。好的。<br/><br/>那么，著名5毛染香是谁？辩曰：“那是5毛，不是人”。好的。<br/><br/>说来说去，不就是说你韩寒不能找人代笔吗？好，可以，拿出证据来。<br/><br/>所谓怀疑韩寒文章是别人代笔，尽管那些人挖空心思找到一个又一个细节，但是他们无法否认，支持他们论据的，一直是那句“韩寒这么年轻不可能写出那么好的文章”。看看方舟子那凑出来的所谓质疑吧，他自己不觉得太牵强、太丢人吗？论点、论据都来自猜测与妄想，还自称是“质疑”。如果这叫质疑，那只能说文化大革命就是好。<br/><br/>退1万步说，就算韩寒文章是团队所做，也无法否认那是好文章，那些文章对当今中国的启蒙起了巨大的作用。而那些怀疑者，他们又做了什么？<br/><br/>当然，假如真的是代笔而韩寒没有承认，那就是他的不对。可问题是：说来说去，这还是假设呀。<br/><br/>韩寒无须自证清白。道理很简单，公民无罪推定。看了他们的所谓质疑，发现里面全是猜测，嘛价值没有。然而韩寒还是出来为自己辩解了。又是拿女儿赌咒，又是悬赏2000万，有点过了，太抬举方舟子之流了。<br/><br/>韩寒也解释了他为什么要反驳：“走在路上好好的，被人泼了一脸粪，我抹了几下，还有人说我擦粪的动作不够优雅，不够从容，不如泼粪的那人镇定自若。于是泼粪有理，辩解有罪，污蔑是一种质疑精神，不辟谣是心虚，辟谣是不淡定，愤怒是失态，凶手不继续泼粪就是风度……”。所以，他的辩解也算有点必要。<br/><br/>我希望韩寒能做到如他所说的那样：感谢所有恨我的人，你们让我充满了动力，我会飞出你们的射程。你们朝天泼粪，只会掉到你们自己脸上。在你们的视线里，只能看到我羽翼的光芒。<br/><br/>某朋友给我留言：对你力挺韩寒，很是不解。韩寒现象只要我们有起码的智商，就会看出里面很多的常识解释不清楚的地方。且不说韩寒的文章是不是他爸爸写的，即使是韩寒自己写的，韩寒的文章有什么与众不同的深刻之处呢？我看他的文章的思想价值比你的文章还差一截子呢！<br/><br/>我回答：论起深刻，韩寒比我差远了。但是，论起传播功效，我不及韩寒万分之一。<br/><br/>该朋友说：所以韩寒就是一个成功的策划样板！他的倒掉我看对于我们真正在写东西的是一个好消息。<br/><br/>我回答：也有可能唇亡齿寒。<br/><br/>很好，打倒了韩寒，咱就能出头了。这个想法不错，等我写完这篇挺韩的，明天我就加入倒韩那一派，使劲踹，把这个韩寒踹趴下。然后咱们这些人再互相争，互相踹，看谁跑得快——怎么越看越像是一群流氓打架呢。<br/><br/>任何人都可以被批评，谁都有权批韩寒。但是，你不能用妄想去批，用猜测去污损对方。<br/><br/>对方舟子之流，我一向厌恶。按理说此人和我是同道，都是打假人士。可我们打假的目标完全不同。中国造假，制度使然。几乎人人造假，你我都非无辜。王思想打假，打的是公权力造假，打的是制度之假。方舟子打假，打的是私权利。方舟子很聪明，他不打权贵，不打屁民，专打那些有名并且无权的人。决然不去打制度之假，这就是方舟子秘籍。<br/>我发了条微博：【韩寒与方舟子的本质区别】韩寒质疑公权力，方舟子则专门挑剔名人的私权利。前者有风险，后者没有风险并且还假装一副正义面孔。<br/><br/>其实，这也是我们众多人与方舟子的本质区别。<br/><br/>我总是像个祥林嫂似的重复那个观点：对公权力要尽量苛刻，对私权利要尽量宽容。不惮以最大的恶意揣测利益集团，同时，尽量以最大的善意去理解私权利。<br/><br/>我一贯批判方舟子“打苍蝇不打老虎”，“打名人专挑没权的”。有朋友说：方舟子有权打苍蝇，打名人。我说：是的，他有权利挑软柿子。他这种小骂大帮忙，是有深刻历史传统的，房玄龄、纪晓岚、包青天，都这德行，深得朝廷欢心。<br/>Tags - <a href="http://zhoujin.com/tags/%25E6%2596%25B9%25E8%2588%259F%25E5%25AD%2590/" rel="tag">方舟子</a> , <a href="http://zhoujin.com/tags/%25E7%258E%258B%25E6%2599%2593%25E9%2598%25B3/" rel="tag">王晓阳</a> , <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/190/</link>
<title><![CDATA[与你相逢]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Fri, 06 Jan 2012 06:47:06 +0000</pubDate> 
<guid>http://zhoujin.com/post/190/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;与你相逢<br/>&nbsp;&nbsp;&nbsp;&nbsp;缘自那萧瑟的秋风<br/>&nbsp;&nbsp;&nbsp;&nbsp;古老的银杏下<br/>&nbsp;&nbsp;&nbsp;&nbsp;凝着我最初的感动<br/>&nbsp;&nbsp;&nbsp;&nbsp;你明媚的笑容<br/>&nbsp;&nbsp;&nbsp;&nbsp;深印在我脑海之中<br/>&nbsp;&nbsp;&nbsp;&nbsp;银杏下的你<br/>&nbsp;&nbsp;&nbsp;&nbsp;象个天使让我怦然心动<br/>&nbsp;&nbsp;&nbsp;&nbsp;也许你未曾察觉<br/>&nbsp;&nbsp;&nbsp;&nbsp;身边男孩的一帘幽梦<br/>&nbsp;&nbsp;&nbsp;&nbsp;也许我已陷入<br/>&nbsp;&nbsp;&nbsp;&nbsp;那相思的无底深洞<br/>&nbsp;&nbsp;&nbsp;&nbsp;拣起一片银杏<br/>&nbsp;&nbsp;&nbsp;&nbsp;想借一阵清风<br/>&nbsp;&nbsp;&nbsp;&nbsp;送入你的手中<br/>&nbsp;&nbsp;&nbsp;&nbsp;换你淡淡一笑<br/>&nbsp;&nbsp;&nbsp;&nbsp;足以将世上寒冰<br/>&nbsp;&nbsp;&nbsp;&nbsp;通通解冻<br/>&nbsp;&nbsp;&nbsp;&nbsp;但你终无视的走过<br/>&nbsp;&nbsp;&nbsp;&nbsp;将那片银杏留在风中<br/>&nbsp;&nbsp;&nbsp;&nbsp;只为我留下一片<br/>&nbsp;&nbsp;&nbsp;&nbsp;空空的烟雨蒙蒙
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/188/</link>
<title><![CDATA[易中天：韩寒的新衣]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Sat, 31 Dec 2011 03:15:26 +0000</pubDate> 
<guid>http://zhoujin.com/post/188/</guid> 
<description>
<![CDATA[ 
	没想到韩寒这么“不厚道”。大过年的，说人家穿的是“皇帝的新衣”，而且他说的还不是皇帝。这就难免让某些先生不快，也必定让某些伙计窃喜。其实窃喜是昏了头，或自作多情。不快者，则半因误读，半是活该。也就是说，喜欢和不喜欢韩寒《谈革命》、《说民主》的，其实有不少人是没看懂。<br/><br/>没看懂而窃喜的，就不说了。被误伤，则因为概念不明确。这怪不得韩寒，因为大家都不明确。比如把作家、学者、知识分子等文化人，统称为“文人”，就其实不对。这一坨人，实际差别大了去，应细分为士人、学人、诗人、文人，等等。但这种分类，与职业无关，只关乎心性。士人的特点，是有风骨、有气节、有担当。学人和诗人，则或者有真学问，或者有真性情。文人呢？只有腔调，没有学养；只有欲望，没有理想；只有风向，没有信仰。所以，他们也“只有姿态，没有立场”。尽管那姿态，往往会秀得“绚丽多彩”。<br/><br/>因此，文人是一定要走台的。走台，就得着装，而且得是时装。至于面料款式，则因时因人而异。想讨好卖乖，就唱“吾皇万岁”；想浑水摸鱼，就喊“造反有理”。昨天刚闹过革命，今天就可以劝进；力倡科学民主的，摇身一变就是“国学大师”。总之，什么时髦就来什么，怎么有利就怎么做。反正对于他们，“为民请命”和“含泪劝告”没有本质区别，都不过一种姿态，只看“画眉深浅入时无”。<br/><br/>韩寒反对的“中国式领袖”，往往就是这类人。什么“民主”，什么“革命”，只不过他们的时装。我是不相信这帮家伙的。革命成功了，他们是洪秀全；失败了，他们是向忠发（此人为中共叛徒，被捕后的表现，还不如做他情人的妓女杨秀贞）。只不过，向忠发多半成不了气候，成功了的必定是洪秀全。当然，他们更喜欢管自己叫“哈维尔”。<br/><br/>这就是我要力挺韩寒的原因，或原因之一。但有几句话，还得说清楚。第一，我警惕的，只是自命为“哈维尔”的“洪秀全”。如果真能出个“哈维尔”，我也不反对，只是不作指望。第二，喊着哈维尔，想着洪秀全的，必定是文人，不会是其他，请不要胡乱对号入座。第三，话说到这个份上，如果还有谁被韩寒气炸了肺，我愿诚恳地表示幸灾乐祸！<br/><br/>当然，还有几句话，也得说清楚。第一，革命在本质上，是制度的根本变革。所以，辛亥革命是革命，改革开放也是革命。这样的革命，我们都赞成，反对的只是暴力。第二，国民素质不能成为反对民主的理由。恰恰相反，国民素质越是低，就越需要民主。因为只有民主，才能提高国民素质。专制的结果，只能是国民素质更低。只不过，在国民素质不高的情况下，我们的期望值也不能太高。第三，革命也好，民主也罢，决不能依靠那些“走台的文人”。不信你看那个白衣秀士王伦，才当了个山大王，就容不得林冲了。因此我赞成韩寒的话：革命不保证就能带来民主。我还要补充一句：真民主一定容得下反革命。容不容得“反革命”，是真假民主的分水岭！<br/><br/>另外，为了不让脑残犯糊涂，五毛钻空子，我还愿意耐心说明：一，革命不保证就能带来民主，不等于说“革命一定不能带来民主”，更不等于说不需要改革开放这样的革命。恰恰相反，没有这样的革命，就一定不会有民主。二，真民主一定容得下反革命，不等于说你可以杀人放火打砸抢。对不起，那叫“刑事犯罪”，不叫“反革命”。<br/><br/>我的话，说得够通俗明白了吧？<br/><br/>最后要说的是：指责韩寒“读书少，学术差，不专业”，是很无聊的。你读书多，你学术好，你非常专业，咋说不出韩寒这样有分量的话？相反，正因为韩寒“读书少，学术差，不专业”，他才用不着硬要找件时装披在身上。他的新衣就是什么都不穿，坦然地裸露出自己的真实。当然，也就他能这样。我要跟着学，那会影响市容的。<br/><br/>原以为2011乏善可陈，但有了“韩寒的新衣”，我们好过年了。<br/>Tags - <a href="http://zhoujin.com/tags/%25E6%25B0%2591%25E4%25B8%25BB/" rel="tag">民主</a> , <a href="http://zhoujin.com/tags/%25E9%259D%25A9%25E5%2591%25BD/" rel="tag">革命</a> , <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/183/</link>
<title><![CDATA[喜欢不完美的韩寒]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Tue, 27 Dec 2011 10:26:30 +0000</pubDate> 
<guid>http://zhoujin.com/post/183/</guid> 
<description>
<![CDATA[ 
	首先就冲一点，谁能振臂一呼，把自己懂的或者不懂的全抛出来，让这个国家的知识分子一起来关注并在网络平台上讨论那么敏感的问题，除了韩寒还有谁？？先支持韩寒！<br/><br/>韩寒谈革命那篇文章，有一个硬伤，就是以中国历代专制史里的革命教训来对比今天，但是，今天中国所要求的革命以及革命后的气象，不是简单的改朝换代，而是迎接一个新纪元、新制度的到来。错把今天的革命看成通常的改朝换代，是很多伪小资以及无知女人的通病，用他们的话说，谁当皇帝还不是一样嘛，换了新政府上去，还不是照样腐败？总之差不多是这种认知水平。但这些都不是那么重要，韩寒连发了三篇文章，我只是大概挑选一些地方来罗列一下：<br/><br/>1 他把民主跟自由对立起来了<br/><br/>2 韩寒对群众的觉悟和群众的力量认识不够深群众真会因为你害他们上不了几天微博而恨你吗？不会的。<br/><br/>3 改良主义从来都不错，但是要看社会积怨跟群众的承受力。<br/><br/>4 普遍的阶级压迫才能够带来阶级意识的觉醒。韩寒能感觉得到那种压迫，但在程度上他的感受还不够深。我以前举过例子，那些小贩和拿不到薪水过年的民工是最有反抗性的，尽管他们不敏感。与觉悟无关，因为他们伤得最深。<br/><br/>5 我不想说“小资”这个词，但是从心理分析，韩寒最新这篇文章多少让人感觉了一些衣食无忧和政府高压带来的一些焦虑，这篇文章其实也是他给自己的一个出口，可以是很多种意义上的。<br/><br/>6 很多时候，人们私底下讨论的革命，早就不是什么均贫富的低级论调，也不是无政府主义，而是渴望建立一种新的政治、文化等秩序。<br/><br/>7 真正有理想的人一定要坚定地站在民意的前面引导，而不是指责、甚至诋毁他们。底层人的素质问题经常被提到，但是不管他们是怎么样的一群人，都最终要成为新制度的获益人。没有人是天生的“低级人”，恰恰相反，所谓愚昧无知的底层人正是专制和欺骗造成的。给人民自由，让人民接受教育，他们就能成长，而不是说你必须达到什么样的素质你才配有自由。<br/><br/>8，你可以说目前人手一人一选票有难度，但是你不能说这个东西没有意义。不是每个人都需要精通民主的内核的，也就是说，从来民意商家都不敢期望消费者都是产品方面的专家，但是你还是要卖，而且不能强卖！<br/><br/>总之，按照韩寒的意思，如果上面对改革暂无意向，而我们民众的素质还那么低，我们现在所能做的就是静观其变。这是他这篇文章的观点，这个是我绝对不能认可的。<br/><br/>他原来写那些讨伐式的檄文，让人觉得针锋相对，酣畅淋漓。但是他这两篇文章题目的论调太大，以他的能力他已经驾驭不过来，破绽很多，他写这两篇恰恰暴露了他专业水平上的不足，认识的高度在什么地方就会找什么样的事实来作为论据。比如说这段：“文人到时候就应该扮演一颗墙头草，但必须是一颗反向墙头草。文人需有自己的正义，但不能有自己的站位。越有影响力就越不能有立场”。。。我们可以回想若干年前民主党派的站队，胡适就是一个很有坚持的人，辜鸿铭也是，林语堂也是。。。。他们很早就看透某些政治的发展带来的后果。让一个政党壮大不是靠文人的站队来决定的，每个政党都有自己的政治纲领，治国方针，要靠政党自己的行为来树立自己的威信和口碑。韩寒的东西有时会迎合了小资，和那些误以为自己是小资的人。<br/><br/>为什么要上街头呢？如果潮州那种东西一带动，各地都这样，经过你的住所，你上街头吗？我这么讲可能有些隐晦的投机在里面，其实只是需要个机会，这个机会不是凭空等的，至少要意识得到到你在用你的方式欢迎。这个世界上的独裁国家还有几个？这个不叫外力作用，是一种席卷性的洋流，换句话说就是重新洗牌。某个显眼的标志性建筑换照片的事情是不可能存在的——当年辛亥革命胜利了，旧官僚拿根竹竿捅破屋顶示意一下也算革命了，然后抢走胜利果实——一场运动势必会带来一种思潮，而且这种思潮很有杀伤力，那种火焰要用几代人的时间才能把表面熄掉，而当今有良知的公知们都算是幸存的火苗。革命这个词是个中性词，我也不会刻意褒奖它。革命产生暴君，暴君产生革命——这种现象在当今世界已经不会存在了，这点我很乐观。政治上的高压势必随着政坛的波动而松懈，在他们内部同样会有诉求，他们的诉求也会爆发，比如当权的发现某个群体事件不能血洗，而且附近也有近似的群体事件，于是终究有了个态度来面对此事，这种事情肯定会影响到高层的博弈和政局的胶着，但是，只要有一个缺口，就很难再回头。客观的说，任何的变革都不是“润物细无声”的，天鹅绒之前的68年有过布拉格之春，而1968年以前一直有别的动作，也就是说，改良不是纯粹的，其中必然夹杂着正义或非正义的暴力。<br/><br/>到目前，我相信韩寒的人格，我还是他的忠实粉丝。中国的读者分很多层次，先把一批人带到他那个层次绝对是好事，一个班上，差生也要有人帮补课的，被韩寒影响仍是当今中国一件进步的事。对于这几篇新的两篇文章，且不论他观点的对错，关注的人越多、讨论的人越多，绝对是一件好事。也只有韩寒，把自己懂的或者不懂的全抛出来让这个国家的公共知识分子一起来关注并讨论那么敏感而又重大的问题，起了一个抛砖引玉的作用，而喜欢韩寒的读者会跟着他的名字读到很多评论他的文章。一些不负责任的媒体想趁机拉拢或是利用韩寒来混淆视听，他们是不会成功的。有人觉得是不是韩寒的脊梁软了？恰恰相反，我觉得他豁出去了。。<br/><br/>对他的一些看法我也会提出一些质疑，现在网络众说纷纭，但是对韩寒，这个年轻人，比我小几岁却一直走在我前面启蒙我并让我经常在他的文字里得到快乐的人，我要表达一种深深的敬意。他不能提供政见，他能开启民智，他不是时评大家，他是常识天才，他不是资深学者，他是个热血公民。一块石头的棱角磨得圆些，就能滚得更远，能压死更多老鼠和蟑螂。<br/><br/>一如既往地喜欢并不完美的韩寒！<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a> , <a href="http://zhoujin.com/tags/%25E8%2587%25AA%25E7%2594%25B1/" rel="tag">自由</a> , <a href="http://zhoujin.com/tags/%25E6%25B0%2591%25E4%25B8%25BB/" rel="tag">民主</a> , <a href="http://zhoujin.com/tags/%25E6%2595%2599%25E8%2582%25B2/" rel="tag">教育</a> , <a href="http://zhoujin.com/tags/%25E7%2594%259F%25E6%25B4%25BB/" rel="tag">生活</a> , <a href="http://zhoujin.com/tags/%25E7%2590%2586%25E6%2583%25B3/" rel="tag">理想</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/182/</link>
<title><![CDATA[要自由]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Tue, 27 Dec 2011 05:36:55 +0000</pubDate> 
<guid>http://zhoujin.com/post/182/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上上篇文章里说，每个人要的自由是不一样的，上篇文章里说，民主，法制，就是一个讨价还价的过程。圣诞再打折，东西还是不会白送的。那我就先开始讨价还价了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先，作为一个文化人，在新的一年里，我要求更自由的创作。我一直没有将这个写成XX自由或者XX自由，是因为这两个词会让你们下意识的觉得害怕和提防。虽然这些自由一直被写在宪法里。事实上，它一直没有被很好的执行。顺便我也替我的同行朋友——媒体人们要一些新闻的自由。新闻一直被管制的很严。还有我的拍电影的朋友们，你不能理解他们的痛苦。大家都像探雷一样进行文艺工作，触雷就炸死，不触雷的全都走的又慢又歪。这些自由是时代的所趋，也是你们曾经的承诺。我知道你们一定对苏共进行过研究，你们认为苏共的失败，很大的程度源于戈尔巴乔夫开放了报禁，并将最高权力依照宪法约定，从党返还给了人民代表大会。所以这让你们对言论自由和宪政特别的谨慎。但是时代已经不同，现代的资讯传播终于让屏蔽形同虚设。而文化的限制却让中国始终难以出现影响世界的文字和电影，使我们这些文化人抬不起头来。同时，中国也没有在世界上有影响力的媒体——很多东西并不是钱可以买来的。文化繁荣其实是最省钱的，管制越少必然越繁荣。如果你们坚持说，中国的文化是没有管制的，那就太不诚恳了。所以在新的一年，我恳请官方为文化，出版，新闻，电影松绑。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如能达成，从我而言，我承诺，在文化环境更自由之后：不清算，向前看，不谈其在执政史上的敏感事件，不谈及或评判高层集团的家族或者相关利益，只对当下社会进行评判和讨论。如果文化界和官方能各让一步，互相遵循一个约定的底线，换取各自更大空间，那便更好。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是如果两三年以后，情况一直没有改善，在每一届的作协或者文联全国大会时，我将都亲临现场或门口，进行旁听和抗议。蚍蜉撼树，不足挂齿，力量渺小，仅能如此。当然，只我一人，没有同伴，也不煽动读者。我不会用他人的前途来美化我自己的履历。同样，我相信我们这一代人的品质，所以我相信这些迟早会到来，我只是希望它早些到来。因为我觉得我还能写的更好，我不想等到老，所以请让我赶上。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上是基于我的专业领域的个人诉求。我觉得在这场让大家都获益良多的讨论里，研究该是什么样，不如想想应该怎么办。据说一个人一次只能许一个愿望，我的愿望用完了，其他的诸如公平，正义，司法，政改，一切一切，有需要的朋友可以再提。虽然我觉得自由未必是很多人的第一追求，但没有人愿意常常感觉恐惧不安。愿各位没钱的能在一个公正的环境里变有钱，有钱的不再为了光有钱而依然觉得低外国人一等。愿所有的年轻人都能像这个圣诞一样不畏惧讨论革命，改革和民主，担忧国家的前途，视它为自己的手足。政治不是肮脏的，政治不是无趣的，政治不是危险的。危险的，无趣的，肮脏的政治都不是真正的政治。中药，火药，丝绸，熊猫不能为我们赢得荣誉，县长太太买一百个路易威登不能为民族赢得尊敬。愿执政党阔步向前，可以名垂在不光由你们自己编写的历史上。<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a> , <a href="http://zhoujin.com/tags/%25E6%25B0%2591%25E4%25B8%25BB/" rel="tag">民主</a> , <a href="http://zhoujin.com/tags/%25E6%25B3%2595%25E5%2588%25B6/" rel="tag">法制</a> , <a href="http://zhoujin.com/tags/%25E8%2587%25AA%25E7%2594%25B1/" rel="tag">自由</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/181/</link>
<title><![CDATA[说民主]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Sat, 24 Dec 2011 05:31:25 +0000</pubDate> 
<guid>http://zhoujin.com/post/181/</guid> 
<description>
<![CDATA[ 
	问：革命不一定是暴力革命，天鹅绒革命就是完美的典范。<br/><br/>回答：我不认为天鹅绒革命能够发生在中国。不谈当时的国际局势，也不说整个捷克的人口只有北京的一半。相信天鹅绒革命其实就是选择相信了民众的素质，执政者的忍让，文人的领袖，这三者的共力才能形成天鹅绒革命，我认为这三者在中国全部不存在。你不能把一场完美的革命常挂在嘴边来反驳也许未来不完美的改革。我理解中国很多文人和学者对天鹅绒革命的感情，他们甚至能够在脑海中将自己代入哈维尔的角色暗自感动。但无论中国发生暴力革命或者非暴力革命，文人所处的地位和角色远远比他们想象的要低得多，更别说能作为领袖了。而且国民素质越低，文人就越什么都不是。你也不能用完美的民主，完美的自由，完美的人权从字面上解释应该什么样子的来逃避中国的现实。改革和民主其实就是一场讨价还价的过程，你不能盼着执政者看了几本书忽然感化把东西全送给你。你不能天天盼着天鹅绒革命，再由你来扮演哈维尔，并瞬间让每个中国人有一张选票，还都不能被贿选。捷克至今也不是普选。所以我的观点很简单，暴力革命我们都不愿意发生，天鹅绒革命不可能在近期的中国发生，完美民主不可能在中国出现，所以我们只能一点一点追求，否则在书房里空想民主和自由憋爆了自己也没有意思，改良是现在最好的出路。<br/><br/>问：你得出的结论就是中国人素质太低，不适合民主。政府有没有给你维稳的回扣啊？<br/><br/>回答：我不知道你如何看出了这个结论，我觉得我已经写的很通俗了。民主不是适合不适合的事情，它迟早会到来。国民素质低并不妨碍民主的到来，但决定了它到来以后的质量，谁都不希望来个卢旺达式的民主，虽然这并不是真正广义的民主。有时候缓缓来，有时候突然来。也许它来的不那么彻底，来的不那么全部，来的不那么美式，来的不那么欧式，但在你的余生里，它一定回来，回首起来，可能还来的有点平淡。<br/><br/><br/>问：你的意思是一切只能靠执政者的恩赐，而不是人民自己的争取？<br/><br/>回答：给执政者压力当然重要，但遗憾的是，执政者的配合更重要。这的确需要运气和人品。现在社会各个阶层是割裂的，比如执政者，你动车事件闹得再大，他们依然淡定，觉得这是民间的事情，不费一兵一卒，时间自动摆平，执政者的家属可能完全不关心这事，只关心谁要上谁要下，谁的岁数差一点，XX位置怎么排。而在这样的舆论压力下，事情依然能自然过去。当然，更有可能是他们都没有感受到舆论压力。好比你账户里有十亿，你丢了一千块，你自然不紧张。文化界兜里加起来的总和就五百，而他们认为统治者兜里也就三千，所以我觉得他们是放大的统治者的焦虑。人家完全没考虑你的问题。而文化界很多人认为一切的问题就是体制的问题，仿佛改了体制一切都迎刃而解，他们虽然善良正义，嫉恶如仇，但要求农民和工人和他们拥有一样的认知，甚至认为全天下都必须这么思考问题。可事实往往有些让人寒心。<br/>因为拉力赛都在偏远地方举行，我这些年去了上百个各种各样的县城，这些都不算特别封闭和贫瘠的地方，我和各种各样的人聊天，他们普遍对民主和自由的追求不如文化界想象的那么迫切，他们对强权和腐败的痛恨更多源于为什么不是我自己或者我的亲戚得到了这一切，而不是如何去限制和监督，只有倒霉到自己头上需要上访的时候才会从词典里捡起这些词汇来保护自己，只要政府给他们补足了钱，他们就满意了。一切能用钱解决的社会矛盾都不算什么矛盾。而知识界普遍把国民对这些词汇的这种应急应用当成了他们的普遍诉求，觉得与文化界形成了共识。我不认为在分歧和割裂这么大的国家里能有一场美好的革命。你也许觉得这正是执政者驯化的结果，所以要改变执政者。但现实就已经这样了，那一两代人已经这样了。但是幸运的是，我和他们的子女聊天时，互联网和各种传媒已经或多或少的打开了他们的眼界。所以我并不悲观。<br/><br/>中国共产党到了今天，有了八千万党员，三亿的亲属关系，它已经不能简单的被认为是一个党派或者阶层了。所以共产党的缺点很多时候其实就是人民的缺点。我认为极其强大的一党制其实就等于是无党制，因为党组织庞大到了一定的程度，它就是人民本身，而人民就是体制本身，所以问题并不是要把共产党给怎么怎么样，共产党只是一个名称，体制只是一个名称。改变了人民，就是改变了一切。所以更要着眼改良。法治，教育，文化才是根基。<br/><br/>问：如果革命到来，有影响力的文人应该扮演什么角色？<br/><br/>回答：文人到时候就应该扮演一颗墙头草，但必须是一颗反向墙头草。文人需有自己的正义，但不能有自己的站位。越有影响力就越不能有立场，眼看一派强 大了，就必须马上转向另一派，绝对不能相信任何的主张，不能跟随任何的信仰，要把所有的革命者全都假想成骗子，不听任何承诺，想尽办法确保不能让一方消灭 其他方而独大。所以未来的中国如果有革命，谁弱小，我就在那里，它若强大了，我就去它对手那里。我愿牺牲自己的观点而争取各派的同存。只有这样，才有你追求的一切。<br/><br/>补加一个问答，关于素质和民主：问：我去了一些发达国家，我发现在表面的素质之下，其实深交下去，人性也都是这样的，所以好的制度才是高素质的保障。<br/><br/>回答：我完全的赞同。但我们说的就是表面素质，不要因为觉得人私底下都是怎么怎么样的而小看表面素质。民主的质量就是由国民的表面素质决定的。一个人开车可能关远光灯，看见人彬彬有礼，遵守社会功德，但一交往，发现其实也是自私懦弱狭隘贪婪……这又如何呢。素质和人性放在一起谈没有意思，美国人的人性和中国人的人性说到底当然是大同小异的，全世界人类的人性都差不多。所以这里就有一个鸡和蛋的问题，先有好的素质，再有好的制度，还是先有好的制度，再有好的素质。其实这个没有疑问，在能出现好的制度的时候，无论素质的好坏，都应该保障好的制度，因为好的制度恒久远，一颗永流传，制度有实在的，素质是空幻的。问题是，当好的制度由于种种原因迟迟不能到来的时候。咱不能天天期盼从天上掉下来一个好的制度，然后一切才有开始的可能和动力，否则反正好的素质也没必要，又缓慢又不见得有效……好的制度以及好的民主有两个到来方式，一种是有一个纪念日，一种是没有一个具体的日子，但要一两代人的努力。我觉得还是要实际一些，美国的独立宣言再好，美国的宪法再好，美国的宪法修正案再好，是因为他们的政党和人民都做到了。我们宪法其实也好，我们的执政党说过不少只比独立宣言好不比独立宣言差的宣言，但大多数没做到。他们是不会看着各种宣言而自省的，革命代价又太大太不可控，改良又慢又拖延，国民素质又不高，的确看着像死结。但我依然选择相信改良。暴力或者非暴力革命只能是督促改良的筹码，但不能也不肯能真正的操作起来。<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a> , <a href="http://zhoujin.com/tags/%25E9%259D%25A9%25E5%2591%25BD/" rel="tag">革命</a> , <a href="http://zhoujin.com/tags/%25E6%25B0%2591%25E4%25B8%25BB/" rel="tag">民主</a> , <a href="http://zhoujin.com/tags/%25E6%2589%25A7%25E6%2594%25BF%25E8%2580%2585/" rel="tag">执政者</a> , <a href="http://zhoujin.com/tags/%25E4%25BA%25BA%25E6%25B0%2591/" rel="tag">人民</a> , <a href="http://zhoujin.com/tags/%25E8%2587%25AA%25E7%2594%25B1/" rel="tag">自由</a> , <a href="http://zhoujin.com/tags/%25E5%2586%259C%25E6%25B0%2591/" rel="tag">农民</a> , <a href="http://zhoujin.com/tags/%25E5%25B7%25A5%25E4%25BA%25BA/" rel="tag">工人</a> , <a href="http://zhoujin.com/tags/%25E5%258E%258B%25E5%258A%259B/" rel="tag">压力</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/180/</link>
<title><![CDATA[谈革命]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Fri, 23 Dec 2011 05:29:27 +0000</pubDate> 
<guid>http://zhoujin.com/post/180/</guid> 
<description>
<![CDATA[ 
	最近翻看了很多问题，革命和改革两个词被频频的问起。平时媒体也很喜欢问，但是也只是一问一听，无法见诸报端。写下来无论什么观点，八成也是不保的命。但作为这次冬至回读者问的第一篇，我就先用整个篇幅来回答我关于革命两个字的看法。我综合了读者和一些内外媒的提问，在这里一并作答。<br/><br/>问：中国最近群体事件频出，你认为中国需要一场革命么。<br/><br/>回答：在社会构成越复杂的国家，尤其是东方国家，革命的最终收获者一定是心狠手辣者。很坦率的说，革命是一个听上去非常爽快激昂并且似乎很立竿见影的词汇， 但是革命与中国未必是好的选择。。首先，革命需要有一个诉求，诉求一般总是以反腐败为开始。但这个诉求坚持不了多远。“自由”或者“公正”又是没有市场的， 因为除了一些文艺和新闻的从业者，你走上街去问大部分人，你自由么，他们普遍觉得自由。问他们需要公正么，他们普遍认为不公正的事情只要别发生在我自己身 上就可以了，不是每个人都经常遭受不公待遇，所以为他人寻求公正和自由不会引发人们的认同。在中国是很难找到这样一个集体诉求的。这不是需要不需要的问题，是可能不可能有的问题。我的观点是不可能也不需要。但如果你问我中国需要更有力的改革么，我说一定是的。<br/><br/>问：你为什么不去领导一场起义呢？<br/>回答：开玩笑，就算我认同革命，并在上海起义，而且还稍具规模，官方只要一掐断互联网和手机讯号，我估计不用政府维稳机器出马，那些无法用QQ聊天或者玩不了网络游戏看不了连续剧的愤怒群众就足以将我们扑灭，你也别指望着能刷微博支援我，你三天上不了微博就该恨我了。<br/><br/>问：那难道中国就不需要民主与自由了么？<br/>回答：这是一个误区，文化人普遍将民主与自由联系在一起，其实对于国人，民主带来的结果往往是不自由。因为大部分国人眼中的自由，与出版，新闻，文艺，言 论，选举，政治都没有关系，而是公共道德上的自由，比如说没有什么社会关系的人，能自由的喧哗，自由的过马路，自由的吐痰，稍微有点社会关系的人，我可以 自由的违章，自由的钻各种法律法规的漏洞，自由的胡作非为，所以，好的民主必然带来社会进步，更加法制，这势必让大部分并不在乎文化自由的人们觉得有些不 自由，就像很多中国人去了欧美发达国家觉得浑身不自在一样。所以，民主和自由未必要联系在一起说，我认为中国人对自由有着自己独特的定义，而自由在中国最 没有感染力。<br/><br/>问：我认为中国顽疾太深，改革已经没有用了，只有来一场革命才能让社会好转。<br/><br/>回答：我们假设革命没有遭到镇压，当然这本身就是不可能的。我们幻想一下革命，假设，革命到了中段，学生，群众，社会精英，知识分子，农民，工人，肯定不 能达成共识。而我们一直忽略了一个人群，那就是贫困人口，这个数目大概是两亿五千万。你平时都不能注意有他们的存在，因为他们甚至从来不使用互联网。既然 革命能够发展到中段，必然已经诞生了新的领袖。没有领袖的革命一定是失败的，白莲教起义就是很好的例子，而有了领袖的革命，也不一定好到哪里去，太平天国 又是很好的例子。中国式的领袖，绝对不会是你现在坐在电脑前能想象的那些温厚仁慈者。这样的一个领袖，八成独断专横自私狂妄狠毒又有煽动力，是的，听着有 点耳熟。但中国人就吃这一套，也只有这一套才能往上爬，这个社会习惯了恶人当道，好人挨刀。文艺青年们看好的领袖一个礼拜估计就全给踢出局了。而越是教育 水平高的人，越不容易臣服与领袖。所以这些人肯定是最早从革命中离开的。随着社会精英的离开，革命人群的构成部分一定会产生变化，无论革命的起始口号有多 么好听，到最后一定又会变回一个字，钱。说的好听一点就是把应该属于我们的钱还给我们，说难听一点就是掠夺式的均富。你们不要以为因为我觉得自己有点钱， 所以我怂了，害怕失去。在革命的洪流里，你拥有一个苹果手机，你是开摩托车的，甚至你会上网，你平时买报纸，吃肯德基，你都算是有钱人，甚至是有能力在互联网上阅读到这篇文章的人，都是充满着原罪的 被革命对象。有一亿家产的人比起有一万家产的人反而安全，因为他们打开家门，门口已经放的是纽约时报了。最后倒霉的还是中产，准中产甚至准小康者。以前人 们在各种政治运动中自相残杀，现在的人们只认钱，所以很多人民已经被训练成只认钱的自相残杀者。所以你就想象吧。而中国人讲究清算，这也必然导致镇压。<br/><br/>任何的革命都需要时间，中国那么大的国家，不说天下大乱，军阀混战，权利真空。稍微乱个五年十年的，老百姓肯定会特别期盼出现一个铁腕独裁者，可以整治社会 秩序，收拾一下局面。至于从百花齐放重新看回人民日报，这个真的没所谓。况且我们的一切假设都建立在军队国家化的前提下，所以这些都是幻想，连幻想都不乐 观，就别提操作了。<br/><br/>问：那你看埃及，利比亚⋯⋯<br/><br/>回答：埃及，利比亚是被一个人独裁统治几十年，城市也不多，一个事件作为爆点，一个广场用来演讲，就可以革命 成功。中国没有一个具体的个人能成为被革命的对象，城市，人口众多，而且各种千奇百怪的灾难都发生过，G点已经麻木，更别提爆点了。就算社会矛盾再激烈十倍，给你十个哈维尔在十个城市一起演讲，再假设当局不管，最终这些演讲也是以被润喉糖企业冠名并登陆海淀剧院而告终。<br/><br/>当然，以上更是废话，最关键是就大部分中国人一副别人死绝不吭声，只有吃亏到自己头上才会嗷嗷叫的习性，一辈子都团结不起来。<br/><br/>问：你的观点非常的五毛党，是被政府买通了么？为什么不能一人一张选票选主席。<br/><br/>回答：在这样一个非此即彼，非黑就白，非对既错，非带路党既五毛党的社会里，革命两字说起来霸气，操作起来危害更大。也许很多人认为，中国的当务之急就是一人一张选票选主席，其实这并不是中国最大的急迫。相反，一人一张选票，最终的结果还是共产党代表获胜，谁能比党更有钱？五百亿就能买五亿张选票。不行加到五千亿。一年税收都十万亿呢。你和人家比有钱?你觉得你周围的朋友的公正独立，那样的人加起来也就几十万张选票。你看好的有识之士，能有十万张都不错了。唯一能和共产党抗衡的就是马化腾，因为他可以在QQ登陆的时候弹出一个窗口：谁选我马化腾，谁就可以得500Q币。此举估计也能获得两亿张选票。但问题是，到时候马化腾一定会入党的。民主是一个复杂，艰难而必然的社会历程，并不是什么革命，普选，多党制，推翻XX，这些脱口而出的简单词汇可以轻易达成的。如果你对司法和出版都从来没有关心过，你关心普选有什么意义呢。无非就是说起来更拉风一点。这和那些一说起赛车只会提F1，一说起足球只知道世界杯的人有什么区别呢。<br/><br/>问：我觉得中国的革命和民主只是时机的问题。你认为什么时机最合适。<br/><br/>回答：革命和民主是两个名词，这两个名词是完全不等同的，革命不保证就能带来民主，这个咱们不是早就已经证明过一次了嘛。历史曾经给过中国机会，如今的局面则是我们爷辈的选择。现今中国是世界上最不可能有革命的国家，同时中国也是世界上最急需要改革的国家。如果你硬要问我在中国，什么时候是个革命的好时机，我只能说，当街上的人开车交会时都能关掉远光灯了，就能放心革命了。<br/><br/>但这样的国家，也不需要任何的革命了，国民素质和教育水平到了那个份上，一切便都是自然而然的事情了。也许你能活着看见这个国家的伟大变革，也许你至死都是这个死结里缠绕的纤维，但无论如何，你要永远记得，错车时请关掉远光灯，也许我们的儿女将因此更早的获得我们的父辈所追求的一切。<br/><br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;冬至回读者问之一，完。<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259D%25A9%25E5%2591%25BD/" rel="tag">革命</a> , <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a> , <a href="http://zhoujin.com/tags/%25E8%2587%25AA%25E7%2594%25B1/" rel="tag">自由</a> , <a href="http://zhoujin.com/tags/%25E6%25B0%2591%25E4%25B8%25BB/" rel="tag">民主</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/176/</link>
<title><![CDATA[韩寒：格调不高怎么办]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Thu, 03 Nov 2011 01:30:14 +0000</pubDate> 
<guid>http://zhoujin.com/post/176/</guid> 
<description>
<![CDATA[ 
	自从《脱节的国度》不见了以后，一直都未写东西。因为我着实是一个写的不勤奋的人，每次写完，隔日不见，真的扫兴，而且国家部门繁多，就算宣传部门和新闻出版部门觉得没问题，所有配备了帕萨特以上公务车的部门也都可以一个电话把你文章删了。其中最仁慈的反而是某地方的公安部门，08年有一天我写了一篇文章，事隔一年多，他们删除了这篇文章。难怪大家都说公安出警慢。没错。删文章的地方太多了，就不知道该怎么下笔了。<br/> <br/>从事了这个工作大概十三年，我发现文化工作者在地位上真是一个特别下三滥特别窝囊废的工种。这个工种所出产的作品由于受到诸多的限制，所以肯定没有那么奇特的经历更加精彩。我来说一些小故事。<br/> <br/>在中国的出版行业，其实是没有官方的审查的。大家都应该觉得很奇怪，因为这违背了常识。但是可以告诉大家，出版行业的确没有审查。这是因为中国每年要出几十万本书，实在审查不过来。而且我相信管那些读书人的同志大部分都不爱读书，所以图书审查其实一直由出版社独立完成。<br/> <br/>但是这样一来岂不是百花齐放了。当然不是。比较专业的说，这叫事后审查制。事后审查制其实要比事前审查制更加紧，杀伤力和副作用更大。这点用过事后避孕药的朋友肯定深有感触。<br/> <br/>只有拥有书号才能出版，只有出版社才能发书号，只有官方才能有出版社，所以从源头上，自由的出版其实是不可能的。而由于大量的国有出版社能力不济，很多民营文化公司开始运营图书出版。出版的方式就是合作出版或者从出版社那里购买一些书号。但这依然不能改变出版现状，因为出版社依然是终审方。而一本书如果不让出版，在以往理由是反革命，后来反革命这个词不太出现了，因为反革命既然是不好的，那岂不成了鼓励革命。而官方认为，革命工作已经完成，所以既不能反革命，也不能革命，群众最好的生活方式就是呆着。于是现在不能出版的理由就是格调不高。我第一本书《三重门》就是因为格调不高，迟迟不能出版。格调不高是致命的，因为文笔太差可以改，逻辑不清可以理，唯独格调不高让人头疼，你也不知道怎么能让自己的格调提高一点。你问他什么是格调，他也不知道。一直到现在，我才明白了，格调其实就是割掉的意思，格调不高就是割掉的不够高，你以为象征性的把脚底板的老茧磨磨平就能从事文化行业了么，你要割掉的够高。凡是保留腰以下部分的，从事文化行业明显还是会显得雄性气息太浓厚。<br/> <br/>我是一直饱受审查之苦的。但在格调稍微高了一点以后，我还是侥幸可以出版图书，并且因为图书的畅销，有的时候还稍微可以在小问题和出版方争取格调稍微降低一点。每次写作前，我都要进行一次自我审查。也许很多没有从事过这个行业的朋友会觉得我们这样做特别怂，不够MAN。比如当年《独唱团》出版前遇到很多的困难，一些朋友看不下去了，说你太娘们了，这要是我，不要书号了，直接拿到印刷厂去，印个几十万本，这就开卖了。我欣赏这位朋友的没有格调，但他们不知道印刷厂只有收到了出版社开具的委托印刷单以后才能开机印刷，否则你非但印不了一本，人家就报警了。其次就算你爹开了一个印刷厂，你印刷出了几十万本，你没有书号，就没有一家书店和报刊亭是会进你的货的。连卖盗版的都不敢帮你卖。也许这位朋友会说，那我就放到网上去，在淘宝卖。那我告诉你，在淘宝销售图书，首先你得拥有资质，其次你不能随手拍一个封面就上架了，你必须输入书号，当系统把你输入的书号和书名对应起来，你才能上架。<br/> <br/>所以一直到今天，所有的文化人都在进行着痛苦的自我审查。那我们能否指望出版社突然格调降低呢，这当然也不可能，一旦出版社有格调降低的迹象，由于都是国有单位，官方再指派一个社长过去就是。而那些格调降低的同志就可以去妇联残联养养老。事后审查制最恐怖一环在于惩罚，就是我不管你，但你要是出版了什么幺蛾子，我罚死你。轻则撤职撤社，重则投进大牢，所以你看着办吧。<br/> <br/> 至于我本人，虽然每一篇文章都经过了自我审查和阉割，但有的时候难免也会出现阉割的形状不符合认证的情况。这个和每个出版社的紧张程度有关系。比如我最新的小说就被枪毙了，因为新小说里的主人公姓胡，虽然我才写了五千字，但是出版社认为这必然是有政治隐喻的。当我明白了要避讳的时候再改姓已经晚了。但避讳要记住勿忘前朝，我还有一篇小说中，因为出现了“江河湖海”四个字，被更直接的枪毙了。如果说之前我犯了错误的话，那这一个就是两倍的错误。连我都不能原谅我自己，明知道惹不起，怎么连躲都没躲利索呢。<br/> <br/>我不知道一个文化人提笔就哆嗦的国家怎么能建设成文化强国，一个因为要避讳常委所以在谷歌上搜索不到李白的国家怎么能建设成文化强国。我不知道该怎么一个文化体制改革法，反正我只有一个愿望，就是韩正老师别再升官了，要不然我就搜不到你了。<br/> <br/> <br/> <br/>谨以此文纪念一期被停的《独唱团》以及两期被停的《大方》。<br/> <br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a> , <a href="http://zhoujin.com/tags/%25E6%25A0%25BC%25E8%25B0%2583/" rel="tag">格调</a> , <a href="http://zhoujin.com/tags/%25E5%2587%25BA%25E7%2589%2588/" rel="tag">出版</a> , <a href="http://zhoujin.com/tags/%25E6%2596%2587%25E5%258C%2596%25E5%2586%2599%25E4%25BD%259C/" rel="tag">文化写作</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/178/</link>
<title><![CDATA[gitconfig设置解决中文乱码]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[版本控制]]></category>
<pubDate>Wed, 12 Oct 2011 05:00:47 +0000</pubDate> 
<guid>http://zhoujin.com/post/178/</guid> 
<description>
<![CDATA[ 
	1. 中文乱码<br/>2. 图形化Diff/Merge<br/>3. 还原英文界面，更好懂<br/>看看gitconfig的内容(PS:是指全局gitconfig)先：<br/># 全局提交用户名与邮箱<br/><div class="code">git config --global user.name &quot;Yuchen Deng&quot;<br/>git config --global user.email 邮箱名@gmail.com</div><br/># 中文编码支持<br/><div class="code">git config --global gui.encoding utf-8<br/>git config --global i18n.commitencoding utf-8<br/>git config --global i18n.logoutputencoding gbk</div><br/># 全局编辑器，提交时将COMMIT_EDITMSG编码转换成UTF-8可避免乱码<br/><div class="code">git config --global core.editor &quot;&#92;&quot;D:&#92;program&#92;UltraEdit&#92;Uedit32.exe&#92;&quot;&quot;</div><br/># 差异工具配置<br/><div class="code">git config --global diff.external git-diff-wrapper.sh<br/>git config --global diff.tool tortoise<br/>git config --global difftool.tortoise.cmd &#039;TortoiseMerge -base:&quot;$LOCAL&quot; -theirs:&quot;$REMOTE&quot;&#039;<br/>git config --global difftool.prompt false</div><br/># 合并工具配置<br/><div class="code">git config --global merge.tool tortoise<br/>git config --global mergetool.tortoise.cmd &#039;TortoiseMerge -base:&quot;$BASE&quot; -theirs:&quot;$REMOTE&quot; -mine:&quot;$LOCAL&quot; -merged:&quot;$MERGED&quot;&#039;<br/>git config --global mergetool.prompt false</div><br/># 别名设置<br/><div class="code">git config --global alias.dt difftool<br/>git config --global alias.mt mergetool</div><br/># 取消 $ git gui 的中文界面，改用英文界面更易懂<br/><div class="code">if &#91; -f &quot;/share/git-gui/lib/msgs/zh_cn.msg&quot; &#93;; then<br/>rm /share/git-gui/lib/msgs/zh_cn.msg<br/>fi</div><br/>Tags - <a href="http://zhoujin.com/tags/git/" rel="tag">git</a> , <a href="http://zhoujin.com/tags/%25E4%25B9%25B1%25E7%25A0%2581/" rel="tag">乱码</a> , <a href="http://zhoujin.com/tags/config/" rel="tag">config</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/179/</link>
<title><![CDATA[Dont Hire B Player]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[项目管理]]></category>
<pubDate>Thu, 29 Sep 2011 07:35:44 +0000</pubDate> 
<guid>http://zhoujin.com/post/179/</guid> 
<description>
<![CDATA[ 
	按照贡献、能力、态度等维度的综合评价，如果将员工划分为ABC三等，毫无疑问，A Player是管理者无论如何都要留住的，他们理解公司的核心价值，对组织有着杰出的贡献；而C Player的存在显然只是为了公司的正常运营，他们很少追求职业上的发展，只是为了获得一份工作，很少做工作之外的事情。难以处理的是B Player. 他们表现各异，有些有着不那么出色的能力，却工作很卖力；有些能力出众却在职业态度上乏善可陈。从公司的主营业务上，B Player承担了事实上的大部分工作以及利润来源，从公司的日常活动上，随着在公司资历的提升，他们逐渐参与到公司日常的运作过程中，参与了招聘。<br/><br/>抛开能力上的差异，B Player最大的隐患在于，他们其中很少有人能够真正全心理解所在组织的正确做事方式，以及组织对人的综合要求。因此在特别是招聘、coach、共同做事这些与人相关的关键环节上，表现出的价值取向会一脉相承下去，于是B Player hire C Player, C Player hire D Player, 最终你得到一群Z Player。<br/><br/>有很多的资料谈到如何管理B Player。而大多关注于能力。对于越来越多的start up, 小团队，关注个体与协作效率逐渐成为主流，能力变得不那么重要。特别是对于计算机，有太多的开放免费的资源可供使用，只要投入足够的时间，在能力上完全可以胜任。组织开始花大量的时间关注B Player的时候，潜意识里将关注点从“挑战卓越”变成了“维护优秀”。这很难说不是一种妥协，这种妥协会让B Player更加安逸，C Player更为心安理得，而组织想留住的A Player更觉得失望。<br/><br/>对于依赖机构能力的企业，这并不是一个大问题。通过部门、分工、职位以及精心规划的职业路线，每一个新进的员工只需要按照预定义好的路线前进，在给定的工作时间内输出能用的工作成果即可。这种情况下，任何一种工作成果都可以被评估，接受并且妥协。然而随着第二次互联网创业浪潮的到来，受到影响的不仅仅是startup, 互联网公司，大型企业也逐渐倾向于采用协作更为紧密的小团队来完成工作。这种情况下，共同愿景驱动下的个人创造力显得更为重要。具备事实影响力但在态度上摇摆的B Player为这个团队带来出了平庸产品之外的伟大创新。<br/><br/>如前面所说，对B Player的妥协会影响A Player的表现。当组织花费大量的精力安抚B Player而不是鼓励A Player持续卓越表现的时候，A Player就得为B Player的不优秀买单。整个组织于是表现为平庸和死气沉沉。<br/><br/>以前并没有思考如此的深入。在组织快速发展的过程中，很难不为利润来源进行人员质量上的妥协。而这些带来的影响深远并且重大。与其在后期花费大量的时间进行培训、沟通，尝试将B Player转换为A Player, 不如索性放弃B Player的招聘，直接想办法继续提升A Player的表现，并持续提升整个组织的服务品质，最终达到真正令人向往的团队。从某种意义上说，对人员质量的不妥协也意味着高的准入门槛，那些缺乏热情、缺乏事实证据投入的应聘者，也需要静下来仔细考虑这是否是自己的职业，而非另外一份获得收入的工作。<br/>Tags - <a href="http://zhoujin.com/tags/%25E7%25BB%2584%25E7%25BB%2587/" rel="tag">组织</a> , <a href="http://zhoujin.com/tags/%25E8%2583%25BD%25E5%258A%259B/" rel="tag">能力</a> , <a href="http://zhoujin.com/tags/player/" rel="tag">player</a> , <a href="http://zhoujin.com/tags/%25E7%25AE%25A1%25E7%2590%2586/" rel="tag">管理</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/177/</link>
<title><![CDATA[Linux系统信息查看命令大全]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Thu, 22 Sep 2011 07:48:27 +0000</pubDate> 
<guid>http://zhoujin.com/post/177/</guid> 
<description>
<![CDATA[ 
	最近看了一些Linux命令行的文章，在系统信息查看方面学到不少命令。 想起以前写过的一篇其实Linux这样用更简单， 发现这些系统信息查看命令也可以总结出一篇小小的东西来了。<br/><br/>另外这里还有非常多的命令， 可以作为参考。<br/><br/>系统<br/><div class="code"># uname -a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查看内核/操作系统/CPU信息<br/># head -n 1 /etc/issue&nbsp;&nbsp; # 查看操作系统版本<br/># cat /proc/cpuinfo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看CPU信息<br/># hostname&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查看计算机名<br/># lspci -tv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 列出所有PCI设备<br/># lsusb -tv&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 列出所有USB设备<br/># lsmod&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 列出加载的内核模块<br/># env&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看环境变量</div><br/>资源<br/><div class="code"># free -m&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看内存使用量和交换区使用量<br/># df -h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看各分区使用情况<br/># du -sh &lt;目录名&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看指定目录的大小<br/># grep MemTotal /proc/meminfo&nbsp;&nbsp; # 查看内存总量<br/># grep MemFree /proc/meminfo&nbsp;&nbsp;&nbsp;&nbsp;# 查看空闲内存量<br/># uptime&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查看系统运行时间、用户数、负载<br/># cat /proc/loadavg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看系统负载</div><br/>磁盘和分区<br/><div class="code"># mount &amp;#124; column -t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看挂接的分区状态<br/># fdisk -l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查看所有分区<br/># swapon -s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看所有交换分区<br/># hdparm -i /dev/hda&nbsp;&nbsp;&nbsp;&nbsp; # 查看磁盘参数(仅适用于IDE设备)<br/># dmesg &amp;#124; grep IDE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查看启动时IDE设备检测状况</div><br/>网络<br/><div class="code"># ifconfig&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查看所有网络接口的属性<br/># iptables -L&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看防火墙设置<br/># route -n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查看路由表<br/># netstat -lntp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看所有监听端口<br/># netstat -antp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看所有已经建立的连接<br/># netstat -s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查看网络统计信息</div><br/>进程<br/><div class="code"># ps -ef&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查看所有进程<br/># top&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 实时显示进程状态</div><br/>用户<br/><div class="code"> w&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看活动用户<br/># id &lt;用户名&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看指定用户信息<br/># last&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查看用户登录日志<br/># cut -d: -f1 /etc/passwd&nbsp;&nbsp; # 查看系统所有用户<br/># cut -d: -f1 /etc/group&nbsp;&nbsp;&nbsp;&nbsp;# 查看系统所有组<br/># crontab -l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查看当前用户的计划任务</div><br/>服务<br/><div class="code"># chkconfig --list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 列出所有系统服务<br/># chkconfig --list &amp;#124; grep on&nbsp;&nbsp;&nbsp;&nbsp;# 列出所有启动的系统服务</div><br/>Tags - <a href="http://zhoujin.com/tags/linux/" rel="tag">linux</a> , <a href="http://zhoujin.com/tags/%25E5%2591%25BD%25E4%25BB%25A4/" rel="tag">命令</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/189/</link>
<title><![CDATA[Apache Rewrite伪静态规则转换为Nginx Rewrite]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Mon, 01 Aug 2011 05:35:47 +0000</pubDate> 
<guid>http://zhoujin.com/post/189/</guid> 
<description>
<![CDATA[ 
	以前介绍过Nginx的Rewrite配置这篇文章，今天无意间发现了，这个自动转换程序。<br/><br/><a href="http://www.anilcetin.com/convert-apache-htaccess-to-nginx/" target="_blank">http://www.anilcetin.com/convert-apache-htaccess-to-nginx/</a><br/><br/>此地址里面的内容包含可以完成上面说的略做修改的功能。自动把.htaccess中的规则转换成nginx下面可用的规则。<br/>很好用，推荐<br/>不过转换完成一般是保留rewrite部分.<br/>本站是这样的.<div class="code">if (!-f $request_filename) &#123;<br/>放rewrite部分<br/>&#125;<br/></div>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/191/</link>
<title><![CDATA[Maven常用命令]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[项目管理]]></category>
<pubDate>Thu, 14 Jul 2011 15:56:14 +0000</pubDate> 
<guid>http://zhoujin.com/post/191/</guid> 
<description>
<![CDATA[ 
	Maven常用命令Maven库：<a href="http://repo2.maven.org/maven2/" target="_blank">http://repo2.maven.org/maven2/</a><br/><br/>Maven依赖查询：<a href="http://mvnrepository.com/" target="_blank">http://mvnrepository.com/</a><br/><br/>Maven常用命令： <br/>1. 创建Maven的普通java项目： <br/>&nbsp;&nbsp; mvn archetype:create <br/>&nbsp;&nbsp; -DgroupId=packageName <br/>&nbsp;&nbsp; -DartifactId=projectName&nbsp;&nbsp;<br/>2. 创建Maven的Web项目：&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;mvn archetype:create <br/>&nbsp;&nbsp;&nbsp;&nbsp;-DgroupId=packageName&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;-DartifactId=webappName <br/>&nbsp;&nbsp;&nbsp;&nbsp;-DarchetypeArtifactId=maven-archetype-webapp<br/>3. 编译源代码： mvn compile <br/>4. 编译测试代码：mvn test-compile&nbsp;&nbsp;&nbsp;&nbsp;<br/>5. 运行测试：mvn test&nbsp;&nbsp; <br/>6. 产生site：mvn site&nbsp;&nbsp; <br/>7. 打包：mvn package&nbsp;&nbsp; <br/>8. 在本地Repository中安装jar：mvn install <br/>9. 清除产生的项目：mvn clean&nbsp;&nbsp; <br/> 10. 生成eclipse项目：mvn eclipse:eclipse&nbsp;&nbsp;<br/>11. 生成idea项目：mvn idea:idea&nbsp;&nbsp;<br/>12. 组合使用goal命令，如只打包不测试：mvn -Dtest package&nbsp;&nbsp; <br/>13. 编译测试的内容：mvn test-compile&nbsp;&nbsp;<br/>14. 只打jar包: mvn jar:jar&nbsp;&nbsp;<br/>15. 只测试而不编译，也不测试编译：mvn test -skipping compile -skipping test-compile <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;( -skipping 的灵活运用，当然也可以用于其他组合命令)&nbsp;&nbsp;<br/>16. 清除eclipse的一些系统设置:mvn eclipse:clean&nbsp;&nbsp;<br/><br/>ps： <br/><br/>一般使用情况是这样，首先通过cvs或svn下载代码到本机，然后执行mvn eclipse:eclipse生成ecllipse项目文件，然后导入到eclipse就行了；修改代码后执行mvn compile或mvn test检验，也可以下载eclipse的maven插件。 <br/><br/>mvn -version/-v&nbsp;&nbsp;显示版本信息 <br/>mvn archetype:generate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;创建mvn项目 <br/>mvn archetype:create -DgroupId=com.oreilly -DartifactId=my-app&nbsp;&nbsp; 创建mvn项目 <br/><br/>mvn package&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;生成target目录，编译、测试代码，生成测试报告，生成jar/war文件 <br/>mvn jetty:run&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运行项目于jetty上, <br/>mvn compile&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译 <br/>mvn test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译并测试 <br/>mvn clean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;清空生成的文件 <br/>mvn site&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;生成项目相关信息的网站 <br/>mvn -Dwtpversion=1.0 eclipse:eclipse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;生成Wtp插件的Web项目 <br/>mvn -Dwtpversion=1.0 eclipse:clean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;清除Eclipse项目的配置信息(Web项目) <br/>mvn eclipse:eclipse&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;将项目转化为Eclipse项目 <br/><br/>在应用程序用使用多个存储库 <br/><repositories>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<repository>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<id>Ibiblio</id>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<name>Ibiblio</name>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<url><a href="http://www.ibiblio.org/maven/" target="_blank">http://www.ibiblio.org/maven/</a></url>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;</repository>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<repository>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<id>PlanetMirror</id>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<name>Planet Mirror</name>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<url><a href="http://public.planetmirror.com/pub/maven/" target="_blank">http://public.planetmirror.com/pub/maven/</a></url>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;</repository>&nbsp;&nbsp;<br/></repositories> <br/><br/><br/>mvn deploy:deploy-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:&#92;client-0.1.0.jar -DrepositoryId=maven-repository-inner -Durl=ftp://xxxxxxx/opt/maven/repository/ <br/><br/><br/>发布第三方Jar到本地库中： <br/><br/>mvn install:install-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:&#92;client-0.1.0.jar <br/><br/><br/>-DdownloadSources=true <br/><br/>-DdownloadJavadocs=true <br/><br/>mvn -e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;显示详细错误 信息. <br/><br/>mvn validate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;验证工程是否正确，所有需要的资源是否可用。 <br/>mvn test-compile&nbsp;&nbsp;&nbsp;&nbsp;编译项目测试代码。 。 <br/>mvn integration-test&nbsp;&nbsp;&nbsp;&nbsp; 在集成测试可以运行的环境中处理和发布包。 <br/>mvn verify&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;运行任何检查，验证包是否有效且达到质量标准。&nbsp;&nbsp;&nbsp;&nbsp; <br/>mvn generate-sources&nbsp;&nbsp;&nbsp;&nbsp;产生应用需要的任何额外的源代码，如xdoclet。 <br/><br/>常用命令： <br/>mvn -v 显示版本 <br/>mvn help:describe -Dplugin=help 使用 help 插件的&nbsp;&nbsp;describe 目标来输出 Maven Help 插件的信息。 <br/>mvn help:describe -Dplugin=help -Dfull 使用Help 插件输出完整的带有参数的目标列 <br/>mvn help:describe -Dplugin=compiler -Dmojo=compile -Dfull 获取单个目标的信息,设置&nbsp;&nbsp;mojo 参数和&nbsp;&nbsp;plugin 参数。此命令列出了Compiler 插件的compile 目标的所有信息 <br/>mvn help:describe -Dplugin=exec -Dfull 列出所有 Maven Exec 插件可用的目标 <br/>mvn help:effective-pom 看这个“有效的 (effective)”POM，它暴露了 Maven的默认设置 <br/><br/>mvn archetype:create -DgroupId=org.sonatype.mavenbook.ch03 -DartifactId=simple -DpackageName=org.sonatype.mavenbook 创建Maven的普通java项目，在命令行使用Maven Archetype 插件 <br/>mvn exec:java -Dexec.mainClass=org.sonatype.mavenbook.weather.Main Exec 插件让我们能够在不往 classpath 载入适当的依赖的情况下，运行这个程序 <br/>mvn dependency:resolve 打印出已解决依赖的列表 <br/>mvn dependency:tree 打印整个依赖树 <br/><br/>mvn install -X 想要查看完整的依赖踪迹，包含那些因为冲突或者其它原因而被拒绝引入的构件，打开 Maven 的调试标记运行 <br/>mvn install -Dmaven.test.skip=true 给任何目标添加maven.test.skip 属性就能跳过测试 <br/>mvn install assembly:assembly 构建装配Maven Assembly 插件是一个用来创建你应用程序特有分发包的插件 <br/><br/>mvn jetty:run 调用 Jetty 插件的 Run 目标在 Jetty Servlet 容器中启动 web 应用 <br/>mvn compile 编译你的项目 <br/>mvn clean install 删除再编译 <br/><br/>mvn hibernate3:hbm2ddl 使用 Hibernate3 插件构造数据库<br/>Tags - <a href="http://zhoujin.com/tags/maven/" rel="tag">maven</a> , <a href="http://zhoujin.com/tags/%25E5%2591%25BD%25E4%25BB%25A4/" rel="tag">命令</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/187/</link>
<title><![CDATA[Ext.Ajax 对ajax的支持]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[EXTJS]]></category>
<pubDate>Thu, 07 Jul 2011 12:53:54 +0000</pubDate> 
<guid>http://zhoujin.com/post/187/</guid> 
<description>
<![CDATA[ 
	本篇主要介绍一下ExtJs常用的几个对JS语法的扩展支持，包括Ajax封装，函数事件操作封装，还有扩展的常用函数等。Ajax服务端交互式操作是提交到.NET MVC。后续服务端交互都采用这一方式实现。<br/>一、ExtJs中的Ajax：Ext.Ajax.request<br/><br/>通过客户端向服务端发送Ajax请求，可以“直接”调用MVC的action方法，并传递参数，action返回值可以是普通字符串，也可以是json对象。请求可以添加自定义头信息。看下面例子：<br/>1.异步请求，发送自定义请求头：<br/><br/>html页面如下<br/><div class="code">&lt;h1&gt;Ajax服务端请求&lt;/h1&gt;<br/>&lt;div class=&quot;content&quot; id=&quot;div1&quot;&gt;<br/>&lt;div&gt;一共发起了&lt;span id=&quot;span1&quot; style=&quot;color:Red&quot;&gt;0&lt;/span&gt;次请求。&lt;/div&gt;<br/>&lt;/div&gt;</div><br/>我们先通过一个按钮单击事件触发ajax请求，服务端返回string到客户端，异步请求时，为请求添加自定义头“userHeader”，并在服务端获取。如下是js代码：<br/><div class="code">Ext.onReady(function () &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;new Ext.Button(&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;renderTo: &quot;div1&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;text: &quot;后台Ajax提交&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handler: function () &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext.Ajax.request(&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;url: &#039;Ajax_Func1&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;headers: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#039;userHeader&#039;: &#039;userMsg&#039;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;params: &#123; a: 10, b: 20 &#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;method: &#039;GET&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;success: function (response, options) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext.MessageBox.alert(&#039;成功&#039;, &#039;从服务端获取结果: &#039; + response.responseText);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;failure: function (response, options) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext.MessageBox.alert(&#039;失败&#039;, &#039;请求超时或网络故障,错误编号：&#039; + response.status);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id: &quot;bt1&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;);<br/> <br/>&#125;);</div><br/><br/>Tags - <a href="http://zhoujin.com/tags/ajaxweb/" rel="tag">ajaxweb</a> , <a href="http://zhoujin.com/tags/extjs/" rel="tag">extjs</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/175/</link>
<title><![CDATA[gitweb的PHP版本]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[版本控制]]></category>
<pubDate>Wed, 15 Jun 2011 06:11:14 +0000</pubDate> 
<guid>http://zhoujin.com/post/175/</guid> 
<description>
<![CDATA[ 
	git官方的webgit适合apache+dav，用nginx配置麻烦（网上教程全部是 git + gitosis的，我不用gitosis）<br/><br/>一个多月前，找到了个纯php环境即可使用的gitweb<br/><br/>git php，（不是php-git，<a href="http://code.google.com/p/git-php/" target="_blank">http://code.google.com/p/git-php/</a>，这个已经不维护了的,使用作者自己代码库了)<br/><br/>这个作者很勤快<a href="http://gitphp.xiphux.com/" target="_blank">http://gitphp.xiphux.com/</a><br/><br/>纯php + nginx/fastcgi 就可以架<br/><br/>界面模仿git官方的webgit，用了一个多月了，很舒服<br/> <a href="http://xiphux.com/code/gitphp/gitphp-0.2.3.tar.bz2" target="_blank">目前最新版本为0.2.3</a><br/>Tags - <a href="http://zhoujin.com/tags/git/" rel="tag">git</a> , <a href="http://zhoujin.com/tags/web/" rel="tag">web</a> , <a href="http://zhoujin.com/tags/php/" rel="tag">php</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/173/</link>
<title><![CDATA[nginx gitweb配置]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[版本控制]]></category>
<pubDate>Tue, 14 Jun 2011 12:55:37 +0000</pubDate> 
<guid>http://zhoujin.com/post/173/</guid> 
<description>
<![CDATA[ 
	gitweb是git的web接口，使用单向的http协议来发布git repositories。<br/>安装<br/>sudo apt-get install gitweb<br/>配置<br/><br/>假定git repositories所在的目录为/opt/project/git，首先,把gitweb使用到的资源文件(图片和CSS)符号链接到此目录<br/>$cd&nbsp;&nbsp;/opt/project/git<br/>$ln -sf&nbsp;&nbsp;/usr/share/gitweb .<br/><br/>然后将gitweb主程序gitweb.cgi链接到git repositories目录<br/>$ln -sd /usr/lib/cgi-bin/gitweb.cgi gitweb.cgi<br/><br/>修改/etc/gitweb.conf文件中的$projectroot为/opt/project/git<br/><br/>最后是nginx virtualhost配置文件：<div class="code">server &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; listen&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;80;<br/>&nbsp;&nbsp;&nbsp;&nbsp; server_name git.freeoa.com;<br/>&nbsp;&nbsp;&nbsp;&nbsp; root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/opt/project/git;<br/>&nbsp;&nbsp;&nbsp;&nbsp; index&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gitweb.cgi;<br/>&nbsp;&nbsp;&nbsp;&nbsp; access_log&nbsp;&nbsp;off;<br/>&nbsp;&nbsp;&nbsp;&nbsp; include&nbsp;&nbsp;&nbsp;&nbsp; cgiwrap-fcgi.conf;<br/>&#125;</div><br/><br/>$sudo /etc/init.d/nginx resgtart<br/>Tags - <a href="http://zhoujin.com/tags/git/" rel="tag">git</a> , <a href="http://zhoujin.com/tags/gitweb/" rel="tag">gitweb</a> , <a href="http://zhoujin.com/tags/nginx/" rel="tag">nginx</a> , <a href="http://zhoujin.com/tags/fcgi/" rel="tag">fcgi</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/174/</link>
<title><![CDATA[配置nginx支持CGI程序]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Wed, 01 Jun 2011 13:07:05 +0000</pubDate> 
<guid>http://zhoujin.com/post/174/</guid> 
<description>
<![CDATA[ 
	nginx默认不支持传统的CGI程序,但是通过FCGI包装程序可以让nginx支持CGI<br/><br/>只要是符合FCGI接口的包装程序都可以用来使nginx支持CGI程序，有很多这样的程序,有perl写的，有C写的，也有C++写，等等。<br/><br/>nginx.org提供了一个perl包装程序,但没有提供system V风格的init文件，对这个程序稍加改造，然后写一个init控制文件就可以在ubuntu上使用了。<br/><br/>安装perl必要的支持库<br/>$sudo apt-get -y install libfcgi-perl libfcgi-procmanager-perl libio-all-perl<br/><br/><a href="attachment.php?fid=42">点击这里下载文件</a><br/>三个文件的打包下载以后，将cgiwrap-fcgi.pl拷贝到/usr/local/bin/目录下,将cgiwrap-fcgi拷贝到/etc/init.d/目录下，然后执行:<br/>$sudo update-rc.d cgiwrap-fcgi defaults<br/>更新/etc/rcX.d目录下的符号链接，这样debian启动时会自动启动cgiwrap-fcgi.pl程序<br/><br/>手动控制cgiwarp-fcgi.pl程序<br/><br/>$sudo /etc/init.d/cgiwrap-fcgi restart #重新启动<br/>$sudo /etc/init.d/cgiwrap-fcgi stop #停止<br/>$sudo /etc/init.d/cgiwrap-fcgi status #查看cgiwrap-fcgi的运行状态<br/><br/>cgiwrap-fcgi.pl使用unix socket文件/var/run/cgiwrap-fcgi/cgiwrap-fcgi.sock来监听CGI程序请求，因此只要将对nginx的CGI请求转发到此socket即可，对应的nginx配置文件cgiwrap-fcgi.conf为:<br/>1 location ~ &#92;.(cgi&#124;pl).*$ &#123;<br/>2&nbsp;&nbsp;&nbsp;&nbsp; gzip off;<br/>3&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_pass unix:/var/run/cgiwrap-fcgi/cgiwrap-fcgi.sock;<br/>4&nbsp;&nbsp;&nbsp;&nbsp; fastcgi_index index.cgi;<br/>5&nbsp;&nbsp;&nbsp;&nbsp; include fastcgi_params;<br/>6 &#125;<br/>下载后将此文件拷贝到/etc/nginx/目录下，然后在虚拟主机配置文件的server节include cgiwrap-fcgi.conf即可。<br/>Tags - <a href="http://zhoujin.com/tags/nginx/" rel="tag">nginx</a> , <a href="http://zhoujin.com/tags/cgi/" rel="tag">cgi</a> , <a href="http://zhoujin.com/tags/perl/" rel="tag">perl</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/172/</link>
<title><![CDATA[全面成功]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[项目管理]]></category>
<pubDate>Wed, 18 May 2011 01:11:21 +0000</pubDate> 
<guid>http://zhoujin.com/post/172/</guid> 
<description>
<![CDATA[ 
	逐渐的，人们用越来越多的维度来衡量某一个人或者某一项活动的成功。例如，有很多的钱固然是人们对其保持羡慕的主要指标之一，能否行使对应的社会责任，维护公共道德也成为有力的判断准则。<br/><br/>这与过去的，人类一向成王败寇的单一判断观念有些不同。过去的社会关系简单，战争这种纯粹的、一旦失败就意味着国家灭亡的沉重的责任也让个体在群体中泯灭。到了现代，这类竞争关系不再存在。特别是在软件开发领域，你永远有模拟环境实施，犯错误，获得反馈并改进的机会。<br/><br/>奇怪的是，即便在这种情况下面，“交付成功”这一功利的目标，依然成为众多软件开发团队是否运转成功的唯一标准。在这种唯一判断标准之下，有一些行为显得可以理解：<br/><br/>很少的日常质量活动。 最显著的特征就是没有进行持续的测试活动，包括细粒度的单元测试和为业务人员准备的展示。测试本质是一种浪费——如果确定你的代码能够很好的工作，测试的确是增加了工作量。以“交付成功”的唯一目的而言，这些浪费毫无价值。<br/><br/>很少的知识共享和能力提升活动。 在“交付成功”的唯一目的之下，提升个体能力固然从长期看来对组织有利，但对于只有几个月的交付而言，没有项目经理希望这一行为发生在自己的项目之内。什么，需要花点时间学习新的技术？延误交付怎么办？沟通通常被工作环境、分配式的工作内容所隔离，团队中的个体往往只能在开会中聚集到一起，通常好几天、一两周才能偶尔发现一些讨论。<br/><br/>加班。加班显然是所有领导者喜欢的，说不定也是员工喜欢的。在软件行业，大多数人将其与一般的，体力密集型的工作混为一谈，认为工作时间的长度决定了工作内容的产出。就像收割麦子，生产线上的工人，工作时间越长，产出越大。然而智力密集型工作的特点在于思维清楚。很难想象一个人在工作加班十几二十个小时，依然能够保持犀利的想法，对项目进行贡献。当成为一种常态的时候，加班更多的成为一种筹码——一旦交付无法准时，那么就可以说：我们已经加很多班了。<br/><br/>让很多项目管理者感到迷惑的是，即便以“交付成功”或者“客户第一”之类的纯粹的，绝对的目标导向，最终许多项目依然不可避免的走向了无法按期交付、质量低劣、团队士气低落的噩梦。<br/><br/>在这里我不想继续提那些单点的优化策略，例如持续集成、测试驱动开发等等等等。我发现这里面是一个认知的过程。绝大多数的项目领导者，没有意识到在软件开发行业，这种单一的、功利性的目标导向下，只能产生一时的生产力提升，或无法最终产生另所有人满意的交付。在此，作为对“交付成功”唯一目标的对立面，我提出“全面成功”的概念：<br/><br/>全面成功，是指一个软件团队不再以交付成功作为唯一目标，而以团队沟通、个体能力提升、士气、客户沟通、持续的软件质量作为全面的衡量标准，最终获得一个全面成功的团队，交付成功只是必然结果之一。<br/><br/>软件开发事关沟通。写下的每一行晦涩代码，如果存在另外一个人审视，那么也许将不会存在；如果团队以平等尊重为前提，那么所有的错误都被容忍并改进，那么团队将显得更加和谐充满生机。想办法将各种软件交付产物的受众加入到沟通圈来，及早获得反馈，获得信任。<br/><br/>个体只有通过项目才能获得能力提升。这一点在软件行业尤其突出。给予团队成员一定的空间，通过各种活动提升员工的能力，最终这些能力会转化为惊人的生产力。<br/><br/>持续的软件质量，而不是某一刹那的集成。数天的甚至更久的扫缺陷、稳定版本时间不是必然的。通过实时的集成，充分的测试以及良好的测试策略，让软件库任何时刻都处于稳定的状态。这样开发人员才能放心的实现新的功能而不比担心破坏已有的功能。<br/><br/>全面成功并不是一个口号。事实上，我所经历过的成功的项目，都印证了这一论点。我的同事胡凯在InfoQ上分享的团队案例，也印证了全面成功对交付成功的必然性，并且获得了更多的好处。<br/><br/>在此我呼吁，团队停止以“交付成功”作为唯一的目标，将“全面成功”作为追求，不断改进，最终获得令人羡慕的团队，以及理所当然的顺利交付。<br/>Tags - <a href="http://zhoujin.com/tags/%25E5%2592%25A8%25E8%25AF%25A2/" rel="tag">咨询</a> , <a href="http://zhoujin.com/tags/%25E6%2595%258F%25E6%258D%25B7/" rel="tag">敏捷</a> , <a href="http://zhoujin.com/tags/%25E6%259D%2582%25E8%25B0%2588/" rel="tag">杂谈</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/171/</link>
<title><![CDATA[韩寒：黄艺博是个好干部]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Wed, 04 May 2011 08:46:35 +0000</pubDate> 
<guid>http://zhoujin.com/post/171/</guid> 
<description>
<![CDATA[ 
	最近惊闻五条杠少年黄艺博，我深感自卑。我在上学的时候是两条杠，但其实我是有机会得到三条杠的。在小学全班选举的时候，我和主要的竞争对手都是深得学生和老师喜爱的两个候选对象，最后由于我得票是满票，而她的得票是满票缺一票，所以老师认为我不够谦虚，怎么可以自己还投了自己一票，导致我惜败于她，只拿了两条杠中队长，没有得到三条杠大队长。当时我一直以为我已经做到了成功的百分之六十六，到今天才知道，我其实还不到成功的百分之四十。<br/><br/>看到大家对黄艺博和他爹妈冷嘲热讽，我并不赞同。因为从小是班干部的经历让我知道看新闻联播建立起来的情感是多么的脆弱。小时候的班干部经历也绝不会让我们在长大以后觉得有什么傲人的资本，或者真的培养出了什么阶级意识，到若干年后同学会的时候还是谁赚钱最多谁最牛逼，没有人把以前的干部放在眼里。当时我们班级有一台电视机，只用来看新闻联播，订阅的报纸就是红领巾报，上海市中学生报，环球时报和参考消息。所以当时的我们其实一直挺期盼和美国打仗的，我认为只要我解放军一使用藏在山里的秘密武器，美帝国主义必然溃败。直到离开学校很多年后，我都对中国的尖端工业抱有幻想，直到成为车手，知道了我国是真的造不出一台像样的汽车发动机，甚至造不出一个耐用的轴承和液压件的时候，我才知道，秘密武器，这个真没有。所以我一度很焦虑，这要是打仗起来怎么办呢。到后来我就彻底明白了，我国的国防标准不是以防外国军队而配置的，而是以防本国老百姓来装备的。所以我丝毫不担心黄艺博这样的孩子长大以后会延续他小时候的样子。<br/><br/>退一步说，黄艺博长大以后真的还是现在的样子，并走上官场，我也有充分的理由相信他是一个好干部，甚至是一个郁郁不得志的好干部。他两岁看新闻联播，七岁看人民日报，他一定是发自内心的热爱这个政权，热爱这个政党，热爱这片土地上的人民。但是我国残酷的政治斗争经验告诉我们，越热爱这个政党，做事情越真正的为这个政权着想，你就被肃清的越快。黄艺博小朋友不知道，在中国，往往要做一个成功的干部有三条要牢记，第一条就是你要不爱这个政党，第二条就是你要不爱这个国家，第三条就是你要不爱这些人民。做到这个三不爱，再跟对了利益集团，你就有可能仕途通畅。黄艺博同学是天真的，他相信新闻联播和人民日报里说的一切东西，但问题是领导们自己都不相信，就黄艺博相信，所以由理由相信，黄艺博在未来的官场上会受到排挤。因为在一堆普遍都不相信只想借着名头捞些利益的人群里，就他相信，太突兀了。<br/><br/>其次，虽然黄艺博的站姿和表情都让人蛋疼，但是这是一个少年的天性，比如我小时候看戏说乾隆，我就模仿乾隆，也成天摇一把扇子想打人。黄艺博一直看新闻联播，那自然就模仿了敏感词。虽然模仿的不太到位，模仿成了陈光标，但是举手投足之间，依然有省市级敏感词的风范，甚至体型都是往那个方向去的，在别的同学的理想是有想星矢一样的小宇宙的时候，他的理想可能是有像领导一样的啤酒肚，这也是一种个性的彰显。而且从小看新闻联播没有什么不好，很多网友觉得政治侵害到了小学生，我反而觉得让小学生多看看新闻联播这样的童话节目没有什么不好。至于什么政治不政治，其实小学生什么都不懂，对小学生洗脑本来本来就是一种急于求成的表现。青春期前的一切洗脑，都将在他们经历的青春期认识到了这个世界以后灰飞烟灭，甚至变本加厉的反过来。在座的谁不是一路被这样教育过来的。况且黄艺博孝敬老人，在摄像机没有跟在身后的情况下居然主动去敬老院慰问老人，实属美德。我也不觉得黄艺博失去了快乐的童年。每个人都有自己的偶像，我们的偶像都难以模仿，因为我们不能飞，不能像花仙子那样游历，一拳打不出火球，不能变形还没有武功，所以我们的童年很失落，而黄艺博的偶像易于模仿，无非就是视察视察又视察，看文件看文件又看文件，开会开会又开会，指示指示又指示，再说些空话就齐了，所以黄艺博的童年很幸福，他和偶像充分的融为一体，其满足感可想而知。不光这样，他还得到了认证——五条杠，成为了干部的化身。黄艺博做着自己喜欢做的事情，他的童年是何其快乐。相比之下，我们的童年那是何其的苦闷，因为没有人承认我们是圣斗士的化身，还老得做自己不喜欢的事情。<br/><br/>很遗憾，在写下这篇文章的时候，全国少工委少先队发表了说明，表示他们从来没有五条杠，而五条杠是武汉少工委当地的一种行为，从制度上讲没有什么依据。武汉少工委表示，这是他们首创的一种体系，觉得很不错。看到这个消息，我为黄艺博感到伤心，他做了这么多，甚至站姿都和中央这么像，但却没有得到中央的认可，只是成为了武汉市的一个实验品，还制造了地方和中央的矛盾。纯真的黄艺博不知道，这种五条杠其实是非常给全国少工委添乱的，组织向来不喜欢有争议的人物，而且黄艺博还来自于武汉市滑坡路小学，领导对风水和口彩还是有要求的，黄艺博这个滑坡路小学也拖了他不少的后腿。黄艺博在少先队的仕途估计就到此为止了。<br/><br/>我衷心的祝福黄艺博在共青团可以大有作为。<br/><a href="http://zhoujin.com/attachment.php?fid=41" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=41" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>点评：目前网上倍受关注的五道杠的照片格外火，本来只是看了一下，没去怎么多想，但今天韩寒的博客里出现了新博文，名为《黄艺博是个好干部》，本来想看看的，结果内容居然被删除，赤裸裸地被删除了。<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a> , <a href="http://zhoujin.com/tags/%25E9%25BB%2584%25E8%2589%25BA%25E5%258D%259A/" rel="tag">黄艺博</a> , <a href="http://zhoujin.com/tags/%25E5%25A5%25BD%25E5%25B9%25B2%25E9%2583%25A8/" rel="tag">好干部</a> , <a href="http://zhoujin.com/tags/%25E6%2595%2599%25E8%2582%25B2/" rel="tag">教育</a> , <a href="http://zhoujin.com/tags/%25E6%2596%25B0%25E9%2597%25BB%25E8%2581%2594%25E6%2592%25AD/" rel="tag">新闻联播</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/185/</link>
<title><![CDATA[ExtJs对js基本语法扩展支持]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[EXTJS]]></category>
<pubDate>Wed, 27 Apr 2011 12:38:05 +0000</pubDate> 
<guid>http://zhoujin.com/post/185/</guid> 
<description>
<![CDATA[ 
	本篇主要介绍一下ExtJs对JS基本语法的扩展支持，包括动态加载、类的封装等。<br/>一、动态引用加载<br/><br/>ExtJs有庞大的类型库，很多类可能在当前的页面根本不会用到，我们可以引入动态加载的概念来即用即取。这些代码都要写在Ext.onReady外面。<br/>1.动态引用外部Js<br/><div class="code">//加载配置可用<br/>Ext.Loader.setConfig(&#123; enabled: true &#125;);<br/>//动态引用“../ux/”目录下所有Js文件类，映射到对应命名空间<br/>Ext.Loader.setPath(&#039;Ext.ux&#039;, &#039;../ux/&#039;);</div><br/>2.动态加载类<br/><div class="code">//加载单个类<br/>Ext.require(&#039;Ext.window.Window&#039;);<br/>//加载多个<br/>Ext.require(&#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#039;Ext.grid.*&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#039;Ext.data.*&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#039;Ext.util.*&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#039;Ext.grid.PagingScroller&#039;<br/>&#93;);<br/>//加载所有类，除了“Ext.data.*”之外<br/>Ext.exclude(&#039;Ext.data.*&#039;).require(&#039;*&#039;);</div><br/>二、对类的封装<br/><br/>Js本身是面向对象的语言，但是语法层面上对类的支持不够完善，ExtJs对此作了一系列的封装，下面看看类的定义、字段、构造函数、方法、静态字段，方法的实现方式，还用类的继承的用法。<br/><div class="code">Ext.onReady(function () &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Ext.define(&quot;My.test.Animal&quot;, &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height: 0,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;weight: 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;);<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;Ext.define(&quot;My.test.Person&quot;, &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//普通子段<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name: &quot;&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//属性<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age: 0,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;father: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name: &quot;&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age: 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//构造方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructor: function (name, height) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.self.count++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (name) this.name = name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (height) this.height = height;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//继承<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extend: &quot;My.test.Animal&quot;,<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//实例方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Say: function () &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;你好，我是：&quot; + this.name + &quot;,我今年&quot; + this.age + &quot;岁,我的身高是：&quot; + this.height<br/>　　　　　　　　　　+ &quot;。我的爸爸是：&quot; + this.father.name + &quot;，他&quot; + this.father.age + &quot;岁。&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//静态子段，方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statics: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type: &quot;高等动物&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count: 0,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getCount: function () &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &quot;当前共有&quot; + this.count + &quot;人&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;);<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;function test() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var p = Ext.create(&quot;My.test.Person&quot;, &quot;李四&quot;, 178);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.setAge(21);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.setFather(&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age: 48,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name: &quot;李五&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.Say();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext.create(&quot;My.test.Person&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(My.test.Person.getCount());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;test();<br/>&#125;);</div><br/><br/>三、基本数据类型<br/><br/>ExtJs支持数值型、字符串型、日期型、布尔型等基本数据类型，内容比较简单，下面演示基本的声明用法，以及类型转换。<br/><div class="code">//定义一个日期类型的数据<br/>var date1 = new Date(&quot;2011-11-12&quot;);<br/>var date = new Date(2011, 11, 12, 12, 1, 12);<br/> <br/>//转化为字符串型<br/>alert(date.toLocaleDateString());<br/> <br/>//转化为数值型<br/>alert(Number(date));<br/> <br/>//布尔型，假<br/>var myFalse = new Boolean(false);<br/>//真<br/>var myBool = new Boolean(true);<br/> <br/>//定义数值<br/>var num = new Number(45.6);<br/>alert(num);</div><br/>四、函数执行时间控制<br/><br/>主要用两个方面，1.让某个函数等待一段时间后自动执行。2.然某个函数按照一定频率反复执行。<br/>1.函数等待执行<br/><br/>实现一个功能，页面加载完毕后，等待3秒后弹出提示。<br/><div class="code">var func1 = function (name1, name2) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Ext.Msg.alert(&quot;3秒钟后自动执行&quot;, &quot;你好，&quot; + name1 + &quot;、&quot; + name2 + &quot;！&quot;);<br/>&#125;;<br/> <br/>Ext.defer(func1, 3000, this, &#91;&quot;张三&quot;, &quot;李四&quot;&#93;);</div><br/><br/>1.函数按照一定频率反复执行<br/><br/>让div1每隔一秒更新一次显示当前时间，10秒又自动停止更新：<br/><div class="code">//周期执行<br/>var i = 0;<br/>var task = &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;run: function () &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext.fly(&#039;div1&#039;).update(new Date().toLocaleTimeString());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (i &gt; 10) Ext.TaskManager.stop(task);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;interval: 1000<br/>&#125;<br/>Ext.TaskManager.start(task);</div><br/><br/>五、键盘事件侦听<br/><br/>1..Ext.KeyMap<br/><br/>通过Ext.KeyMap可以建立键盘和用户动作（Actions）之间的映射。下面看看例子，页面html沿用Ext.Updater部分。<br/><div class="code">var f = function () &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;B被按下&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;var map = new Ext.KeyMap(Ext.getDoc(), &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key: Ext.EventObject.B,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn: f<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;, &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key: &quot;bc&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn: function () &#123; alert(&#039;b,c其中一个被按下&#039;); &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key: &quot;x&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctrl: true,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shift: true,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alt: true,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn: function () &#123; alert(&#039;Control + shift +alt+ x组合键被按下.&#039;); &#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stopEvent: true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;, &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key: &quot;a&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctrl: true,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn: function () &#123; alert(&#039;Control+A全选事件被阻止，自定义事件执行！&#039;); &#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stopEvent: true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#93;);</div><br/>我们看到，在IE中测试，当我们按下ctrl+A键时，全选功能被屏蔽，支持了我们自定义的方法。<br/>2.Ext.KeyNav<br/><br/>Ext.KeyNav主要是用来绑定方向键的，已支持的键：enter, left, right, up, down, tab, esc, pageUp, pageDown, del, home, end,现在通过它来实现鼠标控制层移动的功能：<br/><div class="code">var div1 = Ext.get(&quot;div1&quot;);<br/>var nav = new Ext.KeyNav(Ext.getDoc(), &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;left&quot;: function (e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div1.setXY(&#91;div1.getX() - 1, div1.getY()&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;right&quot;: function (e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div1.setXY(&#91;div1.getX() + 1, div1.getY()&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;up&quot;: function (e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div1.move(&quot;up&quot;,1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;down&quot;: function (e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div1.moveTo(div1.getX(), div1.getY() + 1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;enter&quot;: function (e) &#123;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;);</div><br/>Tags - <a href="http://zhoujin.com/tags/javascript/" rel="tag">javascript</a> , <a href="http://zhoujin.com/tags/extjs/" rel="tag">extjs</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/186/</link>
<title><![CDATA[ExtJs对js基本语法扩展支持]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[EXTJS]]></category>
<pubDate>Wed, 27 Apr 2011 12:38:05 +0000</pubDate> 
<guid>http://zhoujin.com/post/186/</guid> 
<description>
<![CDATA[ 
	本篇主要介绍一下ExtJs对JS基本语法的扩展支持，包括动态加载、类的封装等。<br/>一、动态引用加载<br/><br/>ExtJs有庞大的类型库，很多类可能在当前的页面根本不会用到，我们可以引入动态加载的概念来即用即取。这些代码都要写在Ext.onReady外面。<br/>1.动态引用外部Js<br/><div class="code">//加载配置可用<br/>Ext.Loader.setConfig(&#123; enabled: true &#125;);<br/>//动态引用“../ux/”目录下所有Js文件类，映射到对应命名空间<br/>Ext.Loader.setPath(&#039;Ext.ux&#039;, &#039;../ux/&#039;);</div><br/>2.动态加载类<br/><div class="code">//加载单个类<br/>Ext.require(&#039;Ext.window.Window&#039;);<br/>//加载多个<br/>Ext.require(&#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#039;Ext.grid.*&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#039;Ext.data.*&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#039;Ext.util.*&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#039;Ext.grid.PagingScroller&#039;<br/>&#93;);<br/>//加载所有类，除了“Ext.data.*”之外<br/>Ext.exclude(&#039;Ext.data.*&#039;).require(&#039;*&#039;);</div><br/>二、对类的封装<br/><br/>Js本身是面向对象的语言，但是语法层面上对类的支持不够完善，ExtJs对此作了一系列的封装，下面看看类的定义、字段、构造函数、方法、静态字段，方法的实现方式，还用类的继承的用法。<br/><div class="code">Ext.onReady(function () &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Ext.define(&quot;My.test.Animal&quot;, &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height: 0,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;weight: 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;);<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;Ext.define(&quot;My.test.Person&quot;, &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//普通子段<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name: &quot;&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//属性<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age: 0,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;father: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name: &quot;&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age: 0<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//构造方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constructor: function (name, height) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.self.count++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (name) this.name = name;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (height) this.height = height;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//继承<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extend: &quot;My.test.Animal&quot;,<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//实例方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Say: function () &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;你好，我是：&quot; + this.name + &quot;,我今年&quot; + this.age + &quot;岁,我的身高是：&quot; + this.height<br/>　　　　　　　　　　+ &quot;。我的爸爸是：&quot; + this.father.name + &quot;，他&quot; + this.father.age + &quot;岁。&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//静态子段，方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;statics: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type: &quot;高等动物&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count: 0,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getCount: function () &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &quot;当前共有&quot; + this.count + &quot;人&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;);<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;function test() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var p = Ext.create(&quot;My.test.Person&quot;, &quot;李四&quot;, 178);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.setAge(21);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.setFather(&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age: 48,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name: &quot;李五&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p.Say();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext.create(&quot;My.test.Person&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(My.test.Person.getCount());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;test();<br/>&#125;);</div><br/><br/>三、基本数据类型<br/><br/>ExtJs支持数值型、字符串型、日期型、布尔型等基本数据类型，内容比较简单，下面演示基本的声明用法，以及类型转换。<br/><div class="code">//定义一个日期类型的数据<br/>var date1 = new Date(&quot;2011-11-12&quot;);<br/>var date = new Date(2011, 11, 12, 12, 1, 12);<br/> <br/>//转化为字符串型<br/>alert(date.toLocaleDateString());<br/> <br/>//转化为数值型<br/>alert(Number(date));<br/> <br/>//布尔型，假<br/>var myFalse = new Boolean(false);<br/>//真<br/>var myBool = new Boolean(true);<br/> <br/>//定义数值<br/>var num = new Number(45.6);<br/>alert(num);</div><br/>四、函数执行时间控制<br/><br/>主要用两个方面，1.让某个函数等待一段时间后自动执行。2.然某个函数按照一定频率反复执行。<br/>1.函数等待执行<br/><br/>实现一个功能，页面加载完毕后，等待3秒后弹出提示。<br/><div class="code">var func1 = function (name1, name2) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Ext.Msg.alert(&quot;3秒钟后自动执行&quot;, &quot;你好，&quot; + name1 + &quot;、&quot; + name2 + &quot;！&quot;);<br/>&#125;;<br/> <br/>Ext.defer(func1, 3000, this, &#91;&quot;张三&quot;, &quot;李四&quot;&#93;);</div><br/><br/>1.函数按照一定频率反复执行<br/><br/>让div1每隔一秒更新一次显示当前时间，10秒又自动停止更新：<br/><div class="code">//周期执行<br/>var i = 0;<br/>var task = &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;run: function () &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ext.fly(&#039;div1&#039;).update(new Date().toLocaleTimeString());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (i &gt; 10) Ext.TaskManager.stop(task);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i++;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;interval: 1000<br/>&#125;<br/>Ext.TaskManager.start(task);</div><br/><br/>五、键盘事件侦听<br/><br/>1..Ext.KeyMap<br/><br/>通过Ext.KeyMap可以建立键盘和用户动作（Actions）之间的映射。下面看看例子，页面html沿用Ext.Updater部分。<br/><div class="code">var f = function () &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;B被按下&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;var map = new Ext.KeyMap(Ext.getDoc(), &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key: Ext.EventObject.B,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn: f<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;, &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key: &quot;bc&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn: function () &#123; alert(&#039;b,c其中一个被按下&#039;); &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key: &quot;x&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctrl: true,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shift: true,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alt: true,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn: function () &#123; alert(&#039;Control + shift +alt+ x组合键被按下.&#039;); &#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stopEvent: true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;, &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key: &quot;a&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctrl: true,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fn: function () &#123; alert(&#039;Control+A全选事件被阻止，自定义事件执行！&#039;); &#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stopEvent: true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#93;);</div><br/>我们看到，在IE中测试，当我们按下ctrl+A键时，全选功能被屏蔽，支持了我们自定义的方法。<br/>2.Ext.KeyNav<br/><br/>Ext.KeyNav主要是用来绑定方向键的，已支持的键：enter, left, right, up, down, tab, esc, pageUp, pageDown, del, home, end,现在通过它来实现鼠标控制层移动的功能：<br/><div class="code">var div1 = Ext.get(&quot;div1&quot;);<br/>var nav = new Ext.KeyNav(Ext.getDoc(), &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;left&quot;: function (e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div1.setXY(&#91;div1.getX() - 1, div1.getY()&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;right&quot;: function (e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div1.setXY(&#91;div1.getX() + 1, div1.getY()&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;up&quot;: function (e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div1.move(&quot;up&quot;,1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;down&quot;: function (e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;div1.moveTo(div1.getX(), div1.getY() + 1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;enter&quot;: function (e) &#123;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;);</div><br/>Tags - <a href="http://zhoujin.com/tags/javascript/" rel="tag">javascript</a> , <a href="http://zhoujin.com/tags/extjs/" rel="tag">extjs</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/184/</link>
<title><![CDATA[Extjs4.0 之Ext.Class 属性详解 (alias/mixins /uses/requires/singleton等属性)]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[EXTJS]]></category>
<pubDate>Thu, 07 Apr 2011 12:31:08 +0000</pubDate> 
<guid>http://zhoujin.com/post/184/</guid> 
<description>
<![CDATA[ 
	Ext.Class 属性详解 :<br/>1 ,&nbsp;&nbsp;alias : 相当于别名一样,可以起多个,可以通过xtype和Ext.widget()创建实例:<br/><div class="code">Ext.define(&#039;SimplePanel&#039;, &#123;<br/>&nbsp;&nbsp;extend: &#039;Ext.panel.Panel&#039;,<br/>&nbsp;&nbsp;alias: &#91;&#039;widget.simplepanel_007&#039;,&#039;widget.simplepanel_008&#039;&#93;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title: &#039;Yeah!&#039;<br/>&#125;);<br/><br/>//通过Ext.widget()创建实例<br/>Ext.widget(&#039;simplepanel_007&#039;,&#123;<br/>&nbsp;&nbsp;width : 100,<br/>&nbsp;&nbsp;height : 100<br/>&#125;).render(Ext.getBody());<br/><br/>//通过xtype创建<br/>Ext.widget(&#039;simplepanel_007&#039;, &#123;<br/>&nbsp;&nbsp;width : 100,<br/>&nbsp;&nbsp;items: &#91;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;xtype: &#039;simplepanel_008&#039;, html: &#039;Foo&#039;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;xtype: &#039;simplepanel_008&#039;, html: &#039;Bar&#039;&#125;<br/>&nbsp;&nbsp;&#93;<br/>&#125;).render(Ext.getBody());</div><br/>2 , alternateClassName : 跟alias有点类似,相当于给类找替身,可以多个,可以通过Ext.create()创建实例:<br/><div class="code">Ext.define(&#039;Boy&#039;, &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //定义多个替身<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alternateClassName: &#91;&#039;boy2&#039;, &#039;boy3&#039;&#93;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; say : function(msg)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(msg);<br/>&nbsp;&nbsp;&#125;<br/>&#125;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>var boy1 = Ext.create(&#039;Boy&#039;);<br/>boy1.say(&#039;I am boy1...&#039;);<br/><br/>//可以通过alternateClassName实例化该类<br/>var boy2 = Ext.create(&#039;boy2&#039;);<br/>boy2.say(&#039;I am boy2...&#039;);<br/><br/>var boy3 = Ext.create(&#039;boy3&#039;);<br/>boy3.say(&#039;I am boy3...&#039;);</div><br/>3 , config:类的属性配置,属性可以自动生成geter/seter方法<br/><div class="code">Ext.define(&#039;Boy&#039;, &#123;<br/>&nbsp;&nbsp;config : &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;name : &#039;czp&#039;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;age : 25<br/>&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;constructor: function(cfg) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.initConfig(cfg);<br/>&nbsp;&nbsp;&#125;<br/>&#125;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>var czp = Ext.create(&#039;Boy&#039;,&#123;name:&#039;czpae86&#039;&#125;);<br/>//通过getName()方法获得属性name值<br/>alert(czp.getName());<br/>//通过setAge()方法改变属性age值<br/>czp.setAge(25.5);</div><br/>4 , extend : 继承,可以继承单个类<br/><div class="code">Ext.define(&#039;Person&#039;, &#123;<br/>&nbsp;&nbsp;say: function(text) &#123; alert(text); &#125;<br/>&#125;);<br/>Ext.define(&#039;Boy&#039;, &#123;<br/>&nbsp;&nbsp;extend : &#039;Person&#039;<br/>&#125;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>var czp = Ext.create(&#039;Boy&#039;);<br/>//继承了Person,所以可以使用say()方法<br/>czp.say(&#039;my name is czp.&#039;);</div><br/>5 , inheritableStatics : 定义静态方法,可以通过"类名.方法名"调用静态方法. 类似 statics属性,<br/>区别是:子类也可以使用该静态方法,但statics属性定义的静态方法子类是不会继承的.<br/><div class="code">Ext.define(&#039;Person&#039;, &#123;<br/>&nbsp;&nbsp;inheritableStatics : &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;sleep : function()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&#039;sleep&#039;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;say: function(text) &#123; alert(text); &#125;<br/>&#125;);<br/><br/>Ext.define(&#039;Boy&#039;, &#123;<br/>&nbsp;&nbsp;extend : &#039;Person&#039;<br/>&#125;);<br/><br/>//子类可以通过&quot;类名.方法名&quot;调用父类通过&quot;inheritableStatics&quot;定义的方法<br/>Boy.sleep();</div><br/>6 , mixins : 可以实现多继承<br/><div class="code">Ext.define(&#039;Person&#039;, &#123;<br/>&nbsp;&nbsp;say: function(text) &#123; alert(text); &#125;<br/>&#125;);<br/><br/>Ext.define(&#039;Boy&#039;, &#123;<br/>&nbsp;&nbsp;play : function()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&#039;play&#039;);<br/>&nbsp;&nbsp;&#125;<br/>&#125;);<br/><br/>Ext.define(&#039;Gird&#039;, &#123;<br/>&nbsp;&nbsp;sleep : function()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&#039;sleep&#039;);<br/>&nbsp;&nbsp;&#125;<br/>&#125;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>Ext.define(&#039;A_007&#039;, &#123;<br/>&nbsp;&nbsp;//继承Person<br/>&nbsp;&nbsp;extend : &#039;Person&#039;,<br/>&nbsp;&nbsp;//同时继承&#039;Boy&#039;,&#039;Gird&#039;<br/>&nbsp;&nbsp;mixins : &#91;&#039;Boy&#039;,&#039;Gird&#039;&#93;<br/>&#125;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>var a_007 = new A_007();<br/>a_007.say(&#039;我可以say,也可以play,还可以sleep!!&#039;);<br/>a_007.play();<br/>a_007.sleep();</div><br/>7 , singleton : 创建单例模式的类, 如果singleton为true,那么该类不能用通过new创建,也不能被继承<br/><div class="code">Ext.define(&#039;Logger&#039;, &#123;<br/>&nbsp;&nbsp;//singleton为true<br/>&nbsp;&nbsp;singleton: true,<br/>&nbsp;&nbsp;log: function(msg) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(msg);<br/>&nbsp;&nbsp;&#125;<br/>&#125;);<br/>//方法调用&quot;类名.方法名&quot;<br/>Logger.log(&#039;Hello&#039;);</div><br/>8 , statics : 与第5个inheritableStatics属性类似,statics属性定义的静态方法子类是不会继承的.请看第5个属性.<br/> <br/>9 , uses 和 requires : 与requires属性类似,都是对某些类进行引用<br/>uses -- 被引用的类可以在该类之后才加载.<br/>requires -- 被引用的类必须在该类之前加载.<br/><div class="code">Ext.define(&#039;Gird&#039;, &#123;<br/>&nbsp;&nbsp;uses : &#91;&#039;Boy&#039;&#93;,<br/>&nbsp;&nbsp;getBoy : function()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return Ext.create(&#039;Boy&#039;);<br/>&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;sleep : function()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&#039;sleep&#039;);<br/>&nbsp;&nbsp;&#125;<br/>&#125;);<br/><br/>//对于uses属性,Boy类放在后面是可以的,不会报错<br/>Ext.define(&#039;Boy&#039;, &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;play : function()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(&#039;play&#039;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;);<br/><br/><br/>//对于requires属性,Boy类必须在Grid类之前加载,不然会报错<br/>Ext.define(&#039;Boy&#039;, &#123;<br/>&nbsp;&nbsp;play : function()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&#039;play&#039;);<br/>&nbsp;&nbsp;&#125;<br/>&#125;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>Ext.define(&#039;Gird&#039;, &#123;<br/>&nbsp;&nbsp;requires : &#91;&#039;Boy&#039;&#93;,<br/>&nbsp;&nbsp;getBoy : function()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return Ext.create(&#039;Boy&#039;);<br/>&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;sleep : function()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&#039;sleep&#039;);<br/>&nbsp;&nbsp;&#125;<br/>&#125;);</div><br/>Tags - <a href="http://zhoujin.com/tags/ajax/" rel="tag">ajax</a> , <a href="http://zhoujin.com/tags/extjs/" rel="tag">extjs</a> , <a href="http://zhoujin.com/tags/class/" rel="tag">class</a> , <a href="http://zhoujin.com/tags/%25E5%25B1%259E%25E6%2580%25A7/" rel="tag">属性</a> , <a href="http://zhoujin.com/tags/alias/" rel="tag">alias</a> , <a href="http://zhoujin.com/tags/mixins/" rel="tag">mixins</a> , <a href="http://zhoujin.com/tags/uses/" rel="tag">uses</a> , <a href="http://zhoujin.com/tags/requires/" rel="tag">requires</a> , <a href="http://zhoujin.com/tags/singleton/" rel="tag">singleton</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/170/</link>
<title><![CDATA[为了食油，声讨百度(韩寒)]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Fri, 25 Mar 2011 01:29:11 +0000</pubDate> 
<guid>http://zhoujin.com/post/170/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;昨天，我的几个作为行业代表的朋友们和百度的谈判破裂了。在最早的时候，沈浩波，路金波以及侯小强都在各种不同的时间场合和我说过百度对整个出版行业造成的伤害。我说，告百度啊。他们说，都告过了，没一个告的赢。百度很有钱很有门路，据说很多法院他们都能搞的定。百度的公关又很强大，据说很多媒体他们也都搞的定。我当时就感叹，莫非李彦宏他爸才是李刚。于是就有了315的作家维权。在昨天谈判的时候，我就觉得文著协应该出面，因为上次文著协和谷歌谈判，结果谈着谈着人家就退出中国了，收效显著。<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;依稀记得上次的谷歌事件，谷歌扫描了中国作家的图书，每本先支付几十美元，然后显示了目录和内容摘要，如果要阅读全文，就付费下载，谷歌图书馆再和中国作家分账。结果大家忽略了百度文库从来都是所有作家所有图书免费阅读下载，而对保护版权的谷歌进行了围攻，理由是扫描前你得问我愿意不愿意。现在想来，大家应该很惭愧。谷歌和百度还是有区别的，谷歌要脸，所以大家都想冲上去撕破它的脸皮，百度不要脸，大家一看没脸可撕，就四散了。<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;百度宣称，互联网的精神就是免费和共享，对于这点，我很不这么觉得。我认为，互联网的精神是自由和传播，并不是免费和共享。如果互联网的精神是免费，那为什么在百度上登广告搞搜索排名就要花钱？如果互联网的精神是共享，那为什么咱们大家都共享了，而李彦宏却变成了中国首富，为何你的财富以及百度的资产不和网民们共享呢？百度这家大商场，经营模式就是里面的商品是免费的，于是成了中国最大的商场，因为人流多，所以在墙上糊广告赚钱。这个模式没有任何的问题，但我希望这家商场记住，你向厂家进货还是要花钱的。百度又想出了“共享”，共享应该是我把我家里的东西端出来，你把你家里的东西端出来，然后放一起大家各取所需，但问题是，现在你和我都是把别人家的东西端出来，然后共享掉。这就是百度所谓的免费和共享。<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;百度赶上了一个正确的年代，因为只有在这个年代里，你可以肆意的对作家音乐家影视工作者侵权，当然，最关键的是百度赶上了一个正确的国家，只有在这个国家里，你对几乎全文化行业侵权了以后还能受到庇护。<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当然，百度有很多的支持者，我非常理解他们，有的时候你觉得买书麻烦，有的时候你觉得看书花钱，所以你就去百度文库。就好比我也看盗版碟，也在百度的MP3里下载音乐一样。但是我很清楚，自己的行为是错的，虽然错不大，但是一定不能为我自己的错去寻找正当性，更不能去反过来去侮辱那些为自己版权维权的人。我看到不少人留言这么说，你们是想赚钱想疯了吧，互联网就是要共享的，你们这点水平能叫作家么，你们写的那些东西能叫文学么，支持百度。<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;朋友们，我深知作家的困境。大部分作家两三年才写一本书，一本书就赚一两万。这些写作者们可能才年薪一万块啊朋友们，月薪八百啊朋友，没有社保啊朋友，还得交税啊朋友，比你更惨啊朋友，除了几个顶级畅销书作家，中国作家绝大部分都收入微薄，很多网络作家更是一天要写一万字，靠着千字两分钱的下载收入维生，这年头谁他妈还在论分来卖东西啊朋友，你看五千字的新鲜连载只要一毛钱啊朋友，一毛钱，你给叫花子都拿不出手啊朋友，可你免费看掉也就算了，怎么还能指责他们呢朋友。而那头可是六百多亿人民币身家的主儿啊朋友。请大家给中国的出版行业和作家们留一条生路。在你们为了石油的道路上，请放过我们的食油。<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a> , <a href="http://zhoujin.com/tags/%25E7%2599%25BE%25E5%25BA%25A6/" rel="tag">百度</a> , <a href="http://zhoujin.com/tags/%25E8%25B0%25B7%25E6%25AD%258C/" rel="tag">谷歌</a> , <a href="http://zhoujin.com/tags/%25E4%25BD%259C%25E5%25AE%25B6/" rel="tag">作家</a> , <a href="http://zhoujin.com/tags/%25E7%2589%2588%25E6%259D%2583/" rel="tag">版权</a> , <a href="http://zhoujin.com/tags/%25E4%25B8%258B%25E8%25BD%25BD/" rel="tag">下载</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/169/</link>
<title><![CDATA[好玩的二维码]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Tue, 15 Mar 2011 08:32:08 +0000</pubDate> 
<guid>http://zhoujin.com/post/169/</guid> 
<description>
<![CDATA[ 
	也自已比较好土，现在才发觉二维码确是好玩。不用多话，赶快拿起你的手机，开启里面的二维码识别软件，对准下面的图形：<br/><a href="http://zhoujin.com/attachment.php?fid=39" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=39" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><a href="http://zhoujin.com/attachment.php?fid=40" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=40" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>另外，如果你用的是智能机，没有的话，就自已安装个QuickMark。<br/>Tags - <a href="http://zhoujin.com/tags/%25E4%25BA%258C%25E7%25BB%25B4%25E7%25A0%2581/" rel="tag">二维码</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/168/</link>
<title><![CDATA[使用Cygwin在windows上架设ssh服务]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[版本控制]]></category>
<pubDate>Thu, 03 Mar 2011 03:59:59 +0000</pubDate> 
<guid>http://zhoujin.com/post/168/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;你习惯用Linux/Unix并且希望通过SSH来访问装有Windows系列的机器么？你希望在windows中架设git版本受制吗?Cygwin提供了这项功能，它能让你在你所熟悉的环境中通过简单的步骤实现这一点。<br/><a href="http://zhoujin.com/attachment.php?fid=21" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=21" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;安装OpenSSH<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里我们会用到OpenSSH，如果你没有安装，可以找到Cygwin中的Setup.exe文件再运行。<br/><a href="http://zhoujin.com/attachment.php?fid=19" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=19" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>安装Cygwin的过程中，可以使用默认设置。在安装包选项页面，搜索“open”，查看"Net"菜单。<br/><a href="http://zhoujin.com/attachment.php?fid=20" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=20" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　你会看到一个叫“openssh”的安装包。点击“New”这一列，它会提示“Skip”直到你在“Bin？”下面看到X出现。如果你被弄晕了可以返回到上一个页面再重新拿开始。点击“Next”完成接下来的步骤，就像刚才安装Cygwin一样。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Cygwin里配置OpenSSH<br/><br/>　　和大多数Linux应用不同的是，OpenSSH在正常运行之前不会自动配置。这里需要进行一些简单的操作。首先，在Cygwin快捷方式上右键，然后点击“以管理员权限运行”：<br/><a href="http://zhoujin.com/attachment.php?fid=22" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=22" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样可以保证我们有合理的权限来进行任意操作。你会看到一个空的Cygwin窗口出现。<br/><a href="http://zhoujin.com/attachment.php?fid=23" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=23" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>输入下面的命令：<br/><br/>ssh-host-config<br/><a href="http://zhoujin.com/attachment.php?fid=24" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=24" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　你将会看到这些脚本生成一些默认文件，然后会是否打开“权限分离”功能。在其他系统里安装OpenSSH的时候默认是打开的，所以你可以直接输入“yes”。<br/><a href="http://zhoujin.com/attachment.php?fid=25" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=25" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　它会提示你创建一个特殊权限账户，选择“yes”脚本会继续运行。<br/><a href="http://zhoujin.com/attachment.php?fid=26" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=26" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　接下来还会询问你是否将sshd作为服务来运行，这样的话不论Cygwin当前是否在运行你都可以访问到SSH，这正是我们需要的功能。选择“yes”继续。<br/><a href="http://zhoujin.com/attachment.php?fid=27" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=27" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　下一步会要求你为这个守护进程输入一个值，可以输入：ntsec<br/><a href="http://zhoujin.com/attachment.php?fid=28" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=28" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　你会看到脚本在系统里为你提供一些信息，然后要求你创建一个默认名为“cyg_server“的优先账户，当提示你是否要使用别的名称的时候，可以输入“no”，因为默认名也很好用，如果你真不喜欢的话也可以修改。<br/><a href="http://zhoujin.com/attachment.php?fid=29" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=29" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　当然，你还需要为这个账户设置密码。<br/><a href="http://zhoujin.com/attachment.php?fid=30" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=30" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　Cygwin将会以文本的方式把你的密码显示出来，请确保你在安装的环境下输入密码。你还会看到其他一些信息，如果一切正常你会得到成功完成的提示。<br/><a href="http://zhoujin.com/attachment.php?fid=31" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=31" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　你可以重启cygwin或者输入下面的命令来重新启动sshd服务：net start sshd<br/><a href="http://zhoujin.com/attachment.php?fid=32" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=32" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在你可以输入“exit”来关闭Cygwin。<br/><br/>SSH的用户配置<br/><br/>　　下一步，我们将会为你的用户账户创建合适的SSH关键内容。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ssh-user-config<br/><a href="http://zhoujin.com/attachment.php?fid=33" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=33" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　它会询问你是否为你的账户创建特定的关键内容，根据你的需要作出选择。我会对第一个提示选择“no”，第二个提示“yes”。<br/><a href="http://zhoujin.com/attachment.php?fid=34" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=34" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　&nbsp;&nbsp; SSH2安全性会更高，所以在这里我会推荐你使用它。输入密码之后，它会询问你是否使用ID来访问你的电脑，输入“yes”。<br/><a href="http://zhoujin.com/attachment.php?fid=35" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=35" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　&nbsp;&nbsp; 下一步，它会要求你创建SSH2 DSA ID文件，如果你不想用密码来访问的话。这一步我输入的是“no”。<br/><a href="http://zhoujin.com/attachment.php?fid=36" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=36" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　就这么简单！你已经完成了所有的配置。如果你想快速测试一下你的配置，可以在Cygwin窗口命令行里输入:ssh –v localhost<br/><a href="http://zhoujin.com/attachment.php?fid=37" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=37" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　选项-v表示进程运行的所有细节都会显示出来。它会询问你是否继续连接，输入“yes”然后根据提示输入密码。记住，当你输入用户名，它对大小写是敏感的。<br/><a href="http://zhoujin.com/attachment.php?fid=38" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=38" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>　　如果一切正常，你将会看到正常的bash命令行提示。<br/><br/>一些小提示<br/><br/>　　如果你在配置过程中觉得束手无策，一定要确保要使用管理员权限来运行程序。如果你用普通用户配置主机的时候看到一些古怪的提示，一定要保证你是用管理员权限来运行Cygwin。当你退出的时候，会提示你是否继续运行工作任务，你可以输入“no”来结束它们。<br/><br/>　　最后，如果你测试从其他电脑访问SSH的时候出现错误提示，确保防火墙没有阻止访问端口22（如果是使用SFTP对应的端口是23）。<br/><br/>--------------------------------------------------------------------------------<br/><br/>　　如果你想熟练使用shell并通过SSH/SFTP来访问你的Windows 7系统，这的确是一个不错的方法。如果你愿意的话，在Cygwin上还可以将Windows的硬盘分区挂在到“/cygdrive/driveletter”。<br/>Tags - <a href="http://zhoujin.com/tags/cygwin/" rel="tag">cygwin</a> , <a href="http://zhoujin.com/tags/openssh/" rel="tag">openssh</a> , <a href="http://zhoujin.com/tags/git/" rel="tag">git</a> , <a href="http://zhoujin.com/tags/ssh/" rel="tag">ssh</a> , <a href="http://zhoujin.com/tags/unix/" rel="tag">unix</a> , <a href="http://zhoujin.com/tags/linux/" rel="tag">linux</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/167/</link>
<title><![CDATA[马上会跌，跌破一千(韩寒)]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Wed, 23 Feb 2011 09:50:09 +0000</pubDate> 
<guid>http://zhoujin.com/post/167/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最近我发现我钱包里老是没有钱，吃饭的时候掏出来只剩下几张十块，好在一碗面还能买。我开始思考，我一般出门都会往钱包里放个一千多块钱，何以呢。后来我终于想明白了，加满一次油需要六百，几个朋友一起随便吃个饭在花掉两三百，来回高速公路花去五十，在不给自己买任何东西的情况下，一千块就差不多了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我不由感叹，那些收入两三千的朋友们，在这个城市里是如何生活的，当然你可以说他们不用加油，但毕竟你要过三十天日子，还要住。这个城市的大部分设施都不属于他们，他们唯一能做的就是看，好在我府慈悲，看城市并不需要缴养眼税。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;回去的路上，我便开始回想。记得2000年，我刚出版第一本书，当时买了一台富康，因为那时只有富康桑塔纳和捷达，富康显得最动感时尚。当时还没有时尚这个词。唯一的遗憾就是名字土气了一点。当时油价3元，加满一箱油1百多，我出门带1000的习惯就是那个时候养成的，这点钱已经够我开到欧洲了。当时父母要我买房子，并不是因为要改善居住条件，也不是因为要投资炒楼，而是因为当时上海市房地产低迷，于是政府出台一个政策，购买商品房，退已缴纳的个人所得税。当时上海郊区的房价几百到一千元，市中心三千元，我说，这房价太贵了，太不合理了，市中心三千元一米，买一百平要三十万，老百姓要干十多年才能买得起房子，这是虚高的。干五年，买个一百平的房子，才是合理的。房价虚高了一倍。不能买。马上会跌，跌破一千。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;后来我去了一次香港，觉得香港太贵了，怎么吃一个盖浇饭要四五十港币，当时港币和人民币是1比1.2左右，我在香港打了一次车，花了一百多人民币，觉得太不可思议了。一问香港的房价，都要几万元一米，酒店都要上千元一天，回到上海，身心舒畅。<br/>2001年，我去了北京。我在望京租了一个房子，两室两厅两卫，房租一千多。当时版税都去练车改车了，差点连房子都没租起。后来终于积下五万块，在北京买了一套房子，当时房价是3800，我买了六十平，首付五万，月供一千二。房子位于管庄，名字很洋气，叫柏林爱乐。每天需要走京通高速从双桥出口下，令我疑惑的是，为什么这个房子是朝阳区的，但是我开车去通县狗市只要五分钟，而去朝阳公园却要半小时。但是很快，我发现，京通高速走到头连着就是长安街。于是，我很简约的告诉我父母，我住在长安街沿线。乡亲们又是一顿乱传，等我回老家，他们都羡慕的问我，听说你住在天安门边上，见到过国家领导人么？我说，我虽然不常见到，但我常嗅到，每当京通高速不通了以后，我就知道国家领导人要出来了，放行以后，我就能嗅嗅他们十几分钟前经过的尾气。<br/>当时的油价还是三块多。我对朋友说，油价太贵了，得跌到一块才合理。要不然老百姓一个月工资就加几箱油，不合理。当时北京新源里都是站街的失足妇女，一失足只需要一百五十元，失足一夜两百元。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;后来，由于我在北京迷失了，而且再迷失下去也要失足了，我就回到了上海。到了松江，租了一个房子，两室两厅两卫，租金三千元。当时油价四块多，我对朋友说，如果油价突破了五块，按照老百姓现在的收入，就是个大笑话。当时松江还没有一个五星酒店，我租在开元新都，一个新的小区，在大学城的对面。当时那里房价五千。朋友说，你买一个房子吧，但当时我实在买不起房子，我经过松江新城区密密麻麻的新楼盘，销售率是百分之一百，入住率是百分之一，我对朋友说，这里肯定要崩盘，这么多房子，哪有这么多人去住啊，五千一平方，就是个大笑话，按照老百姓现在的收入，得工作二十年才能买套两居室，等着吧，松江新城区迟早跌破一千，我预计五百元一平，到时候我再十万块钱买两百平。朋友说，你说的一向有道理，我现在买就砸在手里了，我要憋着。谢谢你给我的启发。<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;后来我给父母买了一个房子，当时在金山区朱泾镇，我贷款买了一个三居室，至今我依然非常喜欢那套房子，虽然不大，但是非常工整。当时房价是三四千，花了我所有的积蓄。房子楼下就是洗头的，洗头一次十元，洗车一次五元，打飞机三十元。当时我已经几乎停止写作，赛车刚刚起步，过了最苦的日子，进了全国最好的车队当主力车手，年薪八万元，但因为经常不幸获得第四名，奖金就没有，一年也有个十万多的收入。加上以前有些版税，我也很满意那样的生活，就是觉得这房子买的时候遇到了最高峰，以后肯定会跌进一千以内。不过让家人早些住的舒服点也是值得。我当时都忘了北京有个小房子，我在想，那破地方估计快跌破一千了吧。不去想省的烦心。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当年发生惊人事件，油价突破了五元。我想，这得游行了吧。当然，我错了。国民们真的很好，统治者如果能摊上中国，那真是莫大的福气。<br/> <br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;后来就是一长串的省略号，就不细说了。那个要憋着的朋友我也再没见着。我的跌破一千的预言也时常被各种朋友们提起，有一天一个朋友说，你丫的直觉太准了，真的跌破一千了，不过不是楼市，是股市。我不炒股，但知道个大概，我说，什么，股市跌成三位数了？朋友说，是啊。我说，哦，你最近忙什么呢。朋友说，我一直相信你的老百姓买不起就是硬道理，楼市必然跌破一千的理论，于是我就去炒股了。<br/> <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;到了今天，油价已经在接近十元了。我觉得油价应该更高，高到让那些不顾大局不顾领导利益动不动要自焚的刁民们连一升汽油都买不起，这就从根本上杜绝了这类事件的发生，而房价也应该更高，高到根本就够不着，这样才能让那些非要房子不可的姑娘们都嫁给有钱人，保障我国的年轻男人一心创业，心无杂念，身无压力。税率也应该更高，个人所得税百分之八十，不光买房子要交房产税，生孩子还要交产房税，政府破坏环境以后老百姓要交纳环境保护税，赚了要交利润税，亏了要交经验税，死人要交遗产税，壮丁要交遗精税，男人要交睡人税，女人要交被睡税，至于为什么这样更好，反正我也不知道，只知道小时候墙上就写着，纳税光荣。能把字用红色写在墙上那么大而且不被擦掉的，都是不能惹的。<br/> <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;至于我，还是习惯了揣着一千块钱出门，只是前几天去了一次香港，觉得那里物价怎么这么便宜。今天去肯德基，买了一个甜筒，给了两块钱，服务员说，三块。可能是肯德基麦当劳涨的少，我还停留在汉堡十元的年代里。但是有一个喜讯，在房价油价电费水费齐涨的今天，终于有一样政府收费项目减价了，而且一减就减去了将近一半的价格，而那些涨价的项目往往每次只涨一两成，说明政府该大方的地方还是很大方的——登记结婚从9元降到了5元，也就是说，如果你一辈子结婚三次，政府为你省去了足足十二块。谢谢。<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%25AF%2592/" rel="tag">韩寒</a> , <a href="http://zhoujin.com/tags/%25E6%2588%25BF%25E4%25BB%25B7/" rel="tag">房价</a> , <a href="http://zhoujin.com/tags/%25E7%2589%25A9%25E4%25BB%25B7/" rel="tag">物价</a> , <a href="http://zhoujin.com/tags/%25E7%2594%259F%25E6%25B4%25BB/" rel="tag">生活</a> , <a href="http://zhoujin.com/tags/%25E6%2588%2590%25E6%259C%25AC/" rel="tag">成本</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/165/</link>
<title><![CDATA[组件化：企业级大型项目必经之路]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[项目管理]]></category>
<pubDate>Wed, 16 Feb 2011 05:56:37 +0000</pubDate> 
<guid>http://zhoujin.com/post/165/</guid> 
<description>
<![CDATA[ 
	超过一年以上、活跃开发的项目往往到后期陷入了一些共性的问题：<br/><br/>构建速度慢，往往生成一次最终输出产物需要一小时以上；<br/>架构复杂：虽然说架构本身可以用类似于MVC/Service Bus之类的通用进行描述，但实际上使架构变得复杂的往往是业务本身；<br/>开发速度慢，构建速度是因素之一，它使得持续集成的反馈大大低于预期；然而这类大的项目往往被通过各种技术手段进行了分层、分project的切割，你要面对的可能不是一个project，而是一组项目群。我之前参与过、咨询过的项目里，开发人员打开IDE要面对的project少则几十个，多则上百个。即便以目前最强劲的开发机器，面对这动辄几十万上百万行的代码，依然显得力不从心。<br/>以及由上面而引来的一系列问题：例如新人培养，知识传递等等。<br/>在提出这些问题的解决方案之前，我们看看这些问题是如何产生的。通常需要很长时间这些问题才成为问题，而且往往在一开始出现的时候，总有一些快速而有效的解决方案去掩盖，进而加剧了问题的升级，最终成为一个旷日持久需要大量人力才能解决的问题。<br/><br/>项目的产生<br/><br/>新的项目来了。团队成员兴奋的引入了最新的MVC技术框架（比如SpringMVC/ASP.NET MVC）、持久框架、依赖注入框架等等。现在流行的迭代开发方法也被引入。于是前几个迭代过去了，Domain, Service, Web等，分层良好的应用产生了。需求也快速的实现了。代码非常健康。构建速度非常快。所有人都很高兴。<br/><br/>2个月过去了。有心的团队成员不断的重构着代码，确保重复的逻辑、重复的代码被消除。新的人加入了团队。新的业务需求也来了。这些不断重构的代码进一步被不断重构着：终于引发了一些问题：由于只有一条主线：Domain -> DAO -> Service -> Web, 在并行开发下（比如同时有5-8个并行工作）那么公共使用的那条线会不断的产生代码合并冲突/或者业务逻辑冲突。<br/><br/>这不算一个多严重的问题。然而这个问题却制约了团队的规模扩张。比如需要更多的人加入这个项目的时候，耗费在沟通上的时间会大大增加，新加入的成员有效生产力也难以得到提升。<br/><br/>并不算太难解决的的问题。现在团队还不大。团队的架构角色只需要花上一个周末的时间，将现有的代码按照业务逻辑进行纵向切分，划分为不同的小项目，问题算是基本解决。<br/><br/>问题来了<br/><br/>更多的代码被提交。构建速度从2分钟上升到6分钟的时候有人抱怨了一下，于是花点时间优化了构建脚本，时间减少到5分钟。代码继续增长——这是不可避免的趋势——构建时间继续加长，从5分钟上升到11分钟的时候，大家的工作习惯开始发生了一些变化：一旦开始构建，就开始跟旁边的伙伴聊聊天，或者趁这机会喝点咖啡。本地提交在这个时候与持续集成服务器有点不同——本地可能只运行少量的构建步骤、必要的测试，服务器则运行所有的。<br/><br/>从11分钟上升到23分钟的时候，大家觉得要做点什么了。升级了所有开发人员的开发机器，最新的四核8G内存的机器，酷毙了。分布式构建集群也被引入。原来需要23分钟，现在通过分布式之后时间回落到10分钟以内了。<br/><br/>更多的问题<br/><br/>需求在不断的扩张着。代码的规模随之膨胀着。构建时间不引人注意的增长着。直到几年后的一天，突然发现：<br/><br/>1. 即便已经使用分布式，构建需要一个小时<br/>2. 打开IDE面对的是72个项目<br/>3. 虽然能忍，但干什么都有点慢<br/>4. 架构呢？架构呢？<br/><br/>解决思路<br/><br/>大多数解决这类问题的思路仍然停留在表象层面：加机器（改善构建速度）、增强结对编程（改善交流）、写更多的Wiki（增加对代码的共识）。然而却逐渐忽略了一个事实，那就是：<br/><br/>这么庞大的“业务需求”，根本不是一个项目能够承载的。<br/><br/>让我们从代码层面开始。<br/><br/>一个大型项目需要在IDE里面打开数十个project. 这些project之间有着千丝万缕的联系——无论依赖被管理的多么好，没有人能够很清楚的知道他们之间如何被依赖的。更重要的是——大多数时间你都不会碰60%以上的project以及80%的代码。那么这些代码存在的意义何在？<br/><br/>因为你处在一个团队中，别人会用。<br/><br/>于是引用就成了依赖最强、最脆弱的代码引用。<br/><br/>那么，如果我们将这些项目的引用变成二进制引用呢（如JAR, DLL）？由于依赖的这些项目已经经过构建，那么编译的时间可以减少。你也只需要关注自己的项目。<br/><br/>听起来似乎太轻巧了。的确如此。如何获得这些二进制引用？对于JAR而言，假设一个Maven依赖仓库是必须的；对于DLL似乎没有太成熟的方案但总不是太难的问题。<br/><br/>这个过程之中有非常多的实现细节，很可能大多数团队在第一步：分析project依赖就跘住了脚。这么多的project想要拆开是很有挑战的事情，在业务需求的并行压力下，缺乏勇气的团队很可能止步于此。<br/><br/>这些依赖是组件吗？<br/><br/>在进行二进制引用的进程中，你应该不断的问自己这个问题：这个依赖是组件吗？还是只是一个简单的压缩包？<br/><br/>评估一个project是否为一个组件，在我看来有几个约束条件：<br/><br/>1. 是否有超过2个project依赖于它？注意，这里的依赖，不是IDE里面你指定的依赖，而是真实的、API调用的依赖。对于组件化意识不好的团队，这类项目往往成为临时代码堆放地，需要通过识别、迁移，才能将真正有用的组件提取出来。<br/><br/>2. 是否稳定？所谓稳定是指，在过去一段时间内（比如一个月），这个模块没有经过大的调整，API基本稳定，未来的变化只在于增加API的数量而非调整API的架构。<br/><br/>3. 自己依赖于外面的足够少。<br/><br/>通过这一步，往往你可以识别出项目中用到的公共组件、公共API等等。将他们组件化，通过Maven或者自己的依赖库管理起来，标记上版本，然后所有人使用二进制引用。通过这一步，构建时间应当大幅度减少。通过这一过程的梳理，哪些是核心业务逻辑、哪些是可以独立考虑的第三方辅助库，应当可以有一个更为清晰的理解。更重要的是，这些组件可以独立开发、升级、优化，丝毫不会影响到主线的开发过程。<br/><br/>组件是库（Library）还是服务（Service）?<br/><br/>经过上面一步，可能项目中仍然存在一些项目依赖，这些项目往往是公共的，通过API调用的。例如，在某一个银行业务中，支付模块被很多其他业务依赖。支付模块有很多代码，也需要在主进程中与其他模块一起被部署。但支付模块实在是太独立了，虽然与其他的domain之间存在一些类上的简单交互。<br/><br/>采用上面步骤的方法不太合适，原因之一就是它是运行时才有效的依赖——它整体上是一个服务，而非一个静态的库。这个时候你可以考虑将其彻底独立，成为一个独立的service。它的形态可以是一个操作系统服务，或者独立部署的应用。然后写一组标准的轻量级API如REST/WebService来对其进行交互。这样这部分也独立出去了。<br/><br/>重要的考虑<br/><br/>上面看起来轻巧的过程实际上在操作过程中需要耗费很长很长很长的时间。原因之一是组件很难识别。然而难以识别的原因并非是这个过程很难，而在于我们在完成一个项目的过程中倾向于将所有的东西放到一起，顶多通过project区分但仍然缺乏真正物理意义上的隔离。这是一个认知上的障碍，特别是我们面对的是“项目”而不是“产品”。“项目”这个词本身就透露着短期的、目的性强的意义。识别出来的组件本身短期并不会给团队带来多大的好处，反而会增加工作量。就像所有的知识积累工作一样，它们的好处与他们的投入在因果关系上并不连续。<br/><br/>我们得到了什么？<br/><br/>这并非一个理想化的描述，最终我们得到的是：<br/><br/>1. 真正物理隔绝的一组项目群：能够独立构建、开发部署和升级<br/>2. 依赖仓库<br/>3. 分工明确的组件和服务<br/>4. 针对产品的版本和部署策略<br/><br/>(完)<br/><br/>PS. 这里我所说的项目是指业务需求，project(英文)是指代码组织的一种形式例如eclipse/Visual Studio等IDE的“项目”。关于架构的术语之争从未停止过。这篇文章中大量用到了“框架”、“组件”、“库”、“服务”等词汇，也许跟你平时看到的不一样，如果有迷惑之处请谅解并指出。<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%25A1%25B9%25E7%259B%25AE%25E7%25AE%25A1%25E7%2590%2586/" rel="tag">项目管理</a> , <a href="http://zhoujin.com/tags/mvc/" rel="tag">mvc</a> , <a href="http://zhoujin.com/tags/.net/" rel="tag">.net</a> , <a href="http://zhoujin.com/tags/dao/" rel="tag">dao</a> , <a href="http://zhoujin.com/tags/web/" rel="tag">web</a> , <a href="http://zhoujin.com/tags/domain/" rel="tag">domain</a> , <a href="http://zhoujin.com/tags/%25E6%259E%25B6%25E6%259E%2584/" rel="tag">架构</a> , <a href="http://zhoujin.com/tags/%25E5%259B%25A2%25E9%2598%259F/" rel="tag">团队</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/164/</link>
<title><![CDATA[Git 常用指令]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[版本控制]]></category>
<pubDate>Mon, 24 Jan 2011 03:04:43 +0000</pubDate> 
<guid>http://zhoujin.com/post/164/</guid> 
<description>
<![CDATA[ 
	git init&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 將當前資料夾進行 Git 初始化<br/> <br/>git add .&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 將當前資料夾內所有檔案加入 Git 追蹤（tracking 或 staging）<br/>git add 檔案名稱&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 把當前資料夾內某個檔案加入 Git 追蹤（tracking 或 staging）<br/> <br/>git commit -a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 將目前的變動送繳 Git 進行紀錄，會進入編寫修改訊息的畫面<br/>git commit -a -m "*"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # commit 時直接寫入修改訊息，不進入編寫修改訊息的畫面<br/> <br/>git tag v1.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 將當前 commit 過後的檔案版本命名為 v1.0<br/> <br/>git status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查詢從上一次 commit 到現在，資料夾裡有哪些變化，各個檔案處於什麼狀況<br/> <br/>git diff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 比較所有檔案的內容與上一次 commit 時有何差異<br/>git diff v1.0 v2.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 比較 v1.0 與 v2.0 兩個版本間所有檔案的內容<br/>git diff v1.0:檔案名稱 v2.0:檔案名稱&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 比較 v1.0 與 v2.0 兩個版本間某個檔案的內容<br/> <br/>git log&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查詢所有版本的修改狀況，顯示各版本的 hash 編號<br/>git log -p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查詢哪幾行被修改<br/>git log --stat --summary&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查詢每個版本間變動的檔案跟行數<br/> <br/>git show v1.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查詢 v1.0 版裡的修改內容<br/>git show v1.0:檔案名稱&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查詢某個檔案在 v1.0 時的內容<br/> <br/>git show HEAD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 看此版本修改的資料<br/>git show HEAD^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 看此版本前一版的修改的資料<br/>git show HEAD^^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 看此版本前前一版的修改的資料<br/> <br/>git grep "*" v1.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查詢 0.01 版裡頭有沒有某些內容<br/>git grep "*"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查詢現在的版本裡有沒有某些內容<br/> <br/>git branch&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 查看現有的分支<br/>git branch 分支名稱&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 建立新的分支<br/>git branch 分支名稱 v1.0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 依照 v1.0 版本裡的內容來建立一個分支<br/>git branch -d 分支名稱&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 刪除某個分支 <br/><br/>git merge 某個分支名稱&nbsp;&nbsp;&nbsp;&nbsp;# 將當前所在的分支與某個分支合併，如果出現衝突，會紀錄在有衝突的檔案中<br/> <br/>git checkout master&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 切換到主幹上<br/>git checkout 分支名稱&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 切換到某個分支上<br/> <br/>git checkout HEAD&nbsp;&nbsp; # 將所有檔案恢復到上次 commit 的狀態<br/>git checkout -- 檔案名稱&nbsp;&nbsp; # 將某個檔案恢復到上次 commit 的狀態<br/> <br/>git reset --hard 某個版本的 hash 編號&nbsp;&nbsp; # 整個 Repository 恢復到某個版本的狀態<br/> <br/>git count-objects&nbsp;&nbsp;&nbsp;&nbsp; # 分析 Git 資料庫狀況，計算鬆散的物件<br/>git gc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 維護 Git 資料庫，重組物件<br/>git fsck --full&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 應該是類似 Git 磁碟重組之類的東西<br/>Tags - <a href="http://zhoujin.com/tags/git/" rel="tag">git</a> , <a href="http://zhoujin.com/tags/%25E6%258C%2587%25E4%25BB%25A4/" rel="tag">指令</a> , <a href="http://zhoujin.com/tags/%25E5%2591%25BD%25E4%25BB%25A4/" rel="tag">命令</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/166/</link>
<title><![CDATA[人性之根：贪、烦、畏]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Fri, 21 Jan 2011 02:07:23 +0000</pubDate> 
<guid>http://zhoujin.com/post/166/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;人降生于世，很有些像马戏团里空中飞人的坠落入网，甚至比那还要不及，因为那只是一张身外的护网，既不至让你跌损，又不会死缠住你不放。但人生却无有不陷入身内的心性之网者，且此网既要伤人，还要叫你永世不得脱身，这就是由贪、烦、畏编织而成的三个连环罗网：无“贪”则不足以激发进取；进取则必然导致“烦忙”与“烦神”；烦而无功、贪而不得则“畏”立刻油然而生，由以逼迫你卷入更紧张的贪欲之中。海德格尔因此将人生面世称作“沉沦”，并就“烦”与“畏”说了许多诘屈聱牙的思辨话语，然终究未能讲清造成如此尴尬结局的人性根源。 ­<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;“人性”是什么？一言以蔽之：“人性”是“物性”的集成和发扬。 ­<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;那么，“物性”又是什么呢？这就必须从头说起了。世上原本没有“物”，在宇宙发生以前，“物”可能只是某种能量分布状态，爱因斯坦的质能互换方程E＝mc2 (E代表能量，m代表质量，c代表光速。)大约就是对它的写照。譬如，所谓“原子能”，就是指由千分之七的原子核质量转化释放的能量。由于处在这个阶段上的“非物质”或“前物质”极度稳定，它不需要有任何属性，因此一切物理的或数学的探测方法到它那里都一概失效，是谓“奇点”。宇宙大爆炸其实就是能量转化为质量的过程，同时它也启动了分化衍续的自然进程。 ­<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;最原始的物质形态是基本粒子，它成为宇宙中所有物质的基本“质料”。也就是说，此后一切演化而来的东西都不过是基本粒子的暂时表现“形式”或临时寄居“空壳”。譬如原子是粒子的寄居壳；分子是原子的寄居壳；细胞是分子的某种编码形式；有机体又是细胞的寄居体；最后，社会是有机体的寄存形态；如此等等。这就是亚里士多德“从质料到形式”的哲学猜想，也就是二十世纪科学发展打破物类界限的所谓“万物一系”的道理。奇怪的是，恰恰是这些“形式”或“空壳”具有越来越多的属性、能耐或智慧，而且，属性越丰、能耐越强或智慧越高的物态或物种，其存在效价或生存力度反而越衰微。换一个表述方式的话，也可以这样说：自然物态的进化演动，倾向于将后衍的高级物种抛入日益加深的生存危机和生存焦虑之中。 ­<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其他方面的问题姑且不谈，我们现在先来考察一下有关“生存焦虑”趋于深化的原因。 ­<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;自宇宙勃发以来，世事始终是分化演进的。从粒子、原子、分子到生物，物态种类变得越来越丰富。这个以几何级数或指数递增的方式暴涨起来的物类，成为一切后来者难以处置的巨大麻烦。因为分化无异于致残，而残者必求互补，属性就被这互补的要求所激发。譬如，粒子一旦分化，电磁感应属性等物理作用力随之发生，作为残体的各个粒子便要借助此类属性，将自身聚合为原子乃至分子。再譬如，细胞一旦分化，作为残体的各个细胞便会生出某种类似于免疫识别能力的辨认属性，从而又将各分化者收拢为一，是乃“多细胞有机体”。也就是说，分化者具有某种永恒的回归为一的倾向。“分化”造就了“条件”，“条件”造就了“依存”，此一分化者必成彼一分化者的条件，任一分化者在失去作为自身条件的其他分化者时都难以独存。分化进程使条件递繁，条件递繁使属性递增，属性递增又使依存的要求愈发强烈，条件化的自然演历就这样令层层进化的物种步步坠入“有条件存在”的无底深渊——从而使一切后衍者变得越来越焦虑，越来越贪婪！ ­<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;贪婪因此成为人类不可缓和的心境，因为这心境原本就建立在不可化解的自然处境上。一句话，人性（人的属性）是物性（物的属性）的承传和发扬，人性中贪欲的深化程度与自然物演的条件化程度成正比。如果你是一个质子，则你的贪欲只限于获得一个电子就足以令你稳定在氢原子的存境上（氢原子由一个质子和一个电子组成）。如果你进化为氦核（由两个质子与两个中子构成），则你的贪欲必将上升到获取两个电子才行（氦原子的K壳层电子数为2）。如果你还不甘寂寞，又让自己进化成碳核，那么，你的贪欲就有些不好遏制了。首先你得竭尽全力地为捕获6个电子而奋斗，非此不能成全自身的元素“物格”（相对于“人格”而言）；然后，由于你的外壳层电子数仅此尚未达到满足（L壳层电子数的满足值为8，碳原子为4），你还得再去拚抢其他元素的外壳层电子，由此形成有机化合物；到了这一步，你想清高也清高不成了，因为有机分子是很难稳定的，它逼迫着你必须贪得无厌地追拉其他各种元素甚至同类碳元素，结果终于演成生物大分子乃至原始低等生物。从此，你的贪欲一下子跃迁到生物代谢的高度，并随着生物的进化而越来越贪心万丈。直到有一天，你变成了人，贪欲也达到极致——作为人，你贪无餍足是因为烘托你生存的条件太多，你只有借助强烈的贪欲才能在支撑自身生存的条件海涛里沉浮，假若你超然物外，不求进取，你就会失去做人的资格——“贪”由此而被奠定为人性中根深蒂固的基层规定。 ­<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;人处在物演进化序列的最后端，亦即飘浮在条件分化量最纷纭的至高处，因此他的属性也就最丰满。这属性早已从理化状态的“感应”、经由低等生物的“感性”、高等动物的“知性”而发展到人类独有的“理性”阶段。然而即便是这个“理性属性”，它也和当初无机物态的“感应属性”一样，只是为了获取自存的条件，此外别无任何其他的意义。而且麻烦之处在于，感应属性足以让理化物质占尽自身所需的全部条件，就像作为氦原子核的质子满足于占有两个电子那样。可是到了人，他即使用尽自己理性属性的浑身解数，也仍然无法达成满足，因为这世界上的所有分化物全都是他的依存对象，而他又不可能同时占据如此之多的对象全体，这不免使他随时陷于如下两种窘境：条件太过杂多而致“烦忙”无休；条件占之不足而致“烦神”不已；于是——“烦”也就被弄成了人性中无可消解的心理状态。 ­<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;出于同一机制，宇宙的条件化演进，必使越后衍的物种其存在度越弱，这种情形是典型的累卵之危。每一个条件就象是一枚鸡卵，你需要的生存条件越多，相当于把众多鸡卵垒得越高，你置身于那高高叠起的累卵之上，心里岂能不疑惧忐忑！倘或其中的某一个必需条件突然崩溃，就像那叠罗汉似的某一鸡卵骤然碎裂，你的整个生存基础不免立刻轰然坍塌。更何况，世事纷纭，变幻无常，所变者，无非是生存条件的消长不定。这是一个很简单的算术问题，假设在日常生活里，各种内外条件发生变化的概率是万分之一，那么，如果你的存在方式简单得像分子物质一样，譬如说所需的各种依存条件总共只有十项，则每一千天才可能发生一次冲击；如果你的生存方式复杂得像一只动物，譬如说所需的各种依存条件共有一百项，则每一百天就会发生一次让你不得不对生活有所调整的变故；进一步讲，如果我们文明人的生存条件随着科学技术的日新月异而增长到一万项以上，那么你将每天都得面对一桩令你心惊肉跳的变局，此情此景，怎能叫人泰然处之？——“畏”就这样逐渐沉淀为人性中与生俱来的情愫之一。 ­<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于衍存条件必趋繁化的自然演历，人们通常非但不能理解其间潜藏的可怕涵义，反倒为之大唱赞歌，这真是一幕上天戏弄人类的绝佳表演。所以，当你看到身为东方亚圣的孟子赞叹“万物皆备于我”时，你不要以为那只是孟子一人的浅薄，他其实代表了整个人类的盲目无知。古希腊哲人普罗泰戈拉干脆说得更加狂妄：“人是万物的尺度”，仿佛万物的存在或不存在都要由人来摆布和衡量似的。殊不知，这话反过来说可能会显得更恰当一些：万物演化的齐备状态正是人类生存危机的天然尺度！ ­<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;上述三者——即“贪”、“烦”、“畏”——其实就是人类生存效价式微的内质虚弱指标，或者说，是物性动摇的人格化体现。它们相辅相成地建构起人类“生存焦虑”的基本框架，并把这种导源于“物性”演化流程上的阴影彻底烙在了“人性”的最深处。有鉴于此，你对改善或疗救人类贪婪的本质、烦躁的心性以及懦怯的痼疾还能抱有什么指望呢？ ­<br/>Tags - <a href="http://zhoujin.com/tags/%25E4%25BA%25BA%25E6%2580%25A7/" rel="tag">人性</a> , <a href="http://zhoujin.com/tags/%25E8%25B4%25AA/" rel="tag">贪</a> , <a href="http://zhoujin.com/tags/%25E7%2583%25A6/" rel="tag">烦</a> , <a href="http://zhoujin.com/tags/%25E7%2595%258F/" rel="tag">畏</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/163/</link>
<title><![CDATA[所谓业务系统]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[项目管理]]></category>
<pubDate>Wed, 05 Jan 2011 12:49:05 +0000</pubDate> 
<guid>http://zhoujin.com/post/163/</guid> 
<description>
<![CDATA[ 
	业务软件。很多业务软件都只是功能的堆砌。<br/>说得更具体一些，只是数据库表的一个直接的展现：增删改查某一项信息，以表的形式显示查询结果等等。粗制滥造的功能肆无忌惮的充斥着使用者的眼球，丝毫不顾及用户在使用的过程中的心理的引导和除功能之外的满足。<br/>一个好的产品，核心功能的完成也许很小部分的完成，但更多的，如何将产品成为一个艺术馆，引导用户一步步发现并获得满足，才应该是在满足功能之外需要更多考虑的方面。<br/><br/>引申:<br/>你要的完美是什么？这是一个值得思考的问题。有时候我们被完美蒙蔽了眼睛，过多的专著于某些细节不能自拔而对主功能产生忽视。精雕细琢的局部完美往往耗时过久，如果这些不能在真正意义上产生巨大的价值那么就是一种更为巨大的浪费。<br/><br/>完美不完美，取决于产物想向外界传达的意图。只有充分理解了这些意图，才能真正明白完美的局限性 – 不是处处完美，而是在必要的地方。<br/>Tags - <a href="http://zhoujin.com/tags/%25E7%25B3%25BB%25E7%25BB%259F/" rel="tag">系统</a> , <a href="http://zhoujin.com/tags/%25E4%25B8%259A%25E5%258A%25A1/" rel="tag">业务</a> , <a href="http://zhoujin.com/tags/%25E5%25AE%258C%25E7%25BE%258E/" rel="tag">完美</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/161/</link>
<title><![CDATA[2011年开始了]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Fri, 31 Dec 2010 16:00:00 +0000</pubDate> 
<guid>http://zhoujin.com/post/161/</guid> 
<description>
<![CDATA[ 
	2011年开始了，同志总结说：<br/>你病，或者不病倒，老板就在那里，不悲不喜;<br/>你休，或者不休假，工作就在那里，不来不去;<br/>你拼，或者不拼命，工资就在那里，不增不减;<br/>你辞，或者不辞职，地球还是会转，不歇不停.<br/>Tags - <a href="http://zhoujin.com/tags/%25E7%2594%259F%25E6%25B4%25BB/" rel="tag">生活</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/162/</link>
<title><![CDATA[客户的需求]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[项目管理]]></category>
<pubDate>Wed, 01 Dec 2010 18:03:15 +0000</pubDate> 
<guid>http://zhoujin.com/post/162/</guid> 
<description>
<![CDATA[ 
	 某富翁想要娶老婆，有三个人选，富翁给了三个女孩各一千元，请她们把房间装满。<br/>第一个女孩买了很多棉花，装满房间的1/2。<br/>第二个女孩买了很多气球，装满房间3/4。<br/>第三个女孩买了蜡烛，让光线充满房间。 <br/>最终，富翁选了胸部最大的那个。<br/>——这个故事告诉我们：了解客户操蛋的真实需求非常重要。<br/>Tags - <a href="http://zhoujin.com/tags/%25E5%25AE%25A2%25E6%2588%25B7/" rel="tag">客户</a> , <a href="http://zhoujin.com/tags/%25E9%259C%2580%25E6%25B1%2582/" rel="tag">需求</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/160/</link>
<title><![CDATA[搞笑又高效的算法（鸡兔同笼）]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Fri, 19 Nov 2010 14:25:02 +0000</pubDate> 
<guid>http://zhoujin.com/post/160/</guid> 
<description>
<![CDATA[ 
	头12，脚40，鸡兔各几只<br/>算法：<br/>假设鸡和兔训练有素<br/><br/>吹一声哨，它们抬起一只脚，(40-12=28)<br/><br/>再吹一声哨，它们又抬起一只脚，(28-12=16)<br/><br/>这时鸡都一屁股坐地上了，兔子还两只脚立着<br/><br/>所以，兔子有16/2=8只，鸡有12-8=4只。<br/><br/>这就是高效的算法!&nbsp;&nbsp;<br/>Tags - <a href="http://zhoujin.com/tags/%25E7%25AE%2597%25E6%25B3%2595/" rel="tag">算法</a> , <a href="http://zhoujin.com/tags/%25E9%25B8%25A1/" rel="tag">鸡</a> , <a href="http://zhoujin.com/tags/%25E5%2585%2594/" rel="tag">兔</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/159/</link>
<title><![CDATA[ORACLE中日期使用LONG型转换函数]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[HIBERNATE]]></category>
<pubDate>Fri, 29 Oct 2010 13:17:00 +0000</pubDate> 
<guid>http://zhoujin.com/post/159/</guid> 
<description>
<![CDATA[ 
	因为各种原因，如比较、多时区等。数据库有关时间都保存了UTC时间（LONG型）。<br/>对于程序来说是很方便了。但是对于基于PL/SQL之类的工具来处理就比较麻烦了。<br/>所以才有如下两个函数：<br/>1.LONG_TO_DATE<br/><div class="code">create or replace<br/>function LongNumber_To_Date(in_number NUMBER) return date is<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp; return (TO_DATE(&#039;19700101&#039;,&#039;yyyymmdd&#039;) + in_number/86400000 +TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))/24);<br/>&nbsp;&nbsp;end LongNumber_To_Date;<br/></div><br/><br/>2.DATE_TO_LONG<br/><div class="code">create or replace<br/>function Date_to_LongNumber(in_date IN DATE) return number is<br/>&nbsp;&nbsp;begin<br/>&nbsp;&nbsp; return( (in_date -TO_DATE(&#039;19700101&#039;,&#039;yyyymmdd&#039;))*86400000 - TO_NUMBER(SUBSTR(TZ_OFFSET(sessiontimezone),1,3))*3600000);<br/>&nbsp;&nbsp;end Date_to_LongNumber;<br/></div><br/>Tags - <a href="http://zhoujin.com/tags/oracle/" rel="tag">oracle</a> , <a href="http://zhoujin.com/tags/date/" rel="tag">date</a> , <a href="http://zhoujin.com/tags/%25E6%2597%25A5%25E6%259C%259F/" rel="tag">日期</a> , <a href="http://zhoujin.com/tags/%25E6%2597%25B6%25E9%2597%25B4/" rel="tag">时间</a> , <a href="http://zhoujin.com/tags/long/" rel="tag">long</a> , <a href="http://zhoujin.com/tags/%25E8%25BD%25AC%25E6%258D%25A2/" rel="tag">转换</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/158/</link>
<title><![CDATA[利用GIT架设团队代码管理.]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[版本控制]]></category>
<pubDate>Wed, 06 Oct 2010 02:37:15 +0000</pubDate> 
<guid>http://zhoujin.com/post/158/</guid> 
<description>
<![CDATA[ 
	如果使用git的人数较少，可以使用下面的步骤快速部署一个git服务器环境。<br/>1.生成 SSH 公钥<br/>每个需要使用git服务器的工程师，自己需要生成一个ssh公钥<br/>进入自己的~/.ssh目录，看有没有用 文件名 和 文件名.pub 来命名的一对文件，这个 文件名 通常是 id_dsa 或者 id_rsa.pub 文件是公钥，另一个文件是密钥。假如没有这些文件（或者干脆连 .ssh 目录都没有），你可以用 ssh-keygen 的程序来建立它们，该程序在 Linux/Mac 系统由 SSH 包提供， 在 Windows 上则包含在 git安装包里(另外注意一定要使用Git Bash来完成,而使用CMD下不能生成的):<br/><div class="code">$ ssh-keygen</div><br/>它先要求你确认保存公钥的位置（.ssh/id_rsa），然后它会让你重复一个密码两次，如果不想在使用公钥的时候输入密码，可以留空。<br/>现在，所有做过这一步的用户都得把它们的公钥给你或者 Git 服务器的管理者（假设 SSH 服务被设定为使用公钥机制）。他们只需要复制 .pub 文件的内容然后 e-email 之。<br/><br/>2. 架设服务器<br/>首先，创建一个 ‘git’ 用户并为其创建一个 .ssh 目录，在用户主目录下:<br/><div class="code">$ sudo adduser git<br/>$ su git<br/>$ cd<br/>$ mkdir .ssh</div><br/>当然的了也可以使用现有用户名.<br/><br/>接下来，把开发者的 SSH 公钥添加到这个用户的 authorized_keys 文件中。假设你通过 e-mail 收到了几个公钥并存到了临时文件里。只要把它们加入 authorized_keys 文件<br/><div class="code">$ cat /tmp/id_rsa.se1.pub &gt;&gt; ~/.ssh/authorized_keys<br/>$ cat /tmp/id_rsa.se2.pub &gt;&gt; ~/.ssh/authorized_keys<br/>$ cat /tmp/id_rsa.se3.pub &gt;&gt; ~/.ssh/authorized_keys</div><br/><br/>3.建立仓库<br/><div class="code">$ cd /opt/git<br/>$ mkdir project.git<br/>$ cd project.git<br/>$ git –bare init</div><br/><br/><br/>这时，开发人员就可以把它加为远程仓库，推送一个分支，从而把第一个版本的工程上传到仓库里了。值得注意的是，每次添加一个新项目都需要通过 shell 登入主机并创建一个纯仓库。我们不妨以 gitserver 作为 git 用户和仓库所在的主机名。如果你在网络内部运行该主机，并且在 DNS 中设定 gitserver 指向该主机，那么以下这些命令都是可用的：<br/><br/># 在一个工程师的电脑上<br/><div class="code">$ cd myproject<br/>$ git init<br/>$ touch README<br/>$ git add .<br/>$ git commit -m ‘initial commit’<br/>$ git remote add origin git@gitserver:/opt/git/project.git<br/>$ git pull origin master</div><br/><br/>这样，其他人的克隆和推送也一样变得很简单：<br/><div class="code">$ git clone git@gitserver:/opt/git/project.git<br/>$ vim README<br/>$ git commit -a ‘fix for the README file’<br/>$ git push origin master</div><br/><br/>用这个方法可以很快捷的为少数几个开发者架设一个可读写的 Git 服务。<br/><br/>补充:<br/>如果出现"bash: git-upload-pack: command not found"此情况在macx肯定会出现的<br/>要在服务器上做如下处理:<br/>1.如果GIT安装在目录"/usr/local/git/bin"下,我在增加一个.bash_profile配置文件<br/><div class="code">$nano ~/.bash_profile</div><br/>在文件内容为:<br/><div class="code">GIT=/usr/local/git/bin<br/>export PATH=$GIT:/usr/local/bin:/usr/local/sbin:$PATH</div><br/>保存好文件后.再执行命令:<br/><div class="code">ln -s .bash_profile .bashrc</div><br/><br/>下面去客户机试一下,成功了吧..工作了吧.<br/><br/>再次补充一下安全防护的:<br/>作为一个额外的防范措施，你可以用 Git 自带的 git-shell 简单工具来把 git 用户的活动限制在仅与 Git 相关。把它设为 git 用户登入的 shell，那么该用户就不能拥有主机正常的 shell 访问权。为了实现这一点，需要指明用户的登入shell 是 git-shell ，而不是 bash 或者 csh。你可能得编辑 /etc/passwd 文件<br/><div class="code">sudo vim /etc/passwd</div><br/>在文件末尾，你应该能找到类似这样的行：<br/><div class="code">git:x:1000:1000::/home/git:/bin/sh</div><br/>把 bin/sh 改为 /usr/bin/git-shell （或者用 which git-shell 查看它的位置）。该行修改后的样子如下：<br/><div class="code">git:x:1000:1000::/home/git:/usr/bin/git-shell</div><br/>现在 git 用户只能用 SSH 连接来推送和获取 Git 仓库，而不能直接使用主机 shell。尝试登录的话，你会看到下面这样的拒绝信息：<br/><div class="code">$ ssh git@gitserver<br/>fatal: What do you think I am? A shell? （你以为我是个啥？shell吗？)<br/>Connection to gitserver closed. （gitserver 连接已断开。）</div><br/><br/>Tags - <a href="http://zhoujin.com/tags/git/" rel="tag">git</a> , <a href="http://zhoujin.com/tags/scm/" rel="tag">scm</a> , <a href="http://zhoujin.com/tags/%25E6%259C%258D%25E5%258A%25A1%25E5%2599%25A8/" rel="tag">服务器</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/154/</link>
<title><![CDATA[Ubuntu中万恶的Upstart]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Sun, 19 Sep 2010 14:30:32 +0000</pubDate> 
<guid>http://zhoujin.com/post/154/</guid> 
<description>
<![CDATA[ 
	PS：今天在服务器上安装了。ubuntu-10.04-server-amd64版本。<br/>因为要安装oracle企业版本。所以又在线安装了GNOME基本版本。<br/>ORACLE安装好了，以及LDAP，JDK，TOMCAT都初建了好。<br/>做到最后收尾工作了，修改一下启动方式吧，让系统以后启动自动进入文本模式。<br/>问题来了。以前改变INIT值的方式不行了。<br/>最后总算找到万恶的根源:Upstart<br/><br/>1.Debian下的三大神器sysv-rc-conf， update-rc.d，rcconf，全部不起作用，明明里面已经显示GDM是不启动了，可是他还是启动。<br/>2.自己切换到rc3.d下面去看，就发现问题了，根本就没有gdm的启动连接<br/>3.网上找了一些资料，都是非常陈旧的，比如，已经被10.04里面的upstart废弃的event.d，也是频繁出现在所谓的教程里面。<br/>4.在Ubuntu下，运行级别的定义被迁移到了 /etc/init/rc-sysinit.conf，当然，他们在这里面加入的对inittab的支持，但是若按照同systemd一样的标准来看，这些shell脚本是“有害的”！<br/><br/>最后总算找到解决办法，实际上有两种方法：<br/>1.内核级别的:<br/><div class="code">nano /etc/default/grub</div><br/>修改<br/><div class="code">GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”</div><br/>为：<br/><div class="code">GRUB_CMDLINE_LINUX_DEFAULT=” text”</div><br/><br/>然后运行下sudo update-grub2就可了<br/>其实这个方法也可以在开机的时候按下grub2中的e，手动编辑为text，但是那是一次性的<br/><br/>2.基于upstart的”正统”方法：<br/>ubuntu的upstart的体系下，/etc/init.d里面基本上都是连接到/lib/init/upstart-job的软连接，所以，对 initscripts的请求全部转化为upstart事件，upstart系统对启动项目的管理全部根据/etc/init里面的配置文件来启动，可以启动gdm的事件就让人咂舌<br/><div class="code">start on (filesystem<br/>and started dbus<br/>and (graphics-device-added fb0 PRIMARY_DEVICE_FOR_DISPLAY=1<br/>or drm-device-added card0 PRIMARY_DEVICE_FOR_DISPLAY=1<br/>or stopped udevtrigger))<br/><br/>stop on runlevel &#91;016&#93;</div><br/><br/>可见，一旦发生文件系统初始化，DBUS总线启动和发生graphics-device-added fb0 PRIMARY_DEVICE_FOR_DISPLAY=1 or drm-device-added card0 PRIMARY_DEVICE_FOR_DISPLAY=1 or stopped udevtrigger 这里面的任何一个事件，GDM就会被启动，只在运行级别在016的时候，GDM不启动。<br/>所以，事件也就明了了、要在upstart层面干掉gdm，把上面的启动相关事件注释掉，改写下就行了<br/><br/><br/><div class="code">start on (filesystem<br/>and started dbus<br/>and (graphics-device-added fb0 PRIMARY_DEVICE_FOR_DISPLAY=1<br/>or drm-device-added card0 PRIMARY_DEVICE_FOR_DISPLAY=1<br/>or stopped udevtrigger)<br/>and runlevel &#91;245&#93;)<br/>stop on runlevel &#91;0136&#93;</div><br/><br/><br/>所以，<br/>就算你清空整个rc3.d，upstart根本不管你。<br/><br/>如此这般，sysv-rc-conf， update-rc.d，rcconf，这三大神器，似乎就和残废了一样了<br/>Tags - <a href="http://zhoujin.com/tags/ubuntu/" rel="tag">ubuntu</a> , <a href="http://zhoujin.com/tags/gdm/" rel="tag">gdm</a> , <a href="http://zhoujin.com/tags/upstart/" rel="tag">upstart</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/157/</link>
<title><![CDATA[Ubuntu 10.04 X64安装Oracle 10G X64]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Sat, 18 Sep 2010 04:48:35 +0000</pubDate> 
<guid>http://zhoujin.com/post/157/</guid> 
<description>
<![CDATA[ 
	1.软件环境<br/>OS：ubuntu-10.04-server-amd64（在线升级安装了GNOME基本版本，详见<a href="http://zhoujin.com/post/155/" target="_blank">Ubuntu Server 安装图形桌面环境</a>）<br/>DB:10201_database_linux_x86_64.cpio.gz<br/><br/>2.ORACLE安装环境准备<br/>获取root权限：<br/><div class="code">sudo su -</div><br/><br/>执行如下代码：<br/><div class="code">apt-get install gcc gcc-multilib libaio1 libaio-dev lesstif2 lesstif2-dev libc6 libc6-dev-i386 libc6-dev-i386 libc6-i386 ia32-libs libelf-dev lsb-cxx make rpm build-essential unixODBC unixODBC-dev pdksh expat sysstat elfutils binutils binutils-dev binutils-source lesstif2 libc6 libc6-dev libmotif3 libstdc++6 alien</div><br/><br/>解决安装过程中出现"ctx/lib/ins_ctx.mk.."错误：<br/>执行如下代码：<br/><div class="code">cd /tmp<br/>wget http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc-3.3/libstdc++5_3.3.6-17ubuntu1_amd64.deb<br/>dpkg-deb -x libstdc++5_3.3.6-17ubuntu1_amd64.deb ia64-libs<br/>cp ia64-libs/usr/lib/libstdc++.so.5.0.7 /usr/lib64/<br/>cd /usr/lib64/<br/>ln -s libstdc++.so.5.0.7 libstdc++.so.5</div><br/><br/><div class="code">cd /tmp<br/>wget http://mirrors.kernel.org/ubuntu/pool/universe/i/ia32-libs/ia32-libs_2.7ubuntu6.1_amd64.deb <br/>dpkg-deb -x ia32-libs_2.7ubuntu6.1_amd64.deb ia32-libs<br/>cp ia32-libs/usr/lib32/libstdc++.so.5.0.7 /usr/lib32/<br/>cd /usr/lib32<br/>ln -s libstdc++.so.5.0.7 libstdc++.so.5</div><br/><div class="code">cd /tmp<br/>rm *.deb<br/>rm -r ia64-libs<br/>rm -r ia32-libs</div><br/>3.建立软链接解决一些安装过程中的错误信息<br/><br/>避免调用编译文件时idg4odbc出现错误：<br/><div class="code">ln -s /usr/bin/basename /bin/basename</div><br/><br/>避免执行脚本root.sh出错：<br/><div class="code">ln -s /usr/bin/awk /bin/awk</div><br/><br/>其他太多相关的脚本如下：<br/><div class="code">ln -s /usr/bin/rpm /bin/rpm<br/>ln -s /lib/libgcc_s.so.1 /lib/libgcc_s.so</div><br/><br/>4.更改配置<br/>备份sysctl.conf<br/><div class="code">cp /etc/sysctl.conf /etc/sysctl.original</div><br/><div class="code">nano /etc/sysctl.conf</div><br/>添加以下行到/etc/sysctl.conf中<br/><div class="code">kernel.shmall = 2097152<br/>kernel.shmmax = 2147483648<br/>kernel.shmmni = 4096<br/>kernel.sem = 250 32000 100 128<br/>fs.file-max = 65536<br/>net.ipv4.ip_local_port_range = 1024 65000<br/>net.core.rmem_default = 262144<br/>net.core.rmem_max = 262144<br/>net.core.wmem_default = 262144<br/>net.core.wmem_max = 262144<br/>vm.swappiness=5</div><br/><br/>更新系统运行：<br/><div class="code">sysctl -p</div><br/>备份limits.conf<br/><div class="code">cp /etc/security/limits.conf /etc/security/limits.conf.original</div><br/><div class="code">nano /etc/security/limits.conf</div><br/>添加以下行到/etc/security/limits.con中<br/><div class="code">#Oracle 10gR2 shell limits:<br/>oracle soft nproc 2048<br/>oracle hard nproc 16384<br/>oracle soft nofile 1024<br/>oracle hard nofile 65536</div><br/><br/>5.设置用户和用户组<br/>我们需要为安装程序创建一个oracle用户和两个组。<br/><div class="code">groupadd oinstall<br/>groupadd dba<br/>useradd -m -g oinstall -G dba oracle<br/>usermod -s /bin/bash oracle<br/><br/>passwd oracle<br/><br/>groupadd nobody<br/>usermod -g nobody nobody</div><br/>执行如下代码：<br/><div class="code">id oracle</div><br/>显示如下代码：<br/><div class="code">uid=1001(oracle) gid=1001(oinstall) groups=1001(oinstall),1002(dba)</div><br/>里面的数字因系统原因不一定相同<br/><br/>6.ORACLE安装目录准备及环境准备<br/>我们使得/opt/oracle为安装目录<br/><div class="code">mkdir -p /opt/oracle<br/>mkdir -p /opt/oraInventory<br/><br/>chown oracle:oinstall /opt/oracle<br/>chown oracle:oinstall /opt/oraInventory<br/><br/>chmod 750 /opt/oracle<br/>chmod 750 /opt/oraInventory</div><br/><br/>通过创建一个新文件/etc/redhat-release并添加以下行，欺骗安装程序让它以为我们<br/>的系统是RedHat:<div class="code">Red Hat Linux release 4.1</div><br/><br/>修改oracle环境<br/><div class="code">nano /home/oracle/.bashrc</div><br/>增加如下代码：<br/><div class="code">ORACLE_BASE=/opt/oracle<br/>ORACLE_HOME=/opt/oracle/product/10.2.0/db_1<br/>ORACLE_SID=km<br/>export ORACLE_BASE ORACLE_HOME ORACLE_SID<br/>PATH=$ORACLE_HOME/bin:$PATH:.<br/>export PATH<br/>LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib<br/>CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib<br/>export LD_LIBRARY_PATH CLASSPATH<br/>alias sqlplus=&#039;rlwrap sqlplus&#039;</div><br/><br/>7.ORACLE的安装<br/>将oracle安装文件解压得到database文件夹，如果解压详见<a href="http://zhoujin.com/post/153/" target="_blank">linux下.cpio.gz文件的解压</a><br/>执行如下代码：<br/><div class="code">chown -R oracle:oinstall /opt/soft/database</div>改变目录权限前提是oracle为文件一样。如果不一样使用你自己的目录<br/><br/>退出系统以oracle用户登陆进GDM环境，打开终端：<br/><div class="code">export LANG=en_CN<br/>cd /opt/soft/database<br/>./runInstaller</div><br/>只要安装软件就行了。不要安装示例数据库<br/>如果安装过程中出现如下错误:<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">Error in invoking target 'collector' of makefile '/opt/oracle/10g/product/10.2.0/db_1/sysman/lib/ins_emdb.mk'.</div></div><br/>请跳过.<br/>安装完成后，我们完成后来解决上一错误：<br/><div class="code">cd $ORACLE_HOME/bin<br/><br/>mv oracle oracle.bin<br/>cat &gt;oracle &lt;&lt;&quot;EOF&quot;<br/>#!/bin/bash<br/><br/>export DISABLE_HUGETLBFS=1<br/>exec $ORACLE_HOME/bin/oracle.bin $@<br/>EOF<br/><br/>chmod +x oracle</div><br/><br/>8.设置自启动<br/>创建自启动脚本 创建 oracledb 脚本到/etc/init.d/oracledb,内容如下<br/>获取root权限：<br/><div class="code">sudo su -</div><br/><div class="code">nano /etc/init.d/oracledb</div><br/><div class="code">#!/bin/bash<br/>#<br/># /etc/init.d/oracledb<br/>#<br/># Run-level Startup script for the Oracle Instance, Listener, and<br/># Web Interface<br/><br/>export ORACLE_HOME=/opt/oracle/product/10.2.0/db_1<br/>export ORACLE_SID=km<br/>export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/Apache/Apache/bin:$PATH<br/><br/>ORA_OWNR=&quot;oracle&quot;<br/># if the executables do not exist -- display error<br/>if &#91; ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME &#93;<br/>then<br/>echo &quot;Oracle startup: cannot start&quot;<br/>exit 1<br/>fi<br/># depending on parameter -- startup, shutdown, restart<br/># of the instance and listener or usage display<br/>case &quot;$1&quot; in<br/>start)<br/># Oracle listener and instance startup<br/>echo -n &quot;Starting Oracle: &quot;<br/>su $ORA_OWNR -c &quot;$ORACLE_HOME/bin/lsnrctl start&quot;<br/>su $ORA_OWNR -c &quot;$ORACLE_HOME/bin/dbstart&quot;<br/>touch /var/lock/oracle<br/>su $ORA_OWNR -c &quot;$ORACLE_HOME/bin/emctl start dbconsole&quot;<br/>echo &quot;OK&quot;<br/>;;<br/>stop)<br/># Oracle listener and instance shutdown<br/>echo -n &quot;Shutdown Oracle: &quot;<br/>su $ORA_OWNR -c &quot;$ORACLE_HOME/bin/lsnrctl stop&quot;<br/>su $ORA_OWNR -c &quot;$ORACLE_HOME/bin/dbshut&quot;<br/>rm -f /var/lock/oracle<br/>su $ORA_OWNR -c &quot;$ORACLE_HOME/bin/emctl stop dbconsole&quot;<br/>echo &quot;OK&quot;<br/>;;<br/>reload&#124;restart)<br/>$0 stop<br/>$0 start<br/>;;<br/>*)<br/>echo &quot;Usage: `basename $0` start&#124;stop&#124;restart&#124;reload&quot;<br/>exit 1<br/>esac<br/>exit 0</div><br/>设置权限,放到启动脚本中去<br/><div class="code">chmod 755 /etc/init.d/oracledb<br/>update-rc.d oracledb defaults 99</div><br/>还需要编辑一下/etc/oratab，把其中的N改成Y，不然上述脚本中所调用的$ORACLE_HOME/bin/dbstart在执行时不会自动启动相应的数据库实例<br/><br/>Tags - <a href="http://zhoujin.com/tags/ubuntu/" rel="tag">ubuntu</a> , <a href="http://zhoujin.com/tags/oracle/" rel="tag">oracle</a> , <a href="http://zhoujin.com/tags/10g/" rel="tag">10g</a> , <a href="http://zhoujin.com/tags/10.04/" rel="tag">10.04</a> , <a href="http://zhoujin.com/tags/64/" rel="tag">64</a> , <a href="http://zhoujin.com/tags/amd64/" rel="tag">amd64</a> , <a href="http://zhoujin.com/tags/install/" rel="tag">install</a> , <a href="http://zhoujin.com/tags/ins_emdb/" rel="tag">ins emdb</a> , <a href="http://zhoujin.com/tags/ins_ctx/" rel="tag">ins ctx</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/156/</link>
<title><![CDATA[为UBUNTU安装WEBMIN]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Fri, 17 Sep 2010 14:45:48 +0000</pubDate> 
<guid>http://zhoujin.com/post/156/</guid> 
<description>
<![CDATA[ 
	1.准备环境<br/>首先得安装好ubuntu-10.04-server-amd64吧(PS:我友情提醒一下，不要丢鸡蛋啊)，同时需要确保您已经在/etc/apt/sources.list 文件中启用了Universe和Multiverse软件库。<br/>2.安装环境<br/>接下来执行如下命令：<br/><div class="code">sudo vi /etc/apt/sources.list</div><br/>添加一行：<br/><div class="code">deb http://download.webmin.com/download/repository sarge contrib</div><br/>保存并退出，然后执行以下命令：<br/><div class="code">cd /root</div><br/>这一步最好先启用root用户吧。不能报权限错误。（PS：怎么启用ROOT？给ROOT设置密码就OK了）<br/><div class="code">wget http://www.webmin.com/jcameron-key.asc<br/>sudo apt-key add jcameron-key.asc<br/>sudo apt-get update<br/>sudo apt-get install webmin</div><br/>安装完毕，接下来打开浏览器访问 <a href="https://your-server-ip:10000/" target="_blank">https://your-server-ip:10000/</a><br/><a href="http://zhoujin.com/attachment.php?fid=17" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=17" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>登陆后，修改一下语言可以看到<br/><a href="http://zhoujin.com/attachment.php?fid=18" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=18" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>Tags - <a href="http://zhoujin.com/tags/ubuntu/" rel="tag">ubuntu</a> , <a href="http://zhoujin.com/tags/wemin/" rel="tag">wemin</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/155/</link>
<title><![CDATA[Ubuntu Server 安装图形桌面环境]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Thu, 16 Sep 2010 14:32:20 +0000</pubDate> 
<guid>http://zhoujin.com/post/155/</guid> 
<description>
<![CDATA[ 
	1.准备环境<br/>首先得安装好ubuntu-10.04-server-amd64吧(PS:我友情提醒一下，不要丢鸡蛋啊)，同时需要确保您已经在/etc/apt/sources.list 文件中启用了Universe和Multiverse软件库。<br/>2.安装环境<br/>接下来执行如下命令：<br/><div class="code">sudo apt-get update<br/>sudo apt-get install ubuntu-desktop</div><br/>以上命令将安装 Gnome 桌面环境。<br/><br/>如果你不想安装一些附加的程序例如电子邮件程序和OpenOffice套件，可用以下命令：<br/><div class="code">sudo aptitude install --no-install-recommends ubuntu-desktop</div><br/>如果你想来一个轻量级的桌面 xfce，执行：<br/><div class="code">sudo apt-get install xubuntu-desktop</div><br/>KDE 桌面则用以下命令：<br/><div class="code">sudo apt-get install kubuntu-desktop</div><br/>Tags - <a href="http://zhoujin.com/tags/ubuntu/" rel="tag">ubuntu</a> , <a href="http://zhoujin.com/tags/gnome/" rel="tag">gnome</a> , <a href="http://zhoujin.com/tags/kde/" rel="tag">kde</a> , <a href="http://zhoujin.com/tags/xfce/" rel="tag">xfce</a> , <a href="http://zhoujin.com/tags/10.04/" rel="tag">10.04</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/153/</link>
<title><![CDATA[linux下.cpio.gz文件的解压]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Wed, 15 Sep 2010 15:56:30 +0000</pubDate> 
<guid>http://zhoujin.com/post/153/</guid> 
<description>
<![CDATA[ 
	在linux下装oracle的时候发现了自己不会操作后缀为.cpio.gz文件，后来在网上查了一下，发现了它的解决方法，现写出来供大家参考：<br/>首先，该文件是一个经过压缩的文件，当然要先解压了，这些大家都非常清楚的，就是用<br/>#gunzip 文件名.cpio.gz<br/>这样文件就解压成为 "文件名.cpio" 了，然后再对它进行cpio操作<br/>#cpio -idmv < 文件名.cpio<br/>这样就将cpio文件彻底暴露在我们面前了<br/>Tags - <a href="http://zhoujin.com/tags/linux/" rel="tag">linux</a> , <a href="http://zhoujin.com/tags/oracle/" rel="tag">oracle</a> , <a href="http://zhoujin.com/tags/cpio/" rel="tag">cpio</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/152/</link>
<title><![CDATA[20100913大盘趋势]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[谈股论金]]></category>
<pubDate>Mon, 13 Sep 2010 08:31:33 +0000</pubDate> 
<guid>http://zhoujin.com/post/152/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp; 从整个大的形态来看，股市现处于行情的末端，从现在各方面的情况看10月之后资金面不容乐观，今年年尾的资金可能会比较紧张。<br/>&nbsp;&nbsp;&nbsp;&nbsp; 国际环境看近期国外资金又重新出现炒作欧债主权危机的迹象。<br/>&nbsp;&nbsp;&nbsp;&nbsp; 凡此种种迹象显示股市短期仍然处于强势，但10月之后市场并不乐观。此时可以炒作短线股，但要注意控制仓位，同时要重点关注补涨股的机会，对于涨幅太大的股票一般做回避处理。<br/>Tags - <a href="http://zhoujin.com/tags/%25E8%2582%25A1%25E5%25B8%2582/" rel="tag">股市</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/151/</link>
<title><![CDATA[近期操作题材及关注点]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[谈股论金]]></category>
<pubDate>Tue, 31 Aug 2010 03:48:28 +0000</pubDate> 
<guid>http://zhoujin.com/post/151/</guid> 
<description>
<![CDATA[ 
	股市行情将以阶段性小双底展开震荡盘升，整体看震荡与平衡的格局没有打破。<br/>市场暂时不具备有效突破2700点动力也不具有下跌动能，箱型格局下做好个股是重点，题材上主力主要是对锂电、医药，消费双节等题材逐步深挖。<br/>在关注题材的同时更要关注技术位置，技术位置不安全题材再好也不要去追，技术位置安全题材差点还可以潜伏。<br/>到九月中旬之后则要留意宏观上的变化，届时市场有变盘可能。
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/150/</link>
<title><![CDATA[兴趣？]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Thu, 01 Jul 2010 08:00:54 +0000</pubDate> 
<guid>http://zhoujin.com/post/150/</guid> 
<description>
<![CDATA[ 
	我时常听到类似这样的说法：<br/><br/>“小时候我很喜欢音乐的，唱歌很好，老师经常夸我。我自己也很喜欢唱歌。可是后来上大学的时候家里人不让我报考音乐学院……”<br/><br/>结果呢，我看到的是基本被搁置一边的天赋，和大量的时间用来看花边新闻八卦杂志研究时尚美容等等等等。<br/><br/>“其实我是个写代码的。我不应该在这里，应该在一个角落里快乐的编写着代码。”<br/><br/>结果呢，我看到的是在真正需要写代码的时候，表现出来的迟钝和生疏。<br/><br/>我也看到很多很多时常将兴趣挂在嘴边，行动上却吝惜投入的人。相信你也看到。或者你就是。<br/><br/>兴趣是一种<a href="http://zhoujin.com/post/144" target="_blank">信仰</a>。<br/><br/>当你真的觉得某些事情是你真正热爱的方向的时候，就应当真正的花时间去追求。原地期待不会有任何结果，朝三暮四更不会。朝九晚五然后说没有时间不是借口，全力投入的一两个小时的产出将远远超出你的想象。<br/><br/>我曾经劝说过很多人，放弃平凡的工作去追求自己真正热爱的人和事。然而真正接受建议的人很少。四平八稳往往是大多数人的选择。很多时候激情、冲动、莽撞之间划上约等号，弄的人搞不清楚这股情绪到底是什么。年长者考虑太多，出于善意，他们往往会说，<br/><br/>“年轻人，别冲动。”<br/><br/>可是，不冲动，是年轻人么？！<br/><br/>兴趣是一种信仰。而信仰要体现力量，需要长时间的近乎虔诚的朝拜和练习。整天挂在嘴边的兴趣不是兴趣。天天练习，以此为生活准则和行为习惯，并且得到广泛认可的小有所成，那才是真正的兴趣。<br/>Tags - <a href="http://zhoujin.com/tags/%25E6%259D%2582%25E8%25B0%2588/" rel="tag">杂谈</a> , <a href="http://zhoujin.com/tags/%25E7%2594%259F%25E6%25B4%25BB%25E6%2584%259F%25E6%2582%259F/" rel="tag">生活感悟</a> , <a href="http://zhoujin.com/tags/%25E9%259A%258F%25E7%25AC%2594/" rel="tag">随笔</a> , <a href="http://zhoujin.com/tags/%25E4%25BF%25A1%25E4%25BB%25B0/" rel="tag">信仰</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/149/</link>
<title><![CDATA[地球上有一个很奇怪的国家]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Mon, 07 Jun 2010 01:56:00 +0000</pubDate> 
<guid>http://zhoujin.com/post/149/</guid> 
<description>
<![CDATA[ 
	1.该国百姓收入是欧美的几十分之一，房价却要赶超欧美； <br/>2.该国房子可以是自己的，但土地永远是国家的！最近又补充了一下：“房子是土地的一部分”！ <br/>3.该国的国际长途，从国内打到国外的价格是国外打到国内价格的10倍以上！ <br/>4.该国说“教育兴国”，“教育是根本”……，但教育经费投入之少与非洲穷国乌干达看齐，百姓自掏教育经费之多全球之冠！此谓优越性！ <br/>5.该国公务员的薪水不拿全国的平均水平，而是平均水平的3倍以上，此谓 “高薪养廉”； <br/>6.该国全国公务员不交一分钱“养老金”，而退休后的养老金是全国其他人民的3倍以上。小泉纯一郎3个月没缴“养老金”，电视台作为丑闻天天放！此谓“百步笑三步”。 <br/>7.该国有很多企业叫国有企业，书上写公有制度下的国有企业是属于全国人民的。（老百姓不但没有拥有该企业，反而被其垄断的性质不断压榨） <br/>8.禁止收看外国的电视节目！—（比塔利班的禁止收看电视可能要仁慈一点） <br/>9.在这里开车撞了人最好确认撞死再报警，这样责任更小<br/>10.在国内旅游也需要“签证” <br/>11.反对。。。。就要坐牢 <br/>12.上市公司诈骗，股民受损失，但国家法院不受理此类赔偿！--（因为无法可依） <br/>13.禁止用自己买下的房子来作公司办公室 <br/>14.去网吧上网要出示身份证。 <br/>15.黄色刊物属于非法，但性用品商店到处都是。 <br/>16.摩托车的行驶证（牌照）价格比摩托车本身高上好几倍。 <br/>17.在国外能够浏览的互联网内容在该国可能就无法浏览--（不是你的电脑故障）<br/>Tags - <a href="http://zhoujin.com/tags/%25E5%259C%25B0%25E7%2590%2583/" rel="tag">地球</a> , <a href="http://zhoujin.com/tags/%25E5%259B%25BD%25E5%25AE%25B6/" rel="tag">国家</a> , <a href="http://zhoujin.com/tags/%25E7%2599%25BE%25E5%25A7%2593/" rel="tag">百姓</a> , <a href="http://zhoujin.com/tags/%25E6%2595%2599%25E8%2582%25B2/" rel="tag">教育</a> , <a href="http://zhoujin.com/tags/%25E7%25BD%2591%25E5%2590%25A7/" rel="tag">网吧</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/148/</link>
<title><![CDATA[号外：中国机构获微软授权查看Win7大部分源码]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Wed, 02 Jun 2010 08:53:12 +0000</pubDate> 
<guid>http://zhoujin.com/post/148/</guid> 
<description>
<![CDATA[ 
	博弈论中，有一个理论很有意思，是说各方在初次达成合作的时候，心里都是忐忑不安，生怕对方想出来什么阴谋诡计，让自己吃亏上当。因此，如果是一个短期合同，最有可能的结果，是每一方都想尽快使出“阴招”，捞一票赶紧走人。吃亏的一方，报复方式就是永远不再跟此人合作。因此，短期合同的结果，一般都是“双输”。<br/><br/>但是，如果是一个长期合同，结果截然不同。任何一方要有伤害对方的举动，对方都会有时间找出机会来进行报复。其结果是，双方都会尽量从对方的角度来考虑问题，从长远的角度来考虑得失。因此，长期合作最后可能产生双赢的结果。<br/><br/>先说博弈论，主要是中国机构获微软授权查看Win7大部分源码。我就在想，这个动作是不是说，微软把操作系统的源代码托管到了中国信息安全测评中心，因为微软要应用到涉密的国家单位，就必须要向相关部门表明自己心中没鬼，自己的软件产品经得起测评考验。一些知名的金融机构也要求信息系统的提供方将源代码托管到第三方那里，因为它们一怕供应商在软件里暗中捣鬼，窃取商业机密；二怕供应商因意外事件停止提供服务，从而导致金融机构的客户服务瘫痪。<br/><br/>素不知道在我们天朝这帮人能看懂吗？这东西又不是看美女，看一眼就心醉。<br/><br/>此中心做过的事，发表的评测网上太多了。里面的叫兽也很多的。砖家也不少的。所以不多说了。<br/><br/>其他不讲绝大部分包括那些。是外围的包括核心的吗？<br/><br/>当然了这个又是一个不能细说的，也不能深说的了。<br/><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">6月2日下午消息，微软中国今天发布消息称，该公司日前已与中国信息安全测评中心续签了新一期的政府安全计划源代码协议。微软称，该中心和相关被授权机构 将被允许查看包括Windows 7, Windows Server 2008 R2在内的微软产品和平台源代码以及相关技术信息，从而提高中国政府对微软产品安全方面的分析和测评能力。<br/>此协议的签订和实施是国家发展改革委员会与微软公司2006年4月共同签署的关于加强软件产业合作备忘录(二期)的重要组成部分。国家发展改革 委高技术产业司副巡视员徐建成、中国信息安全测评中心主任吴世忠和微软公司全球副总裁Scott Charney等当天出席了签字仪式。<br/>根据签署的新协议，中国信息安全测评中心和相关被授权机构将可以在线即时查看包括Windows 7, Windows Vista、Windows XP、Windows Server 2008 R2, Windows Server 2003、Windows 2000和Windows嵌入式CE 6.0、5.0版、4.2版的专业版源代码包(“PSK”)以及Microsoft Office 专业版2003、Microsoft Office系统中的任何附加产品等在内的微软产品的绝大部分现有版本源代码和相关技术信息。<br/>。。。。。。。。。。。<br/>微软的消息未指明“<span style="color: #FF0000;"><span style="font-size: 14px;">绝大部分</span></span>”的具体范围。<br/><br/>国家发展和改革委高技术产业司副巡视员徐建平表示，希望微软公司与中国合作伙伴本着互利共赢的原则在信息安全领域进一步深化合作。</div></div><br/>Tags - <a href="http://zhoujin.com/tags/%25E5%25BE%25AE%25E8%25BD%25AF/" rel="tag">微软</a> , <a href="http://zhoujin.com/tags/windows/" rel="tag">windows</a> , <a href="http://zhoujin.com/tags/%25E5%258D%259A%25E5%25BC%2588%25E8%25AE%25BA/" rel="tag">博弈论</a> , <a href="http://zhoujin.com/tags/%25E6%25BA%2590%25E7%25A0%2581/" rel="tag">源码</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/147/</link>
<title><![CDATA[Tomcat 7 即将发布，支持 Servlet 3.0]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[J2EE]]></category>
<pubDate>Fri, 28 May 2010 06:46:03 +0000</pubDate> 
<guid>http://zhoujin.com/post/147/</guid> 
<description>
<![CDATA[ 
	去年12月，Java EE 6 规范最终版的确定了。Apache Tomcat团队也一直在努力的完成Tomcat 7版本的开发。就在不久前，还发布了RC3候选版本。<br/><br/>Tomcat 7中最让人兴奋的就是对Servlet 3.0的支持。更多Servlet 3.0的介绍可以查阅读次文章：<br/><a href="http://zhoujin.com/post/146/" target="_blank">http://zhoujin.com/post/146/</a><br/><br/>除此之外，还支持JSP 2.2和EL 2.2，但是不支持该范围以外的其他Java EE6特征。当然，你可以通过增加所需要的库文件，达到你所需要的目的。<br/><br/>另外有针对64位优化版本。<br/><br/>apache-tomcat-[version].zip or .tar.gz<br/>Base distribution. These distributions do not include the Windows service wrapper nor the compiled APR/native library for Windows.<br/>apache-tomcat-[version].exe<br/>32-bit/64-bit Windows installer for Tomcat.&nbsp;&nbsp; Please note that while this distribution includes the vast majority of the base distribution, some of the command-line scripts for launching Tomcat are not included. This distribution is intended for those users planning to launch Tomcat through the Windows shortcuts or services.<br/>apache-tomcat-[version]-windows-x86.zip<br/>32-bit Windows specific distribution that includes the Windows service wrapper and the compiled APR/native library for use with 32-bit JVMs on both 32 and 64 bit Windows platforms.<br/>apache-tomcat-[version]-windows-x64.zip<br/>64-bit Windows specific distribution that includes the Windows service wrapper and the compiled APR/native library for use with 64-bit JVMs on x64 Windows platforms.<br/>apache-tomcat-[version]-windows-i64.zip<br/>64-bit Windows specific distribution that includes the Windows service wrapper and the compiled APR/native library for use with 64-bit JVMs on Itanium 64-bit Windows platforms.<br/>apache-tomcat-[version]-deployer.zip or .tar.gz<br/>The standalone Tomcat Web Application Deployer.<br/>apache-tomcat-[version]-fulldocs.tar.gz<br/>The Tomcat documentation bundle, including complete javadocs.<br/><br/>现在，Apache官方网站上还没有提供Tomcat7的下载.<br/><br/><br/>Tags - <a href="http://zhoujin.com/tags/tomcat/" rel="tag">tomcat</a> , <a href="http://zhoujin.com/tags/7/" rel="tag">7</a> , <a href="http://zhoujin.com/tags/j2ee/" rel="tag">j2ee</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/145/</link>
<title><![CDATA[生活之痛]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Wed, 19 May 2010 03:04:44 +0000</pubDate> 
<guid>http://zhoujin.com/post/145/</guid> 
<description>
<![CDATA[ 
	最近有幸看了《富爸爸，穷爸爸》电视剧，电视剧某些观点的确引起了我的深思，虽然美国和中国的制度不同，文化也有一定的差异，甚至赚钱的方式也有不同，但是这并不能改变国家的共同本质——统治阶级运作的机器，统治阶级在治理国家都会使用多种多样的手段，常用的莫过于税收，这便是大多数中产和无产阶级痛苦的来源。<br/><br/>85%人这个在国家颇受关注的群体当然也难逃税收的折磨，当你还在学校内还感受不到，但在毕业的那一刻，它便与你终生伴随直到生命的终结；大多数的学生都希望能够毕业后找到一份好工作，然后努力的工作，然后买房、买车、结婚、生育，这看似很正常的事情却是一个将我们拖向泥沼的陷阱，当然这不是说这些事情不能做，而是说这些目标在找一个好工作的前提下是一个陷阱，因为你的工资是无法将这些目标一个个的实现，必须通过各种各样的贷款来完成，而你却要在每个月的工资中不断减少可流动的资金，并且为贷款偿还利息，虽然你可能努力的工作得到了更高的薪水和职位，但税收却同样也拿走了更多的钱，生活可能过的不如自己一个人的时候，当你有一个可爱的孩子的时候，你的压力会更大，它将花费掉比房子和车子更多的金钱，并且还会花费掉你更多的精力（如果你是一个称职的的父母），你为了孩子的需要可能会更加的努力的工作以便获得更多的报酬，这样变形成了一个恶性的循环 【工作->消费->贷款->工作】，这样看来一个好的工作并不能达到一个好的结果，当你认知到国家机器和税收的力量以后。<br/><br/>85%人之痛在于处于无产阶级的上层，而中国的绝大部分税收来源于这个阶级，而有钱人都有避税的方法，而唯独我们这个阶级没有，而我们却一直为一个恶性循环结果的目标而奋斗着——“一个好工作”<br/><br/>可悲之处在于我们有知识却没有好结果，可怜之处我们却对一个恶性循环的目标抱有相当坚定的态度。<br/>Tags - <a href="http://zhoujin.com/tags/%25E7%25A8%258E%25E6%2594%25B6/" rel="tag">税收</a> , <a href="http://zhoujin.com/tags/%25E5%25BE%25AA%25E7%258E%25AF/" rel="tag">循环</a> , <a href="http://zhoujin.com/tags/%25E7%25BE%25A4%25E4%25BD%2593/" rel="tag">群体</a> , <a href="http://zhoujin.com/tags/%25E6%2597%25A0%25E4%25BA%25A7%25E9%2598%25B6%25E7%25BA%25A7/" rel="tag">无产阶级</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/144/</link>
<title><![CDATA[事关信仰]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Sat, 15 May 2010 01:41:14 +0000</pubDate> 
<guid>http://zhoujin.com/post/144/</guid> 
<description>
<![CDATA[ 
	君子和而不同，小人同而不和。深以为然。<br/><br/>我越来越悲哀的看到，信仰的缺失成为整个时代的悲剧。诱惑太多，扩张太快，进度太紧，组织的成功建立在无数的人放弃自己信仰的基础上，无数人放弃了自己的直觉，挣扎、痛苦中直至麻木。追求完美难道不是每个人天生的直觉吗？对新生事物保持如婴儿般的新鲜感难道不是每个人的直觉吗？对重复的抵制难道不是每个人的直觉吗？<br/><br/>不坚持，无信仰。<br/><br/>如果不曾在悲哀中咀嚼过面包<br/>不曾在哭泣中等待过明天<br/>这样的人就不知道你<br/>－－天的力量<br/><br/>We can face our problem.<br/>We can arrange such facts as we have with order and method.<br/>我们能够面对我们的问题。<br/>我们可以搞定它们，因为我们有规则和方法。<br/>Tags - <a href="http://zhoujin.com/tags/%25E4%25BF%25A1%25E4%25BB%25B0/" rel="tag">信仰</a> , <a href="http://zhoujin.com/tags/%25E5%25AE%258C%25E7%25BE%258E/" rel="tag">完美</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/143/</link>
<title><![CDATA[美国培养出来的中国女孩]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Mon, 10 May 2010 13:15:42 +0000</pubDate> 
<guid>http://zhoujin.com/post/143/</guid> 
<description>
<![CDATA[ 
	美国培养出来的中国女孩，邹奇奇(Adora Svitak) 。对中国教育制度的最大讽刺。<br/>TED讲座：成年人能从孩子那里学到什么?<br/><br/>此处包含一个多媒体文件，请用网页方式查看。<br/><br/>美国8岁华裔女童邹奇奇4岁开始用电脑创作，上个月出版了第一本英文着作，立刻成为美国文坛新秀，奇奇每分鐘可以打80个字，手指就像在键盘飞一样，奇奇说，新书取名为「飞扬的手指」，是因为她每分鐘可以打80个字，「我的手指就像在键盘上飞一样」。<br/>怎么开发的智力呀？？？<br/>Tags - <a href="http://zhoujin.com/tags/%25E6%2595%2599%25E8%2582%25B2/" rel="tag">教育</a> , <a href="http://zhoujin.com/tags/%25E7%25BE%258E%25E5%259B%25BD/" rel="tag">美国</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/142/</link>
<title><![CDATA[利用SSH代理爬墙]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Tue, 04 May 2010 00:51:09 +0000</pubDate> 
<guid>http://zhoujin.com/post/142/</guid> 
<description>
<![CDATA[ 
	最近，河蟹无处不在，翻墙危险重重,不过本人发现其实利用putty的ssh tunnel功能也可以实现安全的代理，原理是当用putty ssh连接到美国VPS的时候，putty可以在本地开启一个端口，本地的应用程序连接到本地的这个端口。相当于putty在本地充当了一个socks代理服务器为本地的应用程序提供socks代理。而这个socks代理通过美国VPS连接外网，socks代理和美国VPS直接的数据通信是在ssh隧道里进行的，是安全的。<br/><br/>配置方法：<br/>connection –> SSH&nbsp;&nbsp;–> Tunnels项下增加一动态端口转发选项，Source port中填入本机要监听的端口，选”Dynamic”，然后再点Add就添加成功了。对于Port forwarding里的Loal ports accept connections from other hosts选项，如果你选中该选项的话，将映射本地所有端口到服务器上，默认只是映射你指定的端口。<br/><a href="http://zhoujin.com/attachment.php?fid=14" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=14" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>接着在浏览器里添加代理即可<br/><a href="http://zhoujin.com/attachment.php?fid=15" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=15" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>linux下配置方法：<br/><br/>sudo apt-get install putty<br/><br/>plink -C -D 127.0.0.1:1080 -N -pw 密码 用户名@服务器地址<br/><br/>用系统自带的SSH亦可:<br/><br/>ssh -CfNg -D 127.0.0.1:1080 用户名@服务器地址<br/><br/>Mac下方法一样:<br/><br/>ssh -CfNg -D 127.0.0.1:1080 用户名@服务器地址<br/><br/>不过在我用自己的DremaHost做SSH代理的时候，对于FaceBook和Twitter之类的网站还是无法打开，发现原来网站的DNS解析被河蟹了，所以通过SSH代理也是无法解决的，所以要更改DNS解析才行。我们可以直接使用服务端来进行DNS解析，不过目前我发现只有FireFox支持远端DNS解析，在about:config里，改写<br/>network.proxy.socks_remote_dns=true 就行了。<br/><br/>至于chrome貌似要同过Proxy Switchy这个插件才能解决，其实Firefox也可以通过FoxyProxy插件进行解决。而IE么，就很麻烦了，有人建议用polipo或者是privoxy将socks代理转成http代理，所以比较恶心……<br/><br/>其他一些翻墙利器推荐:<br/><br/>Power.com 在线代理翻墙工具&nbsp;&nbsp;&nbsp;&nbsp;官方网站：<a href="http://www.power.com" target="_blank">http://www.power.com</a><br/>Fanqiang.org 超强匿名在线代理服务器，翻墙利器<br/>官方网站:<a href="http://fanqiang.org/" target="_blank">http://fanqiang.org/</a><br/><br/>Puff the magic dragon，简称 Puff，一款专业小巧实用的翻墙工具。<br/>官方主页：<a href="http://www.erights.net" target="_blank">http://www.erights.net</a>（已被河蟹）<br/>UseJump 无需任何设置即可翻墙的浏览器，个人感觉速度比TOR快，据说是对链接进行过优化。<br/>官方网站<a href="http://beta.usejump.com/" target="_blank">http://beta.usejump.com/</a><br/>Tags - <a href="http://zhoujin.com/tags/gfw/" rel="tag">gfw</a> , <a href="http://zhoujin.com/tags/ssh/" rel="tag">ssh</a> , <a href="http://zhoujin.com/tags/%25E7%25BF%25BB%25E5%25A2%2599/" rel="tag">翻墙</a> , <a href="http://zhoujin.com/tags/%25E4%25BB%25A3%25E7%2590%2586/" rel="tag">代理</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/136/</link>
<title><![CDATA[市场热点100426]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[谈股论金]]></category>
<pubDate>Mon, 26 Apr 2010 01:27:08 +0000</pubDate> 
<guid>http://zhoujin.com/post/136/</guid> 
<description>
<![CDATA[ 
	市场热点围绕分拆、消费、科技展开，其中科技又与世博题材联系起来。至于分拆概念则比较模糊会使一大批大部分个股收益。对此建议重点关注技术位置低的个股，对个股不要歧视，过去不能涨的票不代表未来不能上涨。无论大盘股还是小盘股个股建议只要进入了价值区域就值得关注。大盘来说则不必过于担心，市场热钱很多局部牛市行情没有改变，可以借此机会挑选过度下跌的股票来做。<br/>Tags - <a href="http://zhoujin.com/tags/%25E5%25B8%2582%25E5%259C%25BA%25E7%2583%25AD%25E7%2582%25B9/" rel="tag">市场热点</a> , <a href="http://zhoujin.com/tags/%25E5%2588%2586%25E6%258B%2586/" rel="tag">分拆</a> , <a href="http://zhoujin.com/tags/%25E6%25B6%2588%25E8%25B4%25B9/" rel="tag">消费</a> , <a href="http://zhoujin.com/tags/%25E7%25A7%2591%25E6%258A%2580/" rel="tag">科技</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/135/</link>
<title><![CDATA[股指期货100415]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[谈股论金]]></category>
<pubDate>Thu, 15 Apr 2010 00:24:20 +0000</pubDate> 
<guid>http://zhoujin.com/post/135/</guid> 
<description>
<![CDATA[ 
	股指期货周五上市，短线市场会受到大盘股上下震荡的扰动。操作上保持平稳心态，个股主要以短线为主。短线关注大盘股的上涨机会，关注大盘股主要是位置低，这时进入可以做避险考虑，至于涨幅则预期不要太高。从趋势来看机会还是集中在小盘股。只是部分小盘股技术位置高，主力有减仓迹象，所以对短线涨的高的小盘股要适当换股。对于有潜力的小盘股则还是要盯住不放。前期推荐的万东医疗，美达股份已有不小涨幅，现在可以获利出局了<br/>Tags - <a href="http://zhoujin.com/tags/%25E8%2582%25A1%25E6%258C%2587%25E6%259C%259F%25E8%25B4%25A7/" rel="tag">股指期货</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/141/</link>
<title><![CDATA[原来是人祸]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Sat, 10 Apr 2010 07:10:36 +0000</pubDate> 
<guid>http://zhoujin.com/post/141/</guid> 
<description>
<![CDATA[ 
	从<a href="http://shihb.blog.sohu.com/148501141.html" target="_blank">这里</a>和<a href="http://shihb.blog.sohu.com/148258905.html" target="_blank">这里</a>，读到了如下信息：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">西南干旱后，很多人认为，是由于下雨少所致，也即天灾所致。但是，查一下新闻后，发现类似的“天灾”一直在上演（仅以云南的新闻为例）：2004年，我国南方“遭受53年来罕见干旱”，云南在干旱之列；2005年，云南“遭遇近50年来最大干旱”；2006年，“云南遭遇20年来最严重旱情”；2007年，“云南大部地区降水不足，气温偏高，旱情日趋严重”；“2008年云南连续近三个月干旱”；2009年，“云南省遭遇五十年一遇的严重旱情”；2010年，云南“秋冬春连旱”百年一遇……<br/><br/>我实地调查得出的结果是：西南干旱，一分天灾，九分人祸。</div></div><br/><a href="http://zhoujin.com/attachment.php?fid=12" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=12" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>如此险地都被用作农田<br/><a href="http://zhoujin.com/attachment.php?fid=13" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=13" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><br/>所谓的高经济作物桉树，让物种变得单一，成为绿色的沙漠：雨水来了泥土流失，大旱来了与其他植物抢水。<br/><hr/><br/>一旦金钱成为从上至下追求的目标，那么什么都变了。由于在认知上的局限性，当时空上因果关系看不到连续性的时候，人索性放弃了任何信仰。60年代建立的水库设施，在改革开放近30年的时间里，就不记得修葺，以至于雨季存不下水，旱季没有水；片面的认为绿化就是种树，将侵略性极强的桉树大面积栽种，所到之处，除了桉树草木不生，动物也不来，彻底破坏生态平衡；一旦没有水，没有想办法解决集水的问题就到处打井寻找地下水，导致地下水位下降，进一步造成不可预知的影响；“先污染、再治理”带来的是花10亿去污染，然后花10倍以上的代价去治理；为了城市供水，农业和农民一起被边缘化，为了GDP, 大量的炸山开矿填海围田……<br/><br/>一些悲剧正在上演：<a href="http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=%E6%83%85%E4%BA%BA%E6%B9%96%E4%B8%8A%E7%9A%84%E5%88%AB%E5%A2%85" target="_blank">情人湖上的别墅</a>听起来如同烹食天鹅肉一样让人悲愤；沙漠上好不容易防风固沙的沙棘生态林被弄成<a href="http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=%E6%B2%99%E6%A3%98%E7%94%9F%E6%80%81%E6%9E%97%E9%AB%98%E5%B0%94%E5%A4%AB" target="_blank">高尔夫</a>；还有一些扑朔迷离的东湖填湖事件，就发生在我的家乡武汉——我不敢想象，失去东湖的武汉人，会愤怒悲伤到何种程度……<br/><br/>这些，我们又能做些什么呢？为什么生活越现代，信仰就越匮乏？《阿凡达》中潘多拉星球上的惨胜，或许只是导演一厢情愿的美好愿望——真实情况也许是，世界之树被连根拔起，所有的树木被砍倒，地面铺上水泥和柏油，大量的超导矿石被拉走——或者留下几棵树，作为观光景点，建立一片别墅群……在最终资源毫无利用价值之后，这颗星球被毫不留情的废弃，成为宇宙中的垃圾……<br/>Tags - <a href="http://zhoujin.com/tags/%25E4%25BA%2591%25E5%258D%2597/" rel="tag">云南</a> , <a href="http://zhoujin.com/tags/%25E8%25A5%25BF%25E5%258D%2597/" rel="tag">西南</a> , <a href="http://zhoujin.com/tags/%25E5%25B9%25B2%25E6%2597%25B1/" rel="tag">干旱</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/140/</link>
<title><![CDATA[不信任的博弈]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Thu, 01 Apr 2010 07:08:34 +0000</pubDate> 
<guid>http://zhoujin.com/post/140/</guid> 
<description>
<![CDATA[ 
	很多人在怀念那过去的年代，那个软件英雄的年代：一两个人废寝忘食通宵达旦搞定某一两个关键问题，甚至对交付产生关键作用。最后交付成功了，这些人成为了英雄，在一年一年的口口相传中，成为英雄般的记忆。<br/><br/>说的是十年前的事情。<br/><br/>然而现在英雄越见少了——英雄们逐渐淡出一线开发视野。现在动辄几十人上百人的团队下，英雄的候选们发现他们处于一个相当悲凉的境地：即便有心救国，看着若干年积累出来的代码；或者正在积累中的代码，充满着无力的挫败感。我依然记得在某个项目中，只有20人左右的团队，当发现架构存在问题的时候，却也无法做什么：交付的压力持续不断的增加着，新的方式需要进行花时间验证才能得到证明，于是一方面团队按照旧的方式将代码往上堆，另一方面对此感到痛苦的不断地修改着——这个循环直到项目结束才算真正意义上的结束。<br/><br/>业务团队与开发团队之间的不信任感从此而产生——<br/><br/>为什么这么简单的一个功能要这么久？<br/>不行，这个功能一定要在某月某日之前出来！<br/>做不出来，丢了这个客户/市场，你负责吗？！<br/><br/>于是，迫于这种压力，开发团队只好采用更加临时的解决方案来快速解决问题——寄希望于某一天能够有时间把这些问题神奇般的解决——可是这一天从来都没有到来过。一个交付周期过去了，下一个接踵而至，带来更大的挑战——“什么？需要时间重构？没时间啦！这个客户比上一个更重要，一定要做出来啊！”<br/><br/>听到一个很形象的例子。一只蚂蚁只能拉100斤的东西。由于要交付更多的东西，蚂蚁工头对小蚂蚁说，120斤，挑战一下吧。小蚂蚁咬咬牙，挑战了一下。这一下真挑战成功了——120斤成功的拉过去了！然而它自己觉得隐隐作痛——受内伤了，它想歇息一段时间，可是工头说：不错，120斤挑战成功了，这一次我们有更大的挑战，150斤，努力吧！<br/><br/>临时的方案往往带来更多的缺陷。我听说过一些团队为了快速解决某一个问题写了100行的SQL代码——这些SQL代码成为后续维护的噩梦。业务团队发现了这些：虽然这些版本通过加班、通宵能够某种程度上如期交付，但是交付出来质量问题太多——不可接受。但同时要求质量和进度看起来是那么的不可行，于是，为了控制风险，好吧，以后做计划的时候给自己留下余量——不信任的博弈由此开始：<br/><br/>用户说，这个功能我要在2010年10月1日完成。<br/>市场/用户服务部门想了想，说，对开发部门的领导说，这个版本必须在2010年9月10日完成。<br/>开发部门领导想了想，对开发团队说，这个需求非常紧急，这样吧，8月15必须如期交付，否则我们就丢掉了这个客户！<br/><br/>一来二往，双方都清楚了这个游戏规则。然而作为生态链的最底端，开发团队做不了什么——既然整个博弈决定了进度第一，那么质量只好放在那些余量里面了。“先污染，再治理”，所有的临时解决方案被使用——配置文件满天飞，SQL随便写，各式的hack写法，等等等等。到了后期交付的时候，测试问题多多，改吧，加班、通宵改吧。<br/><br/>如果质量不是贯穿在开发过程中，那么通过最终的质检环节来提升质量无疑是低效的。Deming说，”Build Quality in”. 质量是隐含的。形成这个博弈的最大的原因是，从前到后对交付的轻视，对质量的轻视，对于软件演进必要的理解。进度必然是符合质量的功能点的交付，而不是狭隘的代码完成。<br/>Tags - <a href="http://zhoujin.com/tags/%25E4%25BA%25A7%25E5%2593%2581%25E8%25B4%25A8%25E9%2587%258F/" rel="tag">产品质量</a> , <a href="http://zhoujin.com/tags/%25E5%258D%259A%25E5%25BC%2588/" rel="tag">博弈</a> , <a href="http://zhoujin.com/tags/%25E4%25BA%25A4%25E4%25BB%2598/" rel="tag">交付</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/139/</link>
<title><![CDATA[Google Notifiers for Mac]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Fri, 26 Mar 2010 06:56:44 +0000</pubDate> 
<guid>http://zhoujin.com/post/139/</guid> 
<description>
<![CDATA[ 
	Google还是很照顾Mac的，至少有一大堆for Mac的官方软件。比如Picasa，在Linux下是Wine版，却有Mac的原生版本。<br/><br/>Picasa这类软件对我而言不是日常必需品，相对而言，我特别喜欢“Google Notifiers for Mac”，它是一款简单又实用的软件，用于提醒日历和Gmail。<br/><br/>没有什么花俏的东西，仅仅是常驻系统通知区域，然后通过Growl这个通知区域的工具来提醒即将到来的任务或邮件。比如：<br/><a href="http://zhoujin.com/attachment.php?fid=16" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=16" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>点击详情，可以进行大部分操作，当然都会重定向至Web界面。很方便快捷。<br/><br/>很普通的的一款软件吧。Linux下对我而言还缺少一款小巧的能提醒日历的工具，Docky上的Gmail提醒已经能满足我的需求了。<br/><br/>当然，未来这些都可能由Chrome的插件来搞定，只是桌面通知机制似乎还不成熟。<br/>Tags - <a href="http://zhoujin.com/tags/google/" rel="tag">google</a> , <a href="http://zhoujin.com/tags/mac/" rel="tag">mac</a> , <a href="http://zhoujin.com/tags/notifiers/" rel="tag">notifiers</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/138/</link>
<title><![CDATA[谷歌的搬家]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Tue, 23 Mar 2010 06:53:36 +0000</pubDate> 
<guid>http://zhoujin.com/post/138/</guid> 
<description>
<![CDATA[ 
	大家应该都知道了，谷歌搬家了，从大陆搬到了香港。<br/><br/>对我本人而言，如果不看新闻，我是不会知道的。因为从去年2月开始，我就已经是全日制VPN用户了。<br/><br/>因此我一直在设想，假如我是一个普通的谷歌粉，会对这次搬家有些什么想法呢？<br/><br/>我很难想像，而且也猜测不到未来后续事项的发展，因为功夫网经常会出人意料地做出一些常人不能理解的事情。<br/><br/>与其废尽心思去想，不如照旧做自己该做的事情。更何况谷歌现在只是搬家而已，没有被完全挡住嘛。<br/><br/>其他也没什么好说的了.<br/>Tags - <a href="http://zhoujin.com/tags/%25E8%25B0%25B7%25E6%25AD%258C/" rel="tag">谷歌</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/137/</link>
<title><![CDATA[Mac五笔输入首选：万寿果五笔输入法]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Sun, 14 Feb 2010 06:42:38 +0000</pubDate> 
<guid>http://zhoujin.com/post/137/</guid> 
<description>
<![CDATA[ 
	作为一个久经考验的五笔输入法的支持者及使用者，十年来我一直坚持着使用五笔。<br/><br/>当一些用惯电脑的人们都不知道汉字怎么写的时候，我还能把一些“繁體字”都能写出来。这是因为用五笔的人，一般会输则意味着会写。至少我就是这样。<br/><br/>但是五笔用户还有一个囧境，一般某个公司出针对某个平台的输入法时，都会先出拼音，然后再出五笔（或者选择不出）。没办法，五笔的用户少啊～<br/><br/>特别是至今为止，Android平台上还没有一款令人满意的五笔输入法，这让我有时真的有冲动去写一款，但是不可能啦。<br/><br/>然而这个时候，却有一家异类，竟然将五笔输入法做为其主打产品，它就是：万寿果软件，出了款for Mac的五笔输入法。<br/><br/>网站主页是这里：<a href="http://www.pawpawsoft.com/" target="_blank">http://www.pawpawsoft.com/</a>，因为该输入法不仅相当好用，而且完全免费，所以今天才花时间介绍一下，推荐给少之又少的五笔兼Mac用户。<br/>之前我在Mac下用的是FIT输入法，同时支持拼音和五笔，总觉得有点不适。在Ubuntu下，我用的是ibus-table-wubi，总体来说还算不错！<br/><br/>但是用了万果寿五笔输入法，才让我感觉到，这才是一款真正用心为五笔用户设计的输入法。<br/><br/>废话不多讲，开始截图：<br/><br/>首先是普通模式，嗯，正常的五笔输入法都应该是这样。<br/><a href="http://zhoujin.com/attachment.php?fid=7" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=7" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>但是它又有创新的“临时拼音”模式，按“`”即可进入<br/><a href="http://zhoujin.com/attachment.php?fid=8" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=8" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>更创新的是，临时拼音打出来的词，还会附上五笔反查编码！这个太棒了！这意味着，碰到不会打的字，我不仅能很快打出来，而且能顺便将其学会！<br/><br/>（奇怪，我要打的“shabi”怎么没出来？）<br/><a href="http://zhoujin.com/attachment.php?fid=9" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=9" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/> 嗯，临时英文模式也是相当不错的。大写一个字母，就OK了。<br/><a href="http://zhoujin.com/attachment.php?fid=10" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=10" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>还有很多特性，特别是定制能力超强，请看：<br/><a href="http://zhoujin.com/attachment.php?fid=11" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=11" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>真是一款又强大又低调的五笔输入法！<br/><br/>万寿果这家专门开发Mac软件的公司也蛮有意思，持续关注中⋯⋯<br/>Tags - <a href="http://zhoujin.com/tags/%25E8%25BE%2593%25E5%2585%25A5%25E6%25B3%2595/" rel="tag">输入法</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/146/</link>
<title><![CDATA[Servlet 3.0 新特性详解]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[J2EE]]></category>
<pubDate>Mon, 25 Jan 2010 02:47:21 +0000</pubDate> 
<guid>http://zhoujin.com/post/146/</guid> 
<description>
<![CDATA[ 
	简介： Servlet 是 Java EE 规范体系的重要组成部分，也是 Java 开发人员必须具备的基础技能，Servlet 3.0 是 Servlet 规范的最新版本。本文主要介绍了 Servlet 3.0 引入的若干重要新特性，包括异步处理、新增的注解支持、可插性支持等等，为读者顺利向新版本过渡扫清障碍。<br/><br/>Servlet 3.0 作为 Java EE 6 规范体系中一员，随着 Java EE 6 规范一起发布。该版本在前一版本（Servlet 2.5）的基础上提供了若干新特性用于简化 Web 应用的开发和部署。其中有几项特性的引入让开发者感到非常兴奋，同时也获得了 Java 社区的一片赞誉之声：<br/><br/>异步处理支持：有了该特性，Servlet 线程不再需要一直阻塞，直到业务处理完毕才能再输出响应，最后才结束该 Servlet 线程。在接收到请求之后，Servlet 线程可以将耗时的操作委派给另一个线程来完成，自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况，这将大大减少服务器资源的占用，并且提高 并发处理速度。<br/>新增的注解支持：该版本新增了若干注解，用于简化 Servlet、过滤器（Filter）和监听器（Listener）的声明，这使得 web.xml 部署描述文件从该版本开始不再是必选的了。<br/>可插性支持：熟悉 Struts2 的开发者一定会对其通过插件的方式与包括 Spring 在内的各种常用框架的整合特性记忆犹新。将相应的插件封装成 JAR 包并放在类路径下，Struts2 运行时便能自动加载这些插件。现在 Servlet 3.0 提供了类似的特性，开发者可以通过插件的方式很方便的扩充已有 Web 应用的功能，而不需要修改原有的应用。<br/>下面我们将逐一讲解这些新特性，通过下面的学习，读者将能够明晰了解 Servlet 3.0 的变化，并能够顺利使用它进行日常的开发工作。<br/><br/>Servlet 3.0 之前，一个普通 Servlet 的主要工作流程大致如下：首先，Servlet 接收到请求之后，可能需要对请求携带的数据进行一些预处理；接着，调用业务接口的某些方法，以完成业务处理；最后，根据处理的结果提交响 应，Servlet 线程结束。其中第二步的业务处理通常是最耗时的，这主要体现在数据库操作，以及其它的跨网络调用等，在此过程中，Servlet 线程一直处于阻塞状态，直到业务方法执行完毕。在处理业务的过程中，Servlet 资源一直被占用而得不到释放，对于并发较大的应用，这有可能造成性能的瓶颈。对此，在以前通常是采用私有解决方案来提前结束 Servlet 线程，并及时释放资源。<br/><br/>Servlet 3.0 针对这个问题做了开创性的工作，现在通过使用 Servlet 3.0 的异步处理支持，之前的 Servlet 处理流程可以调整为如下的过程：首先，Servlet 接收到请求之后，可能首先需要对请求携带的数据进行一些预处理；接着，Servlet 线程将请求转交给一个异步线程来执行业务处理，线程本身返回至容器，此时 Servlet 还没有生成响应数据，异步线程处理完业务以后，可以直接生成响应数据（异步线程拥有 ServletRequest 和 ServletResponse 对象的引用），或者将请求继续转发给其它 Servlet。如此一来， Servlet 线程不再是一直处于阻塞状态以等待业务逻辑的处理，而是启动异步线程之后可以立即返回。<br/><br/>异步处理特性可以应用于 Servlet 和过滤器两种组件，由于异步处理的工作模式和普通工作模式在实现上有着本质的区别，因此默认情况下，Servlet 和过滤器并没有开启异步处理特性，如果希望使用该特性，则必须按照如下的方式启用：<br/>1.对于使用传统的部署描述文件 (web.xml) 配置 Servlet 和过滤器的情况，Servlet 3.0 为 <servlet> 和 <filter> 标签增加了 <async-supported> 子标签，该标签的默认取值为 false，要启用异步处理支持，则将其设为 true 即可。以 Servlet 为例，其配置方式如下所示：<div class="code">&lt;servlet&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;DemoServlet&lt;/servlet-name&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;footmark.servlet.Demo Servlet&lt;/servlet-class&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;async-supported&gt;true&lt;/async-supported&gt; <br/>&lt;/servlet&gt;</div><br/>2.对于使用 Servlet 3.0 提供的 @WebServlet 和 @WebFilter 进行 Servlet 或过滤器配置的情况，这两个注解都提供了 asyncSupported 属性，默认该属性的取值为 false，要启用异步处理支持，只需将该属性设置为 true 即可。以 @WebFilter 为例，其配置方式如下所示：<div class="code">@WebFilter(urlPatterns = &quot;/demo&quot;,asyncSupported = true) <br/>public class DemoFilter implements Filter&#123;...&#125; </div><br/>&nbsp;&nbsp;一个简单的模拟异步处理的 Servlet 示例如下：<div class="code">@WebServlet(urlPatterns = &quot;/demo&quot;, asyncSupported = true)<br/>public class AsyncDemoServlet extends HttpServlet &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;@Override<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void doGet(HttpServletRequest req, HttpServletResponse resp)<br/>&nbsp;&nbsp;&nbsp;&nbsp;throws IOException, ServletException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resp.setContentType(&quot;text/html;charset=UTF-8&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter out = resp.getWriter();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(&quot;进入Servlet的时间：&quot; + new Date() + &quot;.&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.flush();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在子线程中执行业务调用，并由其负责输出响应，主线程退出<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AsyncContext ctx = req.startAsync();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new Thread(new Executor(ctx)).start();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(&quot;结束Servlet的时间：&quot; + new Date() + &quot;.&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.flush();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>public class Executor implements Runnable &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private AsyncContext ctx = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public Executor(AsyncContext ctx)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.ctx = ctx;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public void run()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//等待十秒钟，以模拟业务方法的执行<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(10000);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter out = ctx.getResponse().getWriter();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(&quot;业务处理完毕的时间：&quot; + new Date() + &quot;.&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.flush();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.complete();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; catch (Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;</div><br/>除此之外，Servlet 3.0 还为异步处理提供了一个监听器，使用 AsyncListener 接口表示。它可以监控如下四种事件：<br/>1.异步线程开始时，调用 AsyncListener 的 onStartAsync(AsyncEvent event) 方法；<br/>2.异步线程出错时，调用 AsyncListener 的 onError(AsyncEvent event) 方法；<br/>3.异步线程执行超时，则调用 AsyncListener 的 onTimeout(AsyncEvent event) 方法；<br/>4.异步执行完毕时，调用 AsyncListener 的 onComplete(AsyncEvent event) 方法；<br/><br/>要注册一个 AsyncListener，只需将准备好的 AsyncListener 对象传递给 AsyncContext 对象的 addListener() 方法即可，如下所示：<br/><div class="code">AsyncContext ctx = req.startAsync(); <br/>ctx.addListener(new AsyncListener() &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void onComplete(AsyncEvent asyncEvent) throws IOException &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 做一些清理工作或者其他<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125; <br/>&nbsp;&nbsp;&nbsp;&nbsp;... <br/>&#125;); </div><br/>Servlet 3.0 的部署描述文件 web.xml 的顶层标签 <web-app> 有一个 metadata-complete 属性，该属性指定当前的部署描述文件是否是完全的。如果设置为 true，则容器在部署时将只依赖部署描述文件，忽略所有的注解（同时也会跳过 web-fragment.xml 的扫描，亦即禁用可插性支持，具体请看后文关于 可 插性支持的讲解）；如果不配置该属性，或者将其设置为 false，则表示启用注解支持（和可插性支持）。<br/><br/>@WebServlet<br/><br/>@WebServlet 用于将一个类声明为 Servlet，该注解将会在部署时被容器处理，容器将根据具体的属性配置将相应的类部署为 Servlet。该注解具有下表给出的一些常用属性（以下所有属性均为可选属性，但是 vlaue 或者 urlPatterns 通常是必需的，且二者不能共存，如果同时指定，通常是忽略 value 的取值）：<br/>表 1. @WebServlet 主要属性列表<br/><br/>属性名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;描述<br/>name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定 Servlet 的 name 属性，等价于 <servlet-name>。如果没有显式指定，则该 Servlet 的取值即为类的全限定名。<br/>value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该属性等价于 urlPatterns 属性。两个属性不能同时使用。<br/>urlPatterns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定一组 Servlet 的 URL 匹配模式。等价于 <url-pattern> 标签。<br/>loadOnStartup&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指 定 Servlet 的加载顺序，等价于 <load-on-startup> 标签。<br/>initParams&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebInitParam[]&nbsp;&nbsp;指定一组 Servlet 初始化参数，等价于 <init-param> 标签。<br/>asyncSupported&nbsp;&nbsp;boolean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 声 明 Servlet 是否支持异步操作模式，等价于 <async-supported> 标签。<br/>description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该 Servlet 的描述信息，等价于 <description> 标签。<br/>displayName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该 Servlet 的显示名，通常配合工具使用，等价于 <display-name> 标签。<br/><br/><br/>下面是一个简单的示例：<br/><div class="code">@WebServlet(urlPatterns = &#123;&quot;/simple&quot;&#125;, asyncSupported = true, <br/>loadOnStartup = -1, name = &quot;SimpleServlet&quot;, displayName = &quot;ss&quot;, <br/>initParams = &#123;@WebInitParam(name = &quot;username&quot;, value = &quot;tom&quot;)&#125; <br/>) <br/>public class SimpleServlet extends HttpServlet&#123; … &#125; </div><br/><br/>如此配置之后，就可以不必在 web.xml 中配置相应的 <servlet> 和 <servlet-mapping> 元素了，容器会在部署时根据指定的属性将该类发布为 Servlet。它的等价的 web.xml 配置形式如下：<br/><div class="code">&lt;servlet&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;display-name&gt;ss&lt;/display-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;SimpleServlet&lt;/servlet-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;footmark.servlet.SimpleServlet&lt;/servlet-class&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;-1&lt;/load-on-startup&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;async-supported&gt;true&lt;/async-supported&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;username&lt;/param-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;tom&lt;/param-value&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br/>&lt;/servlet&gt;<br/>&lt;servlet-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;SimpleServlet&lt;/servlet-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/simple&lt;/url-pattern&gt;<br/>&lt;/servlet-mapping&gt;</div><br/><br/>@WebInitParam<br/><br/>该注解通常不单独使用，而是配合 @WebServlet 或者 @WebFilter 使用。它的作用是为 Servlet 或者过滤器指定初始化参数，这等价于 web.xml 中 <servlet> 和 <filter> 的 <init-param> 子标签。@WebInitParam 具有下表给出的一些常用属性：<br/><br/>@WebInitParam<br/><br/>该注解通常不单独使用，而是配合 @WebServlet 或者 @WebFilter 使用。它的作用是为 Servlet 或者过滤器指定初始化参数，这等价于 web.xml 中 <servlet> 和 <filter> 的 <init-param> 子标签。@WebInitParam 具有下表给出的一些常用属性：<br/><br/><br/>表 2. @WebInitParam 的常用属性<br/><br/>属性名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类型&nbsp;&nbsp;是否可选&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;描述<br/>name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp; 否&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定参数的名字，等 价于 <param-name>。<br/>value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp;否&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指 定参数的值，等价于 <param-value>。<br/>description&nbsp;&nbsp; String&nbsp;&nbsp;是&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于参数的描述，等价于 <description>。<br/> <br/><br/>@WebFilter<br/><br/>@WebFilter 用于将一个类声明为过滤器，该注解将会在部署时被容器处理，容器将根据具体的属性配置将相应的类部署为过滤器。该注解具有下表给出的一些常用属性 ( 以下所有属性均为可选属性，但是 value、urlPatterns、servletNames 三者必需至少包含一个，且 value 和 urlPatterns 不能共存，如果同时指定，通常忽略 value 的取值 )：<br/><br/><br/>表 3. @WebFilter 的常用属性<br/><br/>属性名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;描述<br/>filterName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;指定过滤器的 name 属性，等价于 <filter-name><br/>value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该属性等价于 urlPatterns 属性。但是两者不应该同时使用。<br/>urlPatterns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定一组过滤器的 URL 匹配模式。等价于 <url-pattern> 标签。<br/>servletNames&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值，或者是 web.xml 中 <servlet-name> 的取值。<br/>dispatcherTypes&nbsp;&nbsp;DispatcherType&nbsp;&nbsp;指定过滤器的转发模式。具体取值包括：ASYNC、ERROR、 FORWARD、INCLUDE、REQUEST。<br/>initParams&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebInitParam[]&nbsp;&nbsp; 指定一组过滤器初始化参数，等价于 <init-param> 标签。<br/>asyncSupported&nbsp;&nbsp;boolean&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;声明过滤器是否支持异步操作模式，等价于 <async-supported> 标签。<br/>description&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该过滤器的描述信息，等价于 <description> 标签。<br/>displayName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 该过滤器的显示名，通常配合工具使用，等价于 <display-name> 标签。<br/><br/>下面是一个简单的示例：<br/><div class="code">@WebFilter(servletNames = &#123;&quot;SimpleServlet&quot;&#125;,filterName=&quot;SimpleFilter&quot;) <br/>public class LessThanSixFilter implements Filter&#123;...&#125; </div><br/>如此配置之后，就可以不必在 web.xml 中配置相应的 <filter> 和 <filter-mapping> 元素了，容器会在部署时根据指定的属性将该类发布为过滤器。它等价的 web.xml 中的配置形式为：<br/><div class="code">&lt;filter&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-name&gt;SimpleFilter&lt;/filter-name&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-class&gt;xxx&lt;/filter-class&gt; <br/>&lt;/filter&gt; <br/>&lt;filter-mapping&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-name&gt;SimpleFilter&lt;/filter-name&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;SimpleServlet&lt;/servlet-name&gt; <br/>&lt;/filter-mapping&gt;</div><br/><br/>@WebListener<br/><br/>该注解用于将类声明为监听器，被 @WebListener 标注的类必须实现以下至少一个接口：<br/><br/>ServletContextListener<br/>ServletContextAttributeListener<br/>ServletRequestListener<br/>ServletRequestAttributeListener<br/>HttpSessionListener<br/>HttpSessionAttributeListener<br/>该注解使用非常简单，其属性如下：<br/><br/><br/>表 4. @WebListener 的常用属性<br/><br/>属性名&nbsp;&nbsp;类型&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否可选&nbsp;&nbsp;描述<br/>value&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp;是&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;该监听器的描述信 息。<br/> <br/><br/>一个简单示例如下：<br/><div class="code">@WebListener(&quot;This is only a demo listener&quot;) <br/>public class SimpleListener implements ServletContextListener&#123;...&#125; </div><br/>如此，则不需要在 web.xml 中配置 <listener> 标签了。它等价的 web.xml 中的配置形式如下：<br/><div class="code">&lt;listener&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;listener-class&gt;footmark.servlet.SimpleListener&lt;/listener-class&gt; <br/>&lt;/listener&gt; </div><br/>@MultipartConfig<br/><br/>该注解主要是为了辅助 Servlet 3.0 中 HttpServletRequest 提供的对上传文件的支持。该注解标注在 Servlet 上面，以表示该 Servlet 希望处理的请求的 MIME 类型是 multipart/form-data。另外，它还提供了若干属性用于简化对上传文件的处理。具体如下：<br/><br/><br/>表 5. @MultipartConfig 的常用属性<br/><br/>属性名&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;类型&nbsp;&nbsp; 是否可选&nbsp;&nbsp;&nbsp;&nbsp; 描述<br/>fileSizeThreshold&nbsp;&nbsp;int&nbsp;&nbsp;&nbsp;&nbsp; 是&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当数据量大于该值时，内容将被写入文件。<br/>location&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;&nbsp; 是&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;存放生成的文件地址。<br/>maxFileSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp; 是&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;允许上传的文件最大值。默认值为 -1，表示没有限制。<br/>maxRequestSize&nbsp;&nbsp;long&nbsp;&nbsp;&nbsp;&nbsp; 是&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;针对该 multipart/form-data 请求的最大数量，默认值为 -1，表示没有限制。<br/><br/>如果说 3.0 版本新增的注解支持是为了简化 Servlet/ 过滤器 / 监听器的声明，从而使得 web.xml 变为可选配置， 那么新增的可插性 (pluggability) 支持则将 Servlet 配置的灵活性提升到了新的高度。熟悉 Struts2 的开发者都知道，Struts2 通过插件的形式提供了对包括 Spring 在内的各种开发框架的支持，开发者甚至可以自己为 Struts2 开发插件，而 Servlet 的可插性支持正是基于这样的理念而产生的。使用该特性，现在我们可以在不修改已有 Web 应用的前提下，只需将按照一定格式打成的 JAR 包放到 WEB-INF/lib 目录下，即可实现新功能的扩充，不需要额外的配置。<br/><br/>Servlet 3.0 引入了称之为“Web 模块部署描述符片段”的 web-fragment.xml 部署描述文件，该文件必须存放在 JAR 文件的 META-INF 目录下，该部署描述文件可以包含一切可以在 web.xml 中定义的内容。JAR 包通常放在 WEB-INF/lib 目录下，除此之外，所有该模块使用的资源，包括 class 文件、配置文件等，只需要能够被容器的类加载器链加载的路径上，比如 classes 目录等。<br/><br/>现在，为一个 Web 应用增加一个 Servlet 配置有如下三种方式 ( 过滤器、监听器与 Servlet 三者的配置都是等价的，故在此以 Servlet 配置为例进行讲述，过滤器和监听器具有与之非常类似的特性 )：<br/>1.编写一个类继承自 HttpServlet，将该类放在 classes 目录下的对应包结构中，修改 web.xml，在其中增加一个 Servlet 声明。这是最原始的方式；<br/>2.编写一个类继承自 HttpServlet，并且在该类上使用 @WebServlet 注解将该类声明为 Servlet，将该类放在 classes 目录下的对应包结构中，无需修改 web.xml 文件。<br/>3.编写一个类继承自 HttpServlet，将该类打成 JAR 包，并且在 JAR 包的 META-INF 目录下放置一个 web-fragment.xml 文件，该文件中声明了相应的 Servlet 配置。web-fragment.xml 文件示例如下：<br/><div class="code">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br/>&lt;web-fragment <br/>&nbsp;&nbsp;&nbsp;&nbsp;xmlns=http://java.sun.com/xml/ns/javaee<br/>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; version=&quot;3.0&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee<br/>&nbsp;&nbsp;&nbsp;&nbsp;http://java.sun.com/xml/ns/javaee/web-fragment_3_0.xsd&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;metadata-complete=&quot;true&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;fragment&lt;/servlet-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;footmark.servlet.FragmentServlet&lt;/servlet-class&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;fragment&lt;/servlet-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/fragment&lt;/url-pattern&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet-mapping&gt;<br/>&lt;/web-fragment&gt;</div><br/>从上面的示例可以看出，web-fragment.xml 与 web.xml 除了在头部声明的 XSD 引用不同之外，其主体配置与 web.xml 是完全一致的。<br/><br/>由于一个 Web 应用中可以出现多个 web-fragment.xml 声明文件，加上一个 web.xml 文件，加载顺序问题便成了不得不面对的问题。Servlet 规范的专家组在设计的时候已经考虑到了这个问题，并定义了加载顺序的规则。<br/><br/>web-fragment.xml 包含了两个可选的顶层标签，<name> 和 <ordering>，如果希望为当前的文件指定明确的加载顺序，通常需要使用这两个标签，<name> 主要用于标识当前的文件，而 <ordering> 则用于指定先后顺序。一个简单的示例如下：<br/><div class="code">&lt;web-fragment...&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;FragmentA&lt;/name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;ordering&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;after&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;FragmentB&lt;/name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;FragmentC&lt;/name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/after&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;before&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;others/&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/before&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/ordering&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;...<br/>&lt;/web-fragment&gt;</div><br/>如上所示， <name> 标签的取值通常是被其它 web-fragment.xml 文件在定义先后顺序时引用的，在当前文件中一般用不着，它起着标识当前文件的作用。<br/><br/>在 <ordering> 标签内部，我们可以定义当前 web-fragment.xml 文件与其他文件的相对位置关系，这主要通过 <ordering> 的 <after> 和 <before> 子标签来实现的。在这两个子标签内部可以通过 <name> 标签来指定相对应的文件。比如：<br/><div class="code">&lt;after&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;FragmentB&lt;/name&gt; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;FragmentC&lt;/name&gt; <br/>&lt;/after&gt; </div><br/>以上片段则表示当前文件必须在 FragmentB 和 FragmentC 之后解析。<before> 的使用于此相同，它所表示的是当前文件必须早于 <before> 标签里所列出的 web-fragment.xml 文件。<br/><br/>除了将所比较的文件通过 <name> 在 <after> 和 <begin> 中列出之外，Servlet 还提供了一个简化的标签 <others/>。它表示除了当前文件之外的其他所有的 web-fragment.xml 文件。该标签的优先级要低于使用 <name> 明确指定的相对位置关系。<br/><br/>除了以上的新特性之外，ServletContext 对象的功能在新版本中也得到了增强。现在，该对象支持在运行时动态部署 Servlet、过滤器、监听器，以及为 Servlet 和过滤器增加 URL 映射等。以 Servlet 为例，过滤器与监听器与之类似。ServletContext 为动态配置 Servlet 增加了如下方法：<br/>1.ServletRegistration.Dynamic addServlet(String servletName,Class<? extends Servlet> servletClass)<br/>2.ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)<br/>3.ServletRegistration.Dynamic addServlet(String servletName, String className)<br/>4.<T extends Servlet> T createServlet(Class<T> clazz)<br/>5.ServletRegistration getServletRegistration(String servletName)<br/>6.Map<String,? extends ServletRegistration> getServletRegistrations()<br/>其中前三个方法的作用是相同的，只是参数类型不同而已；通过 createServlet() 方法创建的 Servlet，通常需要做一些自定义的配置，然后使用 addServlet() 方法来将其动态注册为一个可以用于服务的 Servlet。两个 getServletRegistration() 方法主要用于动态为 Servlet 增加映射信息，这等价于在 web.xml( 抑或 web-fragment.xml) 中使用 <servlet-mapping> 标签为存在的 Servlet 增加映射信息。<br/><br/>以上 ServletContext 新增的方法要么是在 ServletContextListener 的 contexInitialized 方法中调用，要么是在 ServletContainerInitializer 的 onStartup() 方法中调用。<br/><br/>ServletContainerInitializer 也是 Servlet 3.0 新增的一个接口，容器在启动时使用 JAR 服务 API(JAR Service API) 来发现 ServletContainerInitializer 的实现类，并且容器将 WEB-INF/lib 目录下 JAR 包中的类都交给该类的 onStartup() 方法处理，我们通常需要在该实现类上使用 @HandlesTypes 注解来指定希望被处理的类，过滤掉不希望给 onStartup() 处理的类。<br/><br/>HttpServletRequest 对文件上传的支持<br/><br/>此前，对于处理上传文件的操作一直是让开发者头疼的问题，因为 Servlet 本身没有对此提供直接的支持，需要使用第三方框架来实现，而且使用起来也不够简单。如今这都成为了历史，Servlet 3.0 已经提供了这个功能，而且使用也非常简单。为此，HttpServletRequest 提供了两个方法用于从请求中解析出上传的文件：<br/>1.Part getPart(String name)<br/>2.Collection<Part> getParts()<br/><br/>前者用于获取请求中给定 name 的文件，后者用于获取所有的文件。每一个文件用一个 javax.servlet.http.Part 对象来表示。该接口提供了处理文件的简易方法，比如 write()、delete() 等。至此，结合 HttpServletRequest 和 Part 来保存上传的文件变得非常简单，如下所示：<br/><br/><div class="code">Part photo = request.getPart(&quot;photo&quot;); <br/>photo.write(&quot;/tmp/photo.jpg&quot;); // 可以将两行代码简化为 request.getPart(&quot;photo&quot;).write(&quot;/tmp/photo.jpg&quot;) 一行。</div><br/><br/>另外，开发者可以配合前面提到的 @MultipartConfig 注解来对上传操作进行一些自定义的配置，比如限制上传文件的大小，以及保存文件的路径等。其用法非常简单，故不在此赘述了。<br/><br/>需要注意的是，如果请求的 MIME 类型不是 multipart/form-data，则不能使用上面的两个方法，否则将抛异常。<br/><br/>Servlet 3.0 的众多新特性使得 Servlet 开发变得更加简单，尤其是异步处理特性和可插性支持的出现，必将对现有的 MVC 框架产生深远影响。虽然我们通常不会自己去用 Servlet 编写控制层代码，但是也许在下一个版本的 Struts 中，您就能切实感受到这些新特性带来的实质性改变。<br/>Tags - <a href="http://zhoujin.com/tags/servlet/" rel="tag">servlet</a> , <a href="http://zhoujin.com/tags/3.0/" rel="tag">3.0</a> , <a href="http://zhoujin.com/tags/j2ee/" rel="tag">j2ee</a> , <a href="http://zhoujin.com/tags/filter/" rel="tag">filter</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/134/</link>
<title><![CDATA[七个小细节毁掉你的身体]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Fri, 01 Jan 2010 00:47:26 +0000</pubDate> 
<guid>http://zhoujin.com/post/134/</guid> 
<description>
<![CDATA[ 
	有些人很注意养生保健，但在生活习惯上却存在一些误区，像下面这些“亡羊补牢”的做法，不是尤未为晚而是为时已晚了，这已经对身体健康造成了影响。<br/>　　饿了才吃：<br/>　　生活中许多人不是按时就餐，且有相当一部分人不吃早餐，其理由之一就是“不饿”。其实，食物在胃内仅停留4－5小时，感到饥饿时胃早已排空。胃黏膜这时会被胃液“自我消化”，引起胃炎或消化性溃疡。饮食规律、营养均衡是养生保健必不可少的物质基础。 <br/>　　渴了才喝：<br/>　　平时不喝水、口渴时才饮水的人相当多，尤其是青少年和“大忙人”。他们不了解渴了是体内缺水的反应，这时再补充水分为时已晚。水对人体代谢比食物还重要，生理学家告诉我们，每个成年人每天需饮水1500毫升左右。晨间或餐前一小时喝一杯水大有益处，既可洗涤胃肠，又有助于消化，促进食欲。据调查研究，有经常饮水习惯的人，便秘、尿路结石的患病率明显低于不常饮水的人。<br/>　　累了才歇：<br/>　　许多人误以为累了是应该休息的信号，其实是身体相当疲劳的“自我感觉”，这时才休息已为时过晚。过度疲劳容易积劳成疾，降低人体免疫力，使疾病乘虚而入。不论是脑力还是体力劳动者，在连续工作一段时间后，都要适当的休息或调整。<br/>　　困了才睡：<br/>　　困倦是大脑相当疲劳的表现，不应该等到这时才去睡觉。按时就寝不仅可以保护大脑，还能提高睡眠质量，减少失眠。人的一生约有1/3时间是在睡眠中度过的，睡眠是新陈代谢活动中重要的生理过程。只有养成定时睡觉的习惯，保证每天睡眠时间不少于7小时，才能维持睡眠中枢生物钟的正常运转。<br/>　　急了才排：<br/>　　很多人只在便意明显时才去厕所，甚至有便不解，宁愿憋着，这样对健康极为不利。大小便在体内停留过久，容易引起便秘或膀胱过度充盈，粪便和尿液内的有毒物质被人体重吸收，可导致“自身中毒”。因此，应养成按时排便的习惯，尤以晨间为好，以减少痔疮、便秘、大肠癌的发病机会。<br/>　　胖了才减：<br/>　　随着生活水平的提高，肥胖患者日逐增加。导致肥胖的原因主要是进食过量，营养过剩，缺乏运动。而这几种诱因完全可以在体重超标之前加以预防，如控制饮食，防止暴饮暴食，调整饮食，加强体育锻炼。目前市场上还没有理想的减肥药，因此，减肥不如防止肥胖。<br/>　　病了才治<br/>　　疾病应该以防为主，等疾病上身，已经对身体造成危害。疾病到来时都是有信号的，比如人们常说的亚健康状态就是疾病的前奏。平时应该加强锻炼，提高自身抵御疾病的能力，感到身体的亚健康，就要引起注意，要把疾病消灭在萌芽状态。<br/>Tags - <a href="http://zhoujin.com/tags/%25E5%2581%25A5%25E5%25BA%25B7/" rel="tag">健康</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/132/</link>
<title><![CDATA[600597光明乳业]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[谈股论金]]></category>
<pubDate>Fri, 11 Dec 2009 01:48:36 +0000</pubDate> 
<guid>http://zhoujin.com/post/132/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;中国未来宏观政策就是刺激消费，这是个大思路。在刺激消费中老牌子的消费品牌最受惠。现在市场上的品牌股茅台、五粮液、伊利都很高了。光明乳业600597仍被低估，这个市场稀缺资源。全世界都看好中国消费市场，中国消费市场最看好上海，光明乳业稳占上海市场更有金字招牌。光明一年销售额80亿，市值98亿，绝对低估！具有很大的并购价值。光明现在新产品占了销售一半，管理明显改善，品牌由高端向下辐射，业绩增长空间很大。<br/>Tags - <a href="http://zhoujin.com/tags/%25E5%2585%2589%25E6%2598%258E/" rel="tag">光明</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/131/</link>
<title><![CDATA[《2012》启示了什么？]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Thu, 19 Nov 2009 07:53:50 +0000</pubDate> 
<guid>http://zhoujin.com/post/131/</guid> 
<description>
<![CDATA[ 
	1.世界上离地核最近的地下通道是在印度，说明虽然印度可能不是全球地铁枢纽中心，但它绝对是全球地道枢纽中心。<br/>2.别轻视一个突然出现在宴会上不穿礼服的小伙，他可能是带着一个足够影响世界安危的消息。<br/>3.别轻视一个志向的疯子，真理一般都掌握在疯子手中，要时刻留心疯子的言论，他们的话要比某些专家教授权威的多也准确的多。<br/>4.即使你买买不起飞机也要去学开飞机，真到了世界末日你不会，会很郁闷的。<br/>5.如果女友跟你结婚要你买房，而且是说着没有房子没有安全感这种理由，你可以花128元买两张电影票和一桶爆米花和她一起看《2012》，然后成功打消她的观点。<br/>6.救命的“票”可能一分不取，可能要十亿欧元。<br/>7.世界上父爱的伟大是一样的，不管你是总统、富商、还是普通人。为了儿女，他们可以放弃一切甚至生命。<br/>8.关键时刻相信中国，相信“Made in China”，否则世界各国也不会把造“方舟”的地点选在中国。<br/>9.中国完全有能力造出及其坚固的航空母舰，而且它比美国航母更强，美国航母在总统面前“粉身碎骨”，中国航母也许还能在世界末日拯救几万人。<br/>10.千万不要在网上看盗版的电影，尤其是看这种音响效果很重要的灾难片，一个从电影院里面偷录出来的电影会让你耳朵先到达世界末日。<br/>Tags - <a href="http://zhoujin.com/tags/2012/" rel="tag">2012</a> , <a href="http://zhoujin.com/tags/%25E4%25B8%2596%25E7%2595%258C%25E6%259C%25AB%25E6%2597%25A5/" rel="tag">世界末日</a> , <a href="http://zhoujin.com/tags/%25E7%2581%25BE%25E9%259A%25BE%25E7%2589%2587/" rel="tag">灾难片</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/133/</link>
<title><![CDATA[Tomcat内存溢出的三种情况及解决办法分析]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[J2EE]]></category>
<pubDate>Sun, 15 Nov 2009 02:42:35 +0000</pubDate> 
<guid>http://zhoujin.com/post/133/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;Tomcat内存溢出的原因<br/>&nbsp;&nbsp;&nbsp;&nbsp;在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的，当然处理方式也不一样。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;这里根据平时遇到的情况和相关资料进行一个总结。常见的一般会有下面三种情况：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;1.OutOfMemoryError： Java heap space<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;2.OutOfMemoryError： PermGen space<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;3.OutOfMemoryError： unable to create new native thread.<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;Tomcat内存溢出解决方案：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;对于前两种情况，在应用本身没有内存泄露的情况下可以用设置tomcat jvm参数来解决。（-Xms -Xmx -XX：PermSize&nbsp;&nbsp;-XX：MaxPermSize）<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;最后一种可能需要调整操作系统和tomcat jvm参数同时调整才能达到目的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;第一种：是堆溢出。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;在JVM中如果98％的时间是用于GC且可用的 Heap size 不足2％的时候将抛出此异常信息。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;没有内存泄露的情况下，调整-Xms -Xmx参数可以解决。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;-Xms：初始堆大小<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;-Xmx：最大堆大小<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;但堆的大小受下面三方面影响：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;1.相关操作系统的数据模型（32-bt还是64-bit）限制；（32位系统下，一般限制在1.5G~2G；我在2003 server 系统下（物理内存：4G和6G，jdk：1.6）测试 1612M，64为操作系统对内存无限制。）<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;2.系统的可用虚拟内存限制；<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;3.系统的可用物理内存限制。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;堆的大小可以使用 java -Xmx***M&nbsp;&nbsp;version 命令来测试。支持的话会出现jdk的版本号，不支持会报错。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;-Xms -Xmx一般配置成一样比较好比如set JAVA_OPTS= -Xms1024m -Xmx1024m<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;第二种：永久保存区域溢出<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;PermGen space的全称是Permanent Generation space，是指内存的永久保存区域。这一部分用于存放Class和Meta的信息，Class在被 Load的时候被放入PermGen space区域，它和和存放Instance的Heap区域不同，GC（Garbage Collection）不会在主程序运行期对PermGen space进行清理，所以如果你的APP会LOAD很多CLASS的话，就很可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。但目前的hibernate和spring项目中也很容易出现这样的问题。(<a href="http://www.javaeye.com/topic/80620?page=1)" target="_blank">http://www.javaeye.com/topic/80620?page=1)</a> 的帖子有讨论的这个问题。可能是由于这些框架会动态class，而且jvm的gc是不会清理PemGen space的，导致内存溢出。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;这一个一般是加大-XX：PermSize&nbsp;&nbsp;-XX：MaxPermSize 来解决问题。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;-XX：PermSize 永久保存区域初始大小<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;-XX：PermSize 永久保存区域初始最大值<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;这一般结合第一条使用，比如 set JAVA_OPTS= -Xms1024m -Xmx1024m&nbsp;&nbsp;-XX：PermSize=128M -XX：PermSize=256M<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;有一点需要注意：java -Xmx***M&nbsp;&nbsp;version 命令来测试的最大堆内存是 -Xmx与 -XX：PermSize的 和 比如系统支持最大的jvm堆大小事1.5G，那&nbsp;&nbsp;-Xmx1024m&nbsp;&nbsp;-XX：PermSize=768M 是无法运行的。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;第三种：无法创建新的线程。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;这种现象比较少见，也比较奇怪，主要是和jvm与系统内存的比例有关。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;这种怪事是因为JVM已经被系统分配了大量的内存（比如1.5G），并且它至少要占用可用内存的一半。有人发现，在线程个数很多的情况下，你分配给JVM的内存越多，那么，上述错误发生的可能性就越大。<br/>&nbsp;&nbsp;&nbsp;&nbsp;产生这种现象的原因如下（从这个blog中了解到原因：<a href="http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html" target="_blank">http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html</a>）：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;每一个32位的进程最多可以使用2G的可用内存，因为另外2G被操作系统保留。这里假设使用1.5G给JVM，那么还余下500M可用内存。这500M内存中的一部分必须用于系统dll的加载，那么真正剩下的也许只有400M，现在关键的地方出现了：当你使用Java创建一个线程，在JVM的内存里也会创建一个Thread对象，但是同时也会在操作系统里创建一个真正的物理线程（参考JVM规范），操作系统会在余下的400兆内存里创建这个物理线程，而不是在JVM的1500M的内存堆里创建。在jdk1.4里头，默认的栈大小是256KB，但是在jdk1.5里头，默认的栈大小为1M每线程，因此，在余下400M的可用内存里边我们最多也只能创建400个可用线程。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;这样结论就出来了，要想创建更多的线程，你必须减少分配给JVM的最大内存。还有一种做法是让JVM宿主在你的JNI代码里边。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;给出一个有关能够创建线程的最大个数的估算公式：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;（MaxProcessMemory - JVMMemory - ReservedOsMemory） / （ThreadStackSize） = Number of threads<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;对于jdk1.5而言，假设操作系统保留120M内存：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;1.5GB JVM： （2GB-1.5Gb-120MB）/（1MB） = ~380 threads<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;1.0GB JVM： （2GB-1.0Gb-120MB）/（1MB） = ~880 threads<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;在2000/XP/2003的boot.ini里头有一个启动选项，好像是：/PAE /3G ，可以让用户进程最大内存扩充至3G，这时操作系统只能占用最多1G的虚存。那样应该可以让JVM创建更多的线程。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;因此这种情况需要结合操作系统进行相关调整。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;因此：我们需要结合不同情况对tomcat内存分配进行不同的诊断才能从根本上解决问题<br/>Tags - <a href="http://zhoujin.com/tags/tomcat/" rel="tag">tomcat</a> , <a href="http://zhoujin.com/tags/%25E5%2586%2585%25E5%25AD%2598/" rel="tag">内存</a> , <a href="http://zhoujin.com/tags/%25E6%25BA%25A2%25E5%2587%25BA/" rel="tag">溢出</a> , <a href="http://zhoujin.com/tags/%25E4%25BC%2598%25E5%258C%2596/" rel="tag">优化</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/130/</link>
<title><![CDATA[如何用程序指定Birt报表的JDBC Connection]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Sat, 12 Sep 2009 00:46:36 +0000</pubDate> 
<guid>http://zhoujin.com/post/130/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;Birt报表制作时会记录了jdbc连接信息（如果用jdbc连接），运行时直接用这连接信息取数据生成报表！但很多时候我们运行报表的环境和制作报表环境不一样，连接信息不一样或不确定，这样需要由程序来控制jdbc的Connection，可惜Birt的Report Engine没有提供方便的接口来实现我们的需求！<br/>&nbsp;&nbsp;&nbsp;&nbsp; Jason在“Birt world” blog中标题为“Using a supplied connection with BIRT”提供了很好的解决方案，可以通过修改oda jdbc plugins和IRunTask的setAppContext来实现程序控制数据连接方式。<br/>&nbsp;&nbsp;&nbsp;&nbsp; 我根据实习需要把代码进行了相应修改，两个类分别继承于org.eclipse.birt.report.data.oda.jdbc.OdaJdbcDriver和Connection：<div class="code"><br/>public class JdbcExistDriver extends OdaJdbcDriver&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private final static String APPLICATION_BIRT_CONNECTION = &quot;webreport.birt.connection&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private Connection conn = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public JdbcExistDriver() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public IConnection getConnection(String string) throws OdaException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(this.conn != null)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExistConnection jdbcConn = new ExistConnection();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbcConn.conn = conn;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return jdbcConn;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;else&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new org.eclipse.birt.report.data.oda.jdbc.Connection();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setAppContext(Object context) throws OdaException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map ctx = (Map)context;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.conn = (Connection)ctx.get(APPLICATION_BIRT_CONNECTION);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setLogConfiguration( LogConfiguration logConfig )<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws OdaException&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.setLogConfiguration(logConfig);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/> <br/>public class ExistConnection extends Connection &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected java.sql.Connection conn = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public ExistConnection() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void close() throws OdaException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(this.jdbcConn != null)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.jdbcConn = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void open(Properties properties) throws OdaException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.jdbcConn = conn;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;</div><br/>copy 两个类到WEB-INF&#92;platform&#92;plugins&#92;org.eclipse.birt.data.oda.jdbc_XXXXX&#92;oda-jdbc.jar里;<br/>修改plugin.xml文件，把<br/><div class="code">&lt;dataSource<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;odaVersion=&quot;3.0&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;driverClass=&quot;org.eclipse.birt.report.data.oda.jdbc.OdaJdbcDriver&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaultDisplayName=&quot;%datasource.name&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setThreadContextClassLoader=&quot;false&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id=&quot;org.eclipse.birt.report.data.oda.jdbc&quot;&gt;</div><br/>改为<div class="code">&lt;dataSource<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;odaVersion=&quot;1.0&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;driverClass=&quot;xx.JdbcExistDriver&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaultDisplayName=&quot;exit driver&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setThreadContextClassLoader=&quot;false&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id=&quot;org.eclipse.birt.report.data.oda.jdbc&quot;&gt;</div><br/>程序调用修改为：<div class="code">context.put(&quot;webreport.birt.connection&quot;,conn);</div><br/>Tags - <a href="http://zhoujin.com/tags/birt/" rel="tag">birt</a> , <a href="http://zhoujin.com/tags/jdbc/" rel="tag">jdbc</a> , <a href="http://zhoujin.com/tags/connection/" rel="tag">connection</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/129/</link>
<title><![CDATA[Birt 生成PDF中文乱码问题]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Sat, 05 Sep 2009 00:43:28 +0000</pubDate> 
<guid>http://zhoujin.com/post/129/</guid> 
<description>
<![CDATA[ 
	Birt报表生成PDF中文出现乱码，主要是因为接口没法找到相对应的字体.<br/>Birt 是通过org.eclipse.birt.report.engine.fonts plugin来设置的，我们可以通过修改文件fontsConfig.xml来指定系统字体的路径以及字体对象PDF encoding；当然设计文件中指定的字体，运行系统中必须要有，否则就要指定本字体用其它字体代换.<br/>Tags - <a href="http://zhoujin.com/tags/birt/" rel="tag">birt</a> , <a href="http://zhoujin.com/tags/pdf/" rel="tag">pdf</a> , <a href="http://zhoujin.com/tags/%25E4%25B9%25B1%25E7%25A0%2581/" rel="tag">乱码</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/128/</link>
<title><![CDATA[struts2实践- 结合jquery的纯客户端js表单校验]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[jQuery]]></category>
<pubDate>Tue, 01 Sep 2009 03:58:49 +0000</pubDate> 
<guid>http://zhoujin.com/post/128/</guid> 
<description>
<![CDATA[ 
	SSH是目前使用最多的系统集成架构,其中struts2框架也是目前最火,但是发现其对校验的支持不是很好,主要体现在如下几点 <br/>1.灵活性差 <br/>只有theme为xhtml和css_xhtml的时才能够启用纯客户端的js验证. <br/>一般用户对页面UI表示都有一定的要求,当theme为xhtml或css_xhtml的时候会导致页面的排版和用户的UI要求不一致,而且几乎无法解决该问题.并且struts2纯js客户端的错误信息是利用动态添加一个tr来显示的.这就导致如果我想把错误和表单显示在同一行,利用struts2的客户端验证就很难做到. <br/>2.默认支持的校验类型比较少. <br/>struts2默认只支持比较少的几种验证类型例如 <br/>* required validator <br/>* requiredstring validator <br/>* stringlength validator <br/>* regex validator <br/>* email validator <br/>* url validator <br/>* int validator <br/>* double validator <br/>date和表达式验证都不支持.这给使用造成了一定的麻烦. <br/>3.不支持客户端定制的js验证. <br/>针对如上几点郁闷的地方,我在网上寻找了很久终于发现了一个比较好js客户端验证的框架<br/>jquery-validate <br/>该验证框架基于jquery这个js框架,利用jquery特性实现客户端的js校验,主要特点如下 <br/>1.支持基于表单类似声明式的js验证详细例子如下:<br/><div class="code">$(&quot;#signupForm&quot;).validate(&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;rules: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstname: &quot;required&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastname: &quot;required&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required: true,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minlength: 2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required: true,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minLength: 5<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;confirm_password: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required: true,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minlength: 5,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equalTo: &quot;#password&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;email: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required: true,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;email: true<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;topic: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required: &quot;#newsletter:checked&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minLength: 2<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;agree: &quot;required&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;messages: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstname: &quot;Please enter your firstname&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastname: &quot;Please enter your lastname&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required: &quot;Please enter a username&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minLength: &quot;Your username must consist of at least 2 characters&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required: &quot;Please provide a password&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minLength: &quot;Your password must be at least 5 characters long&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;confirm_password: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required: &quot;Please provide a password&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minLength: &quot;Your password must be at least 5 characters long&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equalTo: &quot;Please enter the same password as above&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;email: &quot;Please enter a valid email address&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;agree: &quot;Please accept our policy&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125;);<br/></div><br/>2.内置多种基本校验的类型(包括与ajax结合的服务器断校验) <br/>required,remote(ajax服务器端校验器),minlength,maxlength,rangelength,min,max,range,email,url,date,,dateISO,dateDE,number,numberDE,digits,creditcard,accept,equalTo <br/>3.支持自定义校验类型. <br/>可以通过 <br/><div class="code">$.validator.addMethod(&quot;phone&quot;, function(value) &#123; <br/>return validatePhone(value); <br/>&#125;, &#039;Please enter correct format for referee phone!&#039;);</div><br/>添加自己的校验器 <br/>4.支持多种校验器的声明方式. <br/>1).利用函数声明 <br/>请参考1点 <br/>2).结合控件属性声明 <br/><div class="code">&lt;input&nbsp;&nbsp;type=&quot;radio&quot; id=&quot;gender_male&quot; value=&quot;m&quot; name=&quot;gender&quot; validate=&quot;required:true&quot; /&gt; </div><br/>3).结合控件的class属性声明 <br/><div class="code">&lt;textarea id=&quot;ccomment&quot; name=&quot;comment&quot; class=&quot;required&quot;&gt;</div><br/>这几种声明方式可以按照实际需要结合使用大大提高了灵活性. <br/>Tags - <a href="http://zhoujin.com/tags/javascript/" rel="tag">javascript</a> , <a href="http://zhoujin.com/tags/jquery/" rel="tag">jquery</a> , <a href="http://zhoujin.com/tags/struts2/" rel="tag">struts2</a> , <a href="http://zhoujin.com/tags/validator/" rel="tag">validator</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/127/</link>
<title><![CDATA[jquery的纯客户端js表单校验]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[jQuery]]></category>
<pubDate>Fri, 28 Aug 2009 03:56:24 +0000</pubDate> 
<guid>http://zhoujin.com/post/127/</guid> 
<description>
<![CDATA[ 
	官方网站：<a href="http://bassistance.de/jquery-plugins/jquery-plugin-validation/" target="_blank">http://bassistance.de/jquery-plugins/jquery-plugin-validation/</a><br/>API: <a href="http://jquery.bassistance.de/api-browser/plugins.html" target="_blank">http://jquery.bassistance.de/api-browser/plugins.html</a><br/>今天试了一下，还是比较方便的，主要是可以与jQuery结合起来做到与HTML分离.<br/>官网的例子里引用了几个js和css文件，但只需引用jquery.validate.js这一个文件即可.<br/>贴个简单的例子：<br/><div class="code">$(&#039;#EditView&#039;).validate(&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event: &quot;keyup&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rules:&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name:&#123;required:true&#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cosa_commodity_group_list:&#123;required:true&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; submitHandler:function()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(&quot;#group_list &gt; option&quot;).attr(&quot;selected&quot;,&quot;selected&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(this).submit();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&#125;);</div><br/>.event是触发校验的方式，可选值有keyup(每次按键时)，blur(当控件失去焦点时)，不使用这个参数时就只在按提交按钮时触发<br/>2.如果在提交前还需要进行一些自定义处理使用submitHandler参数，其它的都比较简单，自己看看API就成了.<br/>3.debug，如果这个参数为true，那么表单不会提交，只进行检查，调试时十分方便.<br/>4.rules，所有的检验规则都写在这个参数里面.<br/>格式为：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ID : &#123;rule1,rule2,...&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1) required: true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必输<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2) number: true 只能输入数字(包括小数)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3) digits:true 只能输入整数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(4) minValue: 3 不能小于3<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(5) maxValue: 100 最大不超过100<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(6) rangeValue:[50,100] 值范围为50-100<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(7) minLength: 5 最小长度(汉字算一个字符)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(8) maxLength:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10 最大长度(汉字算一个字符)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(9) rangeLength:[5,10] 长度范围为5至10位(汉字算一个字符)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(10) 上面的minLength, maxLength, rangeLength 这三项除了text input之外还可以用于checkbox,select这两种控件<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(11) email:true 电子邮件<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(12) equalTo: "#field" 与#field值相同<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(13) dateISO:true&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日期型，格式为1998/01/22&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1999-12-12<br/>5.messages，自定义错误信息，格式与rules类似：<br/><div class="code">messages &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password: &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required: &quot;请输入您的密码.&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;minLength: &quot;密码不能小于５位.&quot;,<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maxLength: &quot;密码不能长于32位.&quot;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;,</div><br/><br/>Tags - <a href="http://zhoujin.com/tags/jquery/" rel="tag">jquery</a> , <a href="http://zhoujin.com/tags/%25E6%25A0%25A1%25E9%25AA%258C/" rel="tag">校验</a> , <a href="http://zhoujin.com/tags/validate/" rel="tag">validate</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/126/</link>
<title><![CDATA[Apache Wicket 1.4 发布]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[WICKET]]></category>
<pubDate>Sat, 01 Aug 2009 15:09:11 +0000</pubDate> 
<guid>http://zhoujin.com/post/126/</guid> 
<description>
<![CDATA[ 
	Apache Wicket 开发团队宣布Apache Wicket 1.4正式发布。Wicket是一个面向组件的开源Java框架。Wicket完全由Apache Wicket社区用户维护支持，本次发布的Wicket版本将不再兼容Java 1.4，而是最低需要Java 5的支持。您可以利用Java 5的泛型功能编写类型安全的应用程序，创建类型安全、自动生成文档，可以重用自定义组件的功能。<br/><br/>您可以通过修改maven pom.xml配置信息升级到最新的Wicket 1.4版本，修改代码如下：<br/><div class="code">&lt;dependency&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&lt;groupid&gt;org.apache.wicket&lt;/groupid&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&lt;artifactid&gt;wicket&lt;/artifactid&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&lt;version&gt;1.4.0&lt;/version&gt;&nbsp;&nbsp;<br/>&lt;/dependency&gt;</div><br/>当然您需要同时升级Wicket关联的一些模块，比如wicket-extensions等，不要把Wicket 1.3和Wicket 1.4 混用。<br/>下面是一些Wicket 1.4版本中的重要变更：<br/>Wicket 1.4泛型化了IModel接口和其实现类，提高了Wicket应用程序的类型安全。<br/>Wicket 1.4中组件的getModel()方法和组件的setModel()方法，被重命名为getDefaultModel() 和 setDefaultModel()，以便更好的支持泛型models<br/>Wicket 1.4的Spring模块已经被合并（wicket-spring-annot已经被声明为过期，现在可以直接使用wicket-spring）<br/>Wicket 1.4中更新了大量的API,均使用Java 5语法特性的编写。<br/>Wicket 1.4的 jar打包了metadata，方便与OSGI捆绑。<br/>Tags - <a href="http://zhoujin.com/tags/apache/" rel="tag">apache</a> , <a href="http://zhoujin.com/tags/wicket/" rel="tag">wicket</a> , <a href="http://zhoujin.com/tags/web/" rel="tag">web</a> , <a href="http://zhoujin.com/tags/%25E6%25A1%2586%25E6%259E%25B6/" rel="tag">框架</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/125/</link>
<title><![CDATA[当幸福来敲门The Pursuit of Happyness]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Wed, 01 Jul 2009 08:29:07 +0000</pubDate> 
<guid>http://zhoujin.com/post/125/</guid> 
<description>
<![CDATA[ 
	剧情<br/><br/>一个穷途潦倒的单亲爸爸，因事业失败无家可归，却还得担起抚养儿子的重担。为了儿子的未来，他重新振作，终于皇天不负苦心人。<br/>-----<br/>Chris Gardner真实的故事，感谢威尔史密斯父子精彩的演绎,继续支持你们。<br/><br/>　　人生总有起伏，不可能一帆风顺，在最不如意的境遇时选对目标，坚持下去，未来将会很美好。黎明前的黑暗才是最可怕的，只要能挺过去，过后就是阳光，这是一部让人看到希望的影片，“希望”也许是上天给与人类最美好的事了。<br/><br/>　　片子一开始就能感觉到：Chris 夫妇之间的感情并不融洽，长期穷困的生活让妻子再也无法忍受，为了维持生计，一天经常会干16个钟头，还时不常的要抽出间歇时间照顾家庭，看这样一天天下去，没有任何起色，最起码在Chris身上看不到希望，最终选择了放弃。作为一个男人，对此表示理解。夫妻好比同林鸟，大难临头各自飞嘛！现实生活中有很多这样的例子，当然也有在这时候选择留下来与丈夫共度难关的。要知道两个人的力量维持一个家庭比一个人要大很多，就没那么困难了。假如选择了共度难关能否真正帮Chris获得成功呢？<br/><br/>　　是不是非得把人逼到那份儿上才会有所作为呢？如果引用“天将降大任于斯人也，必先苦其心志，劳其筋骨，饿其体肤，空乏其身，行拂乱其所为。”来理解的话，答案是肯定的，离开是必然的。结论是：压力越大，动力越大。<br/><br/>　　也有说：平生多磨砺，男儿自横行。所以现在正遭遇诸多不如意的朋友们，我们可以换个方式来看：放弃了就一定不会成功，坚持下去，别让任何人看不起你，包括自己，也许你就是下一个成功的人。<br/><br/>　　都说穷人的孩子早当家，这一点从小Chris身上可以看的很清楚：小Chris正是该无忧无虑的时候，却要经常跟着父亲去工作，跟父亲一起为了找个能睡觉的地方而到处奔波，居无定所。受了那么多委屈给爸爸的没有埋怨，只有鼓励。这是常人没有经历过的，也是常人无法做到的。<br/><br/>　　不是谁都能获得成功的。关键是你能否发现你的长处，并应用到合适的工作上。而且，从头再来不是谁都能做到的，因为会放不下，不甘心为了新的目标去放弃眼前的成绩，尽管眼前的成绩也不是那么的令人满意。试问：假如你现在是一名百货行业楼层经理，每天很努力地工作仍不能满足你当前对生活的需要，刚好你看到某个品牌公司的业务员收入很高，生活质量比你好上十倍，这是个新兴的公司，发展的空间很大，但是这个公司的门槛太高，竞争非常激烈，人才的选择近乎苛刻，而且自己的条件并不是最优秀的，但是在跑业务拉关系方面你有一定的天份，你愿意放下以前工作的经验，付出比别人更多的努力，从头开始，冒着万一失败了两手空空的风险，追求更高的生活质量，去实现你的价值吗？你真的能做到吗？所以：能从别人的成功中找到自己的目标，放下以前的成绩，从零开始竭尽全力去奋斗，相信别人能做到的我也能做到，这一点并不容易。如果能做到，我相信一定会成功。找到自己的长处，用在适合的地方，放下也是一种解脱。<br/><br/>　　这是一部意义深刻的影片，可能会改变你对生活和事业的看法，可能会影响到你的一生！<br/><br/>　　工作不开心、不满足的时候是否应该停下来想一想：这份工作真的适合我吗？有没有什么工作和事业能更充分的显示我的长处，发挥我更大的作用呢？一旦做出了新的选择，请告诉自己：不抛弃，不放弃，坚持到底就是胜利！要用比别人更多的付出换来自己目标价值的实现，追求属于自己的幸福！做好充分的心理准备：万事开头难，会遇到各种各样的困难，也会有各种各样的结果，设想一切可能失败的原因，找出应对的方法，成功就会更近一些。最后鼓励自己，乐观的出发：毕竟我比当年的Chris条件好很多。<br/><br/>　　最后赋诗一首，是我对生活的一点儿感叹，希望能唤起您的一点点共鸣！<br/><br/>　　为了生活我们付出很多，<br/><br/>　　生活也曾给与许多收获，<br/><br/>　　生活是曾经的波澜壮阔，<br/><br/>　　生活也经历着起起落落，<br/><br/>　　生活有太多的阴差阳错，<br/><br/>　　生活等我们努力去开拓！<br/>Tags - <a href="http://zhoujin.com/tags/%25E5%25BD%2593%25E5%25B9%25B8%25E7%25A6%258F%25E6%259D%25A5%25E6%2595%25B2%25E9%2597%25A8/" rel="tag">当幸福来敲门</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/124/</link>
<title><![CDATA[Mac, 注意力，好的产品]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[歪布天地]]></category>
<pubDate>Mon, 01 Jun 2009 04:08:41 +0000</pubDate> 
<guid>http://zhoujin.com/post/124/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两天一直处在拥有一台MacBook Pro的兴奋当中。毫无疑问，MacBook Pro是几乎每一个程序员梦寐以求的终极开发平台，无论是硬件还是软件，Apple一贯的简约华丽让人过目难忘。在过去一年多里，在 windows/linux上，我一直在寻找OSX外观的模仿，OSX软件的模仿，现在那些日子终于过去了，我手上，现在，敲出的这些文字，正出自 MacBook Pro<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有人说过，Mac能够显著提高生产力。我当时不以为然；然而现在在OSX上写着代码，我大概明白了为什么能显著提高生产力：原因在于注意力。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看得出来Mac OSX花了很大的心思在让用户忽略OSX本身上。在使用HP 6515的时候，每次开机，右下角的那些驻留程序一个又一个的启动，浮出不同的提示告诉你，嘿，我启动成功了；我找到了一个无线网络，我连上了，等等。 Mac启动很快，大概二三十秒，短暂的开机音乐后，系统启动完成，上面浮出Finder的菜单，下面浮出Dock面板，机器就安静的等待着你的指令。无线网络自动连上了并且以深色显示在右上角上，没有多余的声音、动画。开启一个程序，菜单条在最顶上，这是因为任何一个稍具经验的聪明的用户使用菜单的频率都远小于使用窗口本身，加上快捷键的支持，菜单只是一个入门的手段。用户的注意力在窗口本身而不是菜单，既节约了屏幕空间，又节约了时间。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Aqua界面简洁清爽。大多数成功的Web 2.0应用或多或少借鉴了osx的设计：看看Google Calendar和iCal；看看37Signals的产品。干净设计加上对用户注意力的保护，这种应用很难不在现今内容堆砌的web应用海洋中崭露头角。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说到Mac，自然要提TextMate的。emacs和VIM的愤青族自然要保护他们钟爱的编辑器：功能强大，自定义能力极强，无所不能的编辑功能，等等。没错TextMate要比emac、vim在单文件的编辑上能力要弱，但是……问题是那么多功能，需要开发需要记忆的功能，你真得用得上吗？作为现代编辑器，基本的tab编辑，简单但是快速的项目支持，多文件导航，emacs, vim显得有点力不从心。更重要的是，根据大多数程序员的经验整理而出的Bundle, 是对开发生产力的极大提升。我想好的产品，除了功能不能弱之外──TextMate的编辑能力还是很强的──更重要的是不让程序员做重复的事情，特别是在动态语言如此流行的今天，TextMate这款编辑器做到了极致。没有很复杂的技术，没有超越emacs/vim的编辑能力，仅仅通过添加项目支持和 Bundle, 使得它的用户一经使用，便爱不释手。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mac带给我的不仅仅是一台新的机器，更重要的是提高了生产力，以及界面、交互上的一些思路以及在制造成功产品方面的一些思考。我更加坚信FreeOCS所走的“简单”的道路是正确的，事实上，无论产品的制造者如何考虑，产品的使用者总是希望产品能够带来强大功能的同时不丧失使用的简单性。<br/>Tags - <a href="http://zhoujin.com/tags/mac/" rel="tag">mac</a> , <a href="http://zhoujin.com/tags/osx/" rel="tag">osx</a> , <a href="http://zhoujin.com/tags/%25E7%2594%259F%25E4%25BA%25A7%25E5%258A%259B/" rel="tag">生产力</a> , <a href="http://zhoujin.com/tags/%25E6%25B3%25A8%25E6%2584%258F%25E5%258A%259B/" rel="tag">注意力</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/123/</link>
<title><![CDATA[AJAX: 模式？实践！]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[歪布天地]]></category>
<pubDate>Fri, 01 May 2009 04:04:02 +0000</pubDate> 
<guid>http://zhoujin.com/post/123/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 任何实践都只能是一个系统化理论的切片。虽然AJAX赖以生存的关键技术XMLHTTP早已实现，但自从Google推出Gmail之后，相关的讨论才如雨后春笋纷纷出土。各种语言、各种平台、各种所谓的最佳实践、对这种技术的种种好处、罪过的讨论，瞬间涵盖了去年至今的大部分技术话题。这种出现既有历史的原因──IT系统已经不仅仅满足到“能工作”这个阶段，还上升到了“可用”、“易用”了；还有技术成熟度的原因──悄然之间Xmlhttp已经在主流浏览器全部实现了。由于优秀的部署模型，越来越多的企业采用Web技术来实现他们的业务系统。AJAX成为改善用户体验的关键技术。然而，正如前面所说，太多的实现、讨论，让开发人员在进行选型与技术实现的时候思考再三。特别是刚开始进行技术转型的开发人员，在众多的迷惑面前，往往不知道怎么做才是正道。<br/>Tags - <a href="http://zhoujin.com/tags/ajax/" rel="tag">ajax</a> , <a href="http://zhoujin.com/tags/%25E8%25AE%25BE%25E8%25AE%25A1%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">设计模式</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/122/</link>
<title><![CDATA[我的。。。。。。]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Thu, 23 Apr 2009 02:30:24 +0000</pubDate> 
<guid>http://zhoujin.com/post/122/</guid> 
<description>
<![CDATA[ 
	精神不好不好<br/>态度暴虐暴虐<br/>我困死了死了<br/>再死一遍一遍
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/121/</link>
<title><![CDATA[240多个jQuery插件]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[jQuery]]></category>
<pubDate>Sat, 10 Jan 2009 13:21:22 +0000</pubDate> 
<guid>http://zhoujin.com/post/121/</guid> 
<description>
<![CDATA[ 
	<h2>概述</h2> <p>jQuery 是继 prototype 之后又一个优秀的 Javascript 框架。其宗旨是&mdash;写更少的代码,做更多的事情。它是轻量级的 js&nbsp;&nbsp;库(压缩后只有21k) ，这是其它的 js 库所不<a href="http://images.cnblogs.com/cnblogs_com/Terrylee/WindowsLiveWriter/240jQuery_128F5/jquery_2.gif"><img style="border-width: 0px" src="http://images.cnblogs.com/cnblogs_com/Terrylee/WindowsLiveWriter/240jQuery_128F5/jquery_thumb.gif" border="0" alt="jquery" width="164" height="117" align="right" /></a>及的，它兼容 CSS3，还兼容各种浏览器（IE 6.0+, FF 1.5+, Safari&nbsp;&nbsp;2.0+, Opera 9.0+）。 jQuery 是一个快速的，简洁的 javaScript 库，使用户能更方便地处理 HTML&nbsp;&nbsp;documents、events、实现动画效果，并且方便地为网站提供 AJAX 交互。 jQuery&nbsp;&nbsp;还有一个比较大的优势是，它的文档说明很全，而且各种应用也说得很详细，同时还有许多成熟的插件可供选择。 jQuery 能够使用户的 html 页保持代码和&nbsp;&nbsp;html 内容分离，也就是说，不用再在 html 里面插入一堆js来调用命令了，只需定义 id 即可。今天在<a href="http://www.kollermedia.at/" title="Logo Kollermedia.at">Kollermedia.at</a>上发现了一篇JQuery插件列表的<a href="http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/" target="_blank">文章</a>，特推荐如下。</p> <h2>文件上传(File upload)<a href="http://images.cnblogs.com/cnblogs_com/Terrylee/WindowsLiveWriter/240jQuery_128F5/JQuery_001_6.gif"><img style="border-width: 0px" src="http://images.cnblogs.com/cnblogs_com/Terrylee/WindowsLiveWriter/240jQuery_128F5/JQuery_001_thumb_2.gif" border="0" alt="JQuery_001" width="396" height="165" align="right" /></a></h2> <p><a href="http://www.phpletter.com/Demo/AjaxFileUpload-Demo/">Ajax File&nbsp;&nbsp;Upload</a>.<br /><a href="http://www.pixeline.be/experiments/jqUploader/">jQUploader</a>.<br /><a href="http://www.fyneworks.com/jquery/multiple-file-upload/">Multiple File&nbsp;&nbsp;Upload plugin</a>.&nbsp;&nbsp;<br /><a href="http://www.appelsiini.net/projects/filestyle">jQuery File Style</a>.<br /><a href="http://jquery.com/plugins/project/InputFileCSS">Styling an input type&nbsp;&nbsp;file</a>.<br /><a href="http://digitalbush.com/projects/progress-bar-plugin">Progress Bar&nbsp;&nbsp;Plugin</a>. </p> <h2>表单验证(Form Validation)</h2> <p><a href="http://bassistance.de/jquery-plugins/jquery-plugin-validation/">jQuery&nbsp;&nbsp;Validation</a>.<br /><a href="http://www.dyve.net/jquery/?autohelp">Auto&nbsp;&nbsp;Help</a>.<br /><a href="http://www.willjessup.com/sandbox/jquery/form_validator/form_validate.html">Simple&nbsp;&nbsp;jQuery form validation</a>.<br /><a href="http://letmehaveblog.blogspot.com/2007/08/easy-client-side-web-forms-validations.html">jQuery&nbsp;&nbsp;XAV - form validations</a>.<br /><a href="http://itgroup.com.ph/alphanumeric/">jQuery AlphaNumeric</a>.<br /><a href="http://digitalbush.com/projects/masked-input-plugin">Masked&nbsp;&nbsp;Input</a>.<br /><a href="http://www.dennydotnet.com/post/TypeWatch-jQuery-Plugin.aspx">TypeWatch&nbsp;&nbsp;Plugin</a>.<br /><a href="http://jquery.com/plugins/project/TextLimiter">Text&nbsp;&nbsp;limiter for form fields</a>.<br /><a href="http://www.shawngo.com/gafyd/index.html">Ajax Username Check with&nbsp;&nbsp;jQuery</a>.&nbsp;&nbsp;</p><h2>表单－选取框(Form - Select Box stuff)</h2> <p><a href="http://jquery.sanchezsalvador.com/page/jquerycombobox.aspx">jQuery&nbsp;&nbsp;Combobox</a>.<br /><a href="http://www.ajaxray.com/blog/2007/11/08/jquery-controlled-dependent-or-cascading-select-list-2/">jQuery&nbsp;&nbsp;controlled dependent (or Cascadign) Select List</a>.<br /><a href="http://code.google.com/p/jqmultiselects/">Multiple Selects</a>.<br /><a href="http://www.texotela.co.uk/code/jquery/select/">Select box&nbsp;&nbsp;manipulation</a>.<br /><a href="http://code.google.com/p/jqueryselectcombo/">Select Combo&nbsp;&nbsp;Plugin</a>.<br /><a href="http://www.msxhost.com/jquery/linked-selects/json/%20target=">jQuery -&nbsp;&nbsp;LinkedSelect</a><br /><a href="http://remysharp.com/2007/09/18/auto-populate-multiple-select-boxes/">Auto-populate&nbsp;&nbsp;multiple select boxes</a>.<br /><a href="http://www.sitespotting.it/esempi/002/">Choose Plugin (Select&nbsp;&nbsp;Replacement)</a>.&nbsp;&nbsp;</p><h2>表单基本、输入框、选择框等(Form Basics, Input Fields, Checkboxes etc.)</h2> <p><a href="http://www.malsup.com/jquery/form/">jQuery Form Plugin</a>.<br /><a href="http://code.handlino.com/wiki/jquery-form">jQuery-Form</a>.<br /><a href="http://envero.org/jlook/">jLook Nice Forms</a>.<br /><a href="http://www.whitespace-creative.com/jquery/jNice/">jNice</a>.<br /><a href="http://www.brainfault.com/2007/07/07/pin-plugin-reloaded/">Ping&nbsp;&nbsp;Plugin</a>.<br /><a href="http://grzegorz.frydrychowicz.net/jquery_toggleformtext/">Toggle Form&nbsp;&nbsp;Text</a>.<br /><a href="http://thoughts.kuzemchak.net/entry/toggleval-for-jquery/">ToggleVal</a>.<br /><a href="http://www.pengoworks.com/workshop/jquery/field.plugin.htm">jQuery Field&nbsp;&nbsp;Plugin</a>.<br /><a href="http://code.befruit.com/">jQuery Form&rsquo;n Field&nbsp;&nbsp;plugin</a>.<br /><a href="http://www.texotela.co.uk/code/jquery/checkboxes/">jQuery Checkbox&nbsp;&nbsp;manipulation</a>.<br /><a href="http://www.alcoholwang.cn/jquery/jTaggingDemo.htm">jTagging</a>.<br /><a href="http://code.google.com/p/labelcheck/">jQuery labelcheck</a>.<br /><a href="http://scott.sauyet.com/thoughts/archives/2007/03/31/overlabel-with-jquery/">Overlabel</a>.<br /><a href="http://blog.amicoimmaginario.it/2007/08/28/jquery-plugin-3-state-radio-buttons/">3&nbsp;&nbsp;state radio buttons</a>.<br /><a href="http://sanisoft-demo.com/jquery/plugins/shiftcheckbox/">ShiftCheckbox&nbsp;&nbsp;jQuery Plugin</a>.<br /><a href="http://digitalbush.com/projects/watermark-input-plugin">Watermark&nbsp;&nbsp;Input</a>.<br /><a href="http://kawika.org/jquery/checkbox/">jQuery Checkbox&nbsp;&nbsp;(checkboxes with imags)</a>.<br /><a href="http://www.softwareunity.com/sandbox/jqueryspinbtn/">jQuery SpinButton&nbsp;&nbsp;Control</a>.<br /><a href="http://www.phpletter.com/form_builder/demo.html">jQuery&nbsp;&nbsp;Ajax Form Builder</a>.<br /><a href="http://www.texotela.co.uk/code/jquery/focusfields/">jQuery Focus&nbsp;&nbsp;Fields</a>.<br /><a href="http://home.iprimus.com.au/kbwood/jquery/timeEntry.html">jQuery Time&nbsp;&nbsp;Entry</a>.&nbsp;&nbsp;</p><h2>时间、日期和颜色选取(Time, Date and Color Picker)</h2> <p><a href="http://marcgrabanski.com/code/ui-datepicker/">jQuery UI&nbsp;&nbsp;Datepicker</a>.<br /><a href="http://kelvinluck.com/assets/jquery/datePicker/">jQuery date picker&nbsp;&nbsp;plugin</a>.<br /><a href="http://code.google.com/p/jquery-timepicker/">jQuery Time&nbsp;&nbsp;Picker</a>.<br /><a href="http://www.texotela.co.uk/code/jquery/timepicker/">Time&nbsp;&nbsp;Picker</a>.<br /><a href="http://www.oakcitygraphics.com/jquery/clockpick/ClockPick.cfm">ClickPick</a>.<br /><a href="http://labs.perifer.se/timedatepicker/">TimePicker</a>.<br /><a href="http://acko.net/dev/farbtastic">Farbtastic jQuery Color Picker&nbsp;&nbsp;Plugin</a>.<br /><a href="http://www.intelliance.fr/jquery/color_picker/">Color&nbsp;&nbsp;Picker by intelliance.fr</a>.&nbsp;&nbsp;</p><h2>投票插件(Rating Plugins)</h2> <p><a href="http://www.phpletter.com/Demo/Jquery-Star-Rating-Plugin/#">jQuery&nbsp;&nbsp;Star Rating Plugin</a>.<br /><a href="http://www.m3nt0r.de/devel/raterDemo/">jQuery Star Rater</a>.<br /><a href="http://riderdesign.com/articles/displayarticle.aspx?articleid=21">Content&nbsp;&nbsp;rater with asp.net, ajax and jQuery</a>.<br /><a href="http://www.learningjquery.com/2007/05/half-star-rating-plugin">Half-Star&nbsp;&nbsp;Rating Plugin</a>.&nbsp;&nbsp;</p><h2>搜索插件(Search Plugins)</h2> <p><a href="http://www.vulgarisoip.com/2007/08/06/jquerysuggest-11/">jQuery&nbsp;&nbsp;Suggest</a>.<br /><a href="http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/">jQuery&nbsp;&nbsp;Autocomplete</a>.<br /><a href="http://www.pengoworks.com/workshop/jquery/autocomplete.htm">jQuery&nbsp;&nbsp;Autocomplete Mod</a>.<br /><a href="http://www.ajaxdaddy.com/demo-jquery-autocomplete.html">jQuery&nbsp;&nbsp;Autocomplete by AjaxDaddy</a>.<br /><a href="http://dev.reach1to1.net/saurabh/jplugins/autocomplete/">jQuery&nbsp;&nbsp;Autocomplete Plugin with HTML formatting</a>.<br /><a href="http://interface.eyecon.ro/docs/autocomplete">jQuery&nbsp;&nbsp;Autocompleter</a>.<br /><a href="http://nodstrum.com/2007/09/19/autocompleter/">AutoCompleter (Tutorial&nbsp;&nbsp;with PHP&amp;MySQL)</a>.<br /><a href="http://rikrikrik.com/jquery/quicksearch/">quick Search jQuery Plugin</a>.&nbsp;&nbsp;</p><h2>编辑器(Inline Edit &amp; Editors)<a href="http://images.cnblogs.com/cnblogs_com/Terrylee/WindowsLiveWriter/240jQuery_128F5/JQuery_002_2.gif"><img style="border-width: 0px" src="http://images.cnblogs.com/cnblogs_com/Terrylee/WindowsLiveWriter/240jQuery_128F5/JQuery_002_thumb.gif" border="0" alt="JQuery_002" width="400" height="193" align="right" /></a></h2> <p><a href="http://www.jaysalvat.com/jquery/jtageditor/">jTagEditor</a>.<br /><a href="http://demo.wymeditor.org/demo.html">WYMeditor</a>.<br /><a href="http://garage.pimentech.net/scripts_doc_jquery_jframe/">jQuery&nbsp;&nbsp;jFrame</a>.<br /><a href="http://www.appelsiini.net/projects/jeditable">Jeditable&nbsp;&nbsp;- edit in place plugin for jQuery</a>. <br /><a href="http://www.dyve.net/jquery/?editable">jQuery editable</a>.<br /><a href="http://www.jdempster.com/category/jquery/disableTextSelect/">jQuery&nbsp;&nbsp;Disable Text Select Plugin</a>.<br /><a href="http://15daysofjquery.com/edit-in-place-with-ajax-using-jquery-javascript-library/15/">Edit&nbsp;&nbsp;in Place with Ajax using jQuery</a>.<br /><a href="http://davehauenstein.com/blog/archives/28">jQuery Plugin - Another&nbsp;&nbsp;In-Place Editor</a>.<br /><a href="http://dev.iceburg.net/jquery/tableEditor/demo.php">TableEditor</a>.<br /><a href="http://joshhundley.com/teditable-in-place-editing-for-tables/">tEditable -&nbsp;&nbsp;in place table editing for jQuery</a>.&nbsp;&nbsp;</p><h2>多媒体、视频、Flash等(Audio, Video, Flash, SVG, etc)</h2> <p><a href="http://www.contentwithstructure.com/extras/jmedia">jMedia -&nbsp;&nbsp;accessible multi-media embedding</a>.<br /><a href="http://sourceforge.net/projects/jbedit/">JBEdit - Ajax online Video&nbsp;&nbsp;Editor</a>.<br /><a href="http://www.sean-o.com/jquery/jmp3/">jQuery MP3&nbsp;&nbsp;Plugin</a>.<br /><a href="http://malsup.com/jquery/media/">jQuery Media&nbsp;&nbsp;Plugin</a>.<br /><a href="http://jquery.lukelutman.com/plugins/flash/index.html">jQuery Flash&nbsp;&nbsp;Plugin</a>.<br /><a href="http://www.solitude.dk/archives/embedquicktime/">Embed&nbsp;&nbsp;QuickTime</a>.<br /><a href="http://keith-wood.name/svg.html">SVG Integration</a>.&nbsp;&nbsp; </p><h2>图片(Photos/Images/Galleries)</h2> <p><a href="http://jquery.com/demo/thickbox/">ThickBox</a>.<br /><a href="http://leandrovieira.com/projects/jquery/lightbox/">jQuery lightBox&nbsp;&nbsp;plugin</a>.<br /><a href="http://blog.joshuaeichorn.com/archives/2007/01/11/jquery-image-strip/">jQuery&nbsp;&nbsp;Image Strip</a>.<br /><a href="http://www.gcmingati.net/wordpress/wp-content/lab/jquery/imagestrip/imageslide-plugin.html">jQuery&nbsp;&nbsp;slideViewer</a>.<br /><a href="http://benjaminsterling.com/2007/09/09/jquery-jqgalscroll-photo-gallery/">jQuery&nbsp;&nbsp;jqGalScroll 2.0</a>.<br /><a href="http://benjaminsterling.com/2007/10/02/jquery-jqgalviewii-photo-gallery/">jQuery&nbsp;&nbsp;- jqGalViewII</a>.<br /><a href="http://benjaminsterling.com/2007/10/21/jqgalviewiii-proof-of-concept/">jQuery&nbsp;&nbsp;- jqGalViewIII</a>.<br /><a href="http://opiefoto.com/articles/photoslider">jQuery&nbsp;&nbsp;Photo Slider</a>.<br /><a href="http://joanpiedra.com/jquery/thumbs/">jQuery&nbsp;&nbsp;Thumbs - easily create thumbnails</a>.<br /><a href="http://www.texotela.co.uk/code/jquery/jQIR/">jQuery jQIR Image&nbsp;&nbsp;Replacement</a>.<br /><a href="http://www.gmarwaha.com/jquery/jcarousellite/index.php#what">jCarousel&nbsp;&nbsp;Lite</a>.<br /><a href="http://projects.sevir.org/storage/jpanview/index.html">jQPanView</a>.<br /><a href="http://sorgalla.com/projects/jcarousel/#Examples">jCarousel</a>.<br /><a href="http://www.intelliance.fr/jquery/imagebox/">Interface Imagebox</a>.<br /><a href="http://www.getintothis.com/blog/2006/10/12/image-gallery-using-jquery-interface-reflections/">Image&nbsp;&nbsp;Gallery using jQuery, Interface &amp; Reflactions</a>.<br /><a href="http://realazy.org/lab/jquery/j-gallery/">simple jQuery Gallery</a>.<br /><a href="http://chicagosocial.com/gallery/">jQuery Gallery Module</a>.<br /><a href="http://www.eogallery.com/">EO Gallery</a>.<br /><a href="http://flesler.blogspot.com/search/label/jQuery.ScrollShow">jQuery&nbsp;&nbsp;ScrollShow</a>.<br /><a href="http://www.malsup.com/jquery/cycle/">jQuery Cycle&nbsp;&nbsp;Plugin</a>.<br /><a href="http://www.projectatomic.com/en/flickr.htm">jQuery&nbsp;&nbsp;Flickr</a>.<br /><a href="http://www.appelsiini.net/2007/9/lazy-load-images-jquery-plugin">jQuery&nbsp;&nbsp;Lazy Load Images Plugin</a>.<br /><a href="http://www.sunsean.com/zoomi/">Zoomi -&nbsp;&nbsp;Zoomable Thumbnails</a>.<br /><a href="http://remysharp.com/2007/03/19/a-few-more-jquery-plugins-crop-labelover-and-pluck/#crop">jQuery&nbsp;&nbsp;Crop - crop any image on the fly</a>.<br /><a href="http://jquery.com/plugins/project/reflection">Image Reflection</a>.&nbsp;&nbsp;</p><h2>Google地图（Google Map）</h2> <p><a href="http://www.dyve.net/jquery/?googlemaps">jQuery Plugin&nbsp;&nbsp;googlemaps</a>.<br /><a href="http://code.google.com/p/jmaps/">jMaps jQuery Maps&nbsp;&nbsp;Framework</a>.<br /><a href="http://projects.sevir.org/storage/jqmaps/index.html">jQmaps</a>.<br /><a href="http://olbertz.de/jquery/googlemap.html#">jQuery &amp; Google&nbsp;&nbsp;Maps</a>.<br /><a href="http://snippets.dzone.com/posts/show/4361">jQuery Maps&nbsp;&nbsp;Interface forr Google and Yahoo maps</a>.<br /><a href="http://webrocket.ulmb.com/jmaps/">jQuery J Maps - by Tane Piper</a>.&nbsp;&nbsp;</p><h2>游戏(Games)</h2> <p><a href="http://fmarcia.info/jquery/tetris/tetris.html">Tetris with&nbsp;&nbsp;jQuery</a>.<br /><a href="http://64squar.es/">jQuery Chess</a>.<br /><a href="http://www.bennadel.com/blog/623-jQuery-Demo-Mad-Libs-Word-Game.htm">Mad&nbsp;&nbsp;Libs Word Game</a>.<br /><a href="http://www.alexatnet.com/node/68">jQuery&nbsp;&nbsp;Puzzle</a>.<br /><a href="http://www.willjessup.com/sandbox/jquery/solar_system/rotator.html">jQuery&nbsp;&nbsp;Solar System (not a game but awesome jQuery Stuff)</a>.&nbsp;&nbsp;</p><h2>表格等(Tables, Grids etc.)</h2> <p><a href="http://docs.jquery.com/Plugins/Tablesorter">UI/Tablesorter</a>.<a href="http://images.cnblogs.com/cnblogs_com/Terrylee/WindowsLiveWriter/240jQuery_128F5/JQuery_003_2.gif"><img style="border-width: 0px" src="http://images.cnblogs.com/cnblogs_com/Terrylee/WindowsLiveWriter/240jQuery_128F5/JQuery_003_thumb.gif" border="0" alt="JQuery_003" width="400" height="143" align="right" /></a> <br /><a href="http://www.reconstrukt.com/ingrid/">jQuery ingrid</a>.<br /><a href="http://www.trirand.com/blog/?p=13">jQuery Grid Plugin</a>.<br /><a href="http://ideamill.synaptrixgroup.com/jquery/tablefilter/tabletest.htm">Table&nbsp;&nbsp;Filter - awesome!</a>.<br /><a href="http://dev.iceburg.net/jquery/tableEditor/demo.php">TableEditor</a>.<br /><a href="http://www.hanpau.com/jquery/unobtrusivetreetable.php">jQuery Tree&nbsp;&nbsp;Tables</a>.<br /><a href="http://www.javascripttoolbox.com/jquery/#expandablerows">Expandable&nbsp;&nbsp;&ldquo;Detail&rdquo; Table Rows</a>.<br /><a href="http://www.remotesynthesis.com/blog/index.cfm/2007/9/25/Sortable-Table-ColdFusion-Custom-Tag-with-jQueryUI">Sortable&nbsp;&nbsp;Table ColdFusion Costum Tag with jQuery UI</a>.<br /><a href="http://flesler.blogspot.com/2007/10/jquerybubble.html">jQuery&nbsp;&nbsp;Bubble</a>.<br /><a href="http://tablesorter.com/docs/">TableSorter</a>.<br /><a href="http://www.webtoolkit.info/demo/jquery/scrollable/demo.html">Scrollable&nbsp;&nbsp;HTML Table</a>.<br /><a href="http://p.sohei.org/stuff/jquery/columnmanager/demo/demo.html">jQuery&nbsp;&nbsp;column Manager Plugin</a>.<br /><a href="http://p.sohei.org/stuff/jquery/tablehover/demo/demo.html">jQuery&nbsp;&nbsp;tableHover Plugin</a>.<br /><a href="http://p.sohei.org/stuff/jquery/columnhover/demo/demo.html">jQuery&nbsp;&nbsp;columnHover Plugin</a>.<br /><a href="http://makoomba.altervista.org/grid/">jQuery&nbsp;&nbsp;Grid</a>.<br /><a href="http://motherrussia.polyester.se/jquery-plugins/tablesorter/">TableSorter&nbsp;&nbsp;plugin for jQuery</a>.<br /><a href="http://joshhundley.com/teditable-in-place-editing-for-tables/">tEditable -&nbsp;&nbsp;in place table editing for jQuery</a>.<br /><a href="http://www.hovinne.com/dev/jquery/chartotable/">jQuery charToTable&nbsp;&nbsp;Plugin</a>.<br /><a href="http://www.ita.es/jquery/jquery.grid.columnSizing.htm">jQuery Grid Column&nbsp;&nbsp;Sizing</a>.<br /><a href="http://www.ita.es/jquery/jquery.grid.rowSizing.htm">jQuery Grid Row&nbsp;&nbsp;Sizing</a>.&nbsp;&nbsp;</p><h2>统计图(Charts, Presentation etc.)</h2> <p><a href="http://worcesterwideweb.com/2007/06/04/jquery-wizard-plugin/">jQuery&nbsp;&nbsp;Wizard Plugin </a>.<br /><a href="http://www.reach1to1.com/sandbox/jquery/jqchart/">jQuery Chart&nbsp;&nbsp;Plugin</a>.<br /><a href="http://ejohn.org/apps/speed/">Bar Chart</a>.&nbsp;&nbsp;</p><h2>边框、圆角、背景(Border, Corners, Background)</h2> <p><a href="http://www.malsup.com/jquery/corner/">jQuery Corner</a>.<br /><a href="http://blue-anvil.com/archives/anti-aliased-rounded-corners-with-jquery">jQuery&nbsp;&nbsp;Curvy Corner</a>.<br /><a href="http://dev.jquery.com/%7Epaul/plugins/nifty/example.html">Nifty jQuery&nbsp;&nbsp;Corner</a>.<br /><a href="http://illandril.net/jQuery/transparentCorners/">Transparent&nbsp;&nbsp;Corners</a>.<br /><a href="http://www.methvin.com/jquery/jq-corner.html">jQuery&nbsp;&nbsp;Corner Gallery</a>.<br /><a href="http://blog.brandonaaron.net/my-jquery-plugins/gradient/">Gradient&nbsp;&nbsp;Plugin</a>.&nbsp;&nbsp;</p><h2>文字和超链接(Text and Links)</h2> <p><a href="http://wanderinghorse.net/computing/javascript/jquery/spoilers/demo.html">jQuery&nbsp;&nbsp;Spoiler plugin</a>.<br /><a href="http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html">Text&nbsp;&nbsp;Highlighting</a>.<br /><a href="http://www.jdempster.com/category/jquery/disableTextSelect/">Disable Text&nbsp;&nbsp;Select Plugin</a>.<br /><a href="http://www.texotela.co.uk/code/jquery/newsticker/">jQuery&nbsp;&nbsp;Newsticker</a>.<br /><a href="http://www.ollicle.com/2007/jun/03/jquery_lineheight_flexible.html">Auto&nbsp;&nbsp;line-height Plugin</a>.<br /><a href="http://agencenp.net/textgrad/textgrad.html">Textgrad - a text gradient&nbsp;&nbsp;plugin</a>.<br /><a href="http://kawika.org/jquery/linklook/">LinkLook - a link&nbsp;&nbsp;thumbnail preview</a>.<br /><a href="http://rikrikrik.com/jquery/pager/#examples">pager jQuery&nbsp;&nbsp;Plugin</a>.<br /><a href="http://rikrikrik.com/jquery/shortkeys/">shortKeys jQuery&nbsp;&nbsp;Plugin</a>.<br /><a href="http://www.ollicle.com/eg/jquery/biggerlink">jQuery&nbsp;&nbsp;Biggerlink</a>.<br /><a href="http://troy.dyle.net/linkchecker/">jQuery Ajax Link&nbsp;&nbsp;Checker</a>.&nbsp;&nbsp;</p><h2>鼠标提示（Tooltips）</h2> <p><a href="http://bassistance.de/jquery-plugins/jquery-plugin-tooltip/">jQuery&nbsp;&nbsp;Plugin - Tooltip</a>.<br /><a href="http://www.codylindley.com/blogstuff/js/jtip/">jTip - The jQuery Tool&nbsp;&nbsp;Tip</a>.<br /><a href="http://examples.learningjquery.com/62/demo/index.html#examplesection">clueTip</a>.<br /><a href="http://edgarverle.com/BetterTip/default.cfm">BetterTip</a>.<br /><a href="http://ioreader.com/2007/05/15/flash-tooltips-using-jquery/">Flash&nbsp;&nbsp;Tooltips using jQuery</a>.<br /><a href="http://www.texotela.co.uk/code/jquery/tooltipdemo/">ToolTip</a>.&nbsp;&nbsp;</p><h2>菜单和导航(Menus, Navigations)</h2> <p><a href="http://stilbuero.de/jquery/tabs_3/">jQuery Tabs Plugin - awesome!&nbsp;&nbsp;</a>. [<a href="http://stilbuero.de/jquery/tabs_3/nested.html">demo nested&nbsp;&nbsp;tabs</a>.]<br /><a href="http://blog.cutterscrossing.com/index.cfm/2007/6/15/Updated-JQuery-Nested-Tab-Set-with-Demo">another&nbsp;&nbsp;jQuery nested Tab Set example (based on jQuery Tabs Plugin)</a>.<br /><a href="http://www.sunsean.com/idTabs/">jQuery idTabs</a>.<br /><a href="http://jdsharp.us/jQuery/plugins/jdMenu/">jdMenu - Hierarchical Menu&nbsp;&nbsp;Plugin for jQuery</a>.<br /><a href="http://be.twixt.us/jquery/suckerFish.php">jQuery SuckerFish&nbsp;&nbsp;Style</a>.<br /><a href="http://bassistance.de/jquery-plugins/jquery-plugin-treeview/">jQuery&nbsp;&nbsp;Plugin Treeview</a>.<br /><a href="http://be.twixt.us/jquery/treeView.php">treeView Basic</a>.<br /><a href="http://labs.activespotlight.net/jQuery/menu_demo.html">FastFind&nbsp;&nbsp;Menu</a>.<br /><a href="http://www.getintothis.com/blog/2006/09/26/my-first-jquery-plugin-a-sliding-menu/">Sliding&nbsp;&nbsp;Menu</a>.<br /><a href="http://gmarwaha.com/blog/?p=7">Lava Lamp jQuery&nbsp;&nbsp;Menu</a>.<br /><a href="http://icon.cat/wiki/IconDock_En#iconDock_jQuery_Plugin">jQuery&nbsp;&nbsp;iconDock</a>.<br /><a href="http://cherne.net/brian/resources/jquery.variations.html">jVariations&nbsp;&nbsp;Control Panel</a>.<br /><a href="http://www.trendskitchens.co.nz/jquery/contextmenu/">ContextMenu&nbsp;&nbsp;plugin</a>.<br /><a href="http://p.sohei.org/jquery-plugins/clickmenu/">clickMenu</a>.<br /><a href="http://www.ndesign-studio.com/blog/mac/css-dock-menu">CSS Dock&nbsp;&nbsp;Menu</a>.<br /><a href="http://webexpose.org/2006/12/28/jquery-pop-up-menu-tutorial/">jQuery&nbsp;&nbsp;Pop-up Menu Tutorial</a>.<br /><a href="http://www.getintothis.com/blog/2006/09/26/my-first-jquery-plugin-a-sliding-menu/">Sliding&nbsp;&nbsp;Menu</a>. </p> <p><a href="http://stilbuero.de/jquery/tabs_3/" title="http://stilbuero.de/jquery/tabs_3/"><a href="http://stilbuero.de/jquery/tabs_3/" target="_blank">http://stilbuero.de/jquery/tabs_3/</a></a>&nbsp;&nbsp;</p> <h2>幻灯、翻转等(Accordions, Slide and Toggle stuff)</h2> <p><a href="http://bassistance.de/jquery-plugins/jquery-plugin-accordion/">jQuery&nbsp;&nbsp;Plugin Accordion</a>.<br /><a href="http://fmarcia.info/jquery/accordion.html">jQuery Accordion Plugin&nbsp;&nbsp;Horizontal Way</a>.<br /><a href="http://letmehaveblog.blogspot.com/2007/10/haccordion-simple-horizontal-accordion.html">haccordion&nbsp;&nbsp;- a simple horizontal accordion plugin for jQuery</a>.<br /><a href="http://dev.portalzine.de/index?/Horizontal_Accordion--print">Horizontal&nbsp;&nbsp;Accordion by portalzine.de</a>.<br /><a href="http://berndmatzner.de/jquery/hoveraccordion/">HoverAccordion</a>.<br /><a href="http://fmarcia.info/jquery/accordion.html">Accordion Example from&nbsp;&nbsp;fmarcia.info</a>.<br /><a href="http://blog.evaria.com/wp-content/themes/blogvaria/jquery/index.php">jQuery&nbsp;&nbsp;Accordion Example</a>.<br /><a href="http://jquery.com/files/demo/dl-done.html">jQuery Demo - Expandable&nbsp;&nbsp;Sidebar Menu</a>.<br /><a href="http://www.andreacfm.com/examples/jQpanels/">Sliding Panels for&nbsp;&nbsp;jQuery</a>.<br /><a href="http://jquery.andreaseberhard.de/toggleElements/">jQuery&nbsp;&nbsp;ToggleElements</a>.<br /><a href="http://www.ndoherty.com/demos/coda-slider/">Coda&nbsp;&nbsp;Slider</a>.<br /><a href="http://sorgalla.com/projects/jcarousel/#Examples">jCarousel</a>.<br /><a href="http://www.reindel.com/accessible_news_slider/">Accesible News Slider&nbsp;&nbsp;Plugin</a>.<br /><a href="http://icant.co.uk/sandbox/jquerycodeview/">Showing and&nbsp;&nbsp;Hiding code Examples</a>.<br /><a href="http://gsgd.co.uk/sandbox/jquery/easing/">jQuery Easing Plugin</a>.<br /><a href="http://sonspring.com/journal/jquery-portlets">jQuery Portlets</a>.<br /><a href="http://jdsharp.us/jQuery/plugins/AutoScroll/">AutoScroll</a>.<br /><a href="http://medienfreunde.com/lab/innerfade/">Innerfade</a>.&nbsp;&nbsp;</p><h2>拖放插件(Drag and Drop)</h2> <p><a href="http://docs.jquery.com/UI/Draggables">UI/Draggables</a>.<br /><a href="http://fromvega.com/wordpress/2007/07/14/easydrag-jquery-plugin/">EasyDrag&nbsp;&nbsp;jQuery Plugin</a>.<br /><a href="http://sonspring.com/journal/jquery-portlets">jQuery Portlets</a>.<br /><a href="http://dev.iceburg.net/jquery/jqDnR/">jqDnR - drag, drop resize</a>.<br /><a href="http://interface.eyecon.ro/demos/drag.html">Drag Demos</a>.&nbsp;&nbsp;</p><h2>XML XSL JSON Feeds</h2> <p><a href="http://www.jongma.org/webtools/jquery/xslt/">XSLT Plugin</a>.<br /><a href="http://cgaskell.wordpress.com/2006/11/02/jquery-ajax-call-and-result-xml-parsing/">jQuery&nbsp;&nbsp;Ajax call and result XML parsing</a>.<br /><a href="http://jquery.com/plugins/project/xmlObjectifier">xmlObjectifier -&nbsp;&nbsp;Converts XML DOM to JSON</a>.<br /><a href="http://jquery.glyphix.com/">jQuery XSL&nbsp;&nbsp;Transform</a>.<br /><a href="http://malsup.com/jquery/taconite/">jQuery Taconite -&nbsp;&nbsp;multiple Dom updates</a>.<br /><a href="http://www.hovinne.com/blog/index.php/2007/07/15/132-jfeed-jquery-rss-atom-feed-parser-plugin">RSS/ATOM&nbsp;&nbsp;Feed Parser Plugin</a>.<br /><a href="http://www.malsup.com/jquery/gfeed/">jQuery&nbsp;&nbsp;Google Feed Plugin</a>.&nbsp;&nbsp;</p><h2>浏览器(Browserstuff)</h2> <p><a href="http://noteslog.com/post/how-to-fix-the-resize-event-in-ie/">Wresize&nbsp;&nbsp;- IE Resize event Fix Plugin</a>.<br /><a href="http://jquery.khurshid.com/ifixpng.php">jQuery ifixpng</a>.<br /><a href="http://jquery.andreaseberhard.de/pngFix/">jQuery pngFix</a>.<br /><a href="http://www.crismancich.de/jquery/plugins/linkscrubber/">Link Scrubber -&nbsp;&nbsp;removes the dotted line onfocus from links</a>.<br /><a href="http://www.matthewjrichards.co.uk/articles/2007/06/25/jquery-perciformes-the-entire-suckerfish-familly-under-one-roof">jQuery&nbsp;&nbsp;Perciformes - the entire suckerfish familly under one roof</a>.<br /><a href="http://blog.brandonaaron.net/my-jquery-plugins/background-iframe/">Background&nbsp;&nbsp;Iframe</a>.<br /><a href="http://jquery.com/plugins/project/QinIE">QinIE - for&nbsp;&nbsp;proper display of Q tags in IE</a>.<br /><a href="http://webrocket.ulmb.com/ability/">jQuery Accessibility Plugin</a>.<br /><a href="http://www.ogonek.net/mousewheel/jquery-demo.html">jQuery MouseWheel&nbsp;&nbsp;Plugin</a>.&nbsp;&nbsp;</p><h2>对话框、确认窗口(Alert, Prompt, Confirm Windows)</h2> <p><a href="http://trentrichardson.com/Impromptu/">jQuery Impromptu</a>.<br /><a href="http://nadiaspot.com/jquery/confirm">jQuery Confirm Plugin</a>.<br /><a href="http://dev.iceburg.net/jquery/jqModal/">jqModal</a>.<br /><a href="http://www.ericmmartin.com/projects/simplemodal/">SimpleModal</a>.&nbsp;&nbsp;</p><h2>CSS</h2> <p><a href="http://www.kelvinluck.com/article/switch-stylesheets-with-jquery">jQuery&nbsp;&nbsp;Style Switcher</a>.<br /><a href="http://andykent.bingodisk.com/bingo/public/jss/">JSS - Javascript&nbsp;&nbsp;StyleSheets</a>.<br /><a href="http://flesler.blogspot.com/2007/11/jqueryrule.html">jQuery Rule -&nbsp;&nbsp;creation/manipulation of CSS Rules</a>.<br /><a href="http://www.designerkamal.com/jPrintArea/">jPrintArea</a>.&nbsp;&nbsp;</p><h2>DOM、AJAX和其它JQuery插件（DOM, Ajax and other jQuery plugins）</h2> <p><a href="http://flydom.socianet.com/">FlyDOM</a>.<br /><a href="http://brandonaaron.net/docs/dimensions/#getting-started">jQuery Dimenion&nbsp;&nbsp;Plugin</a>.<br /><a href="http://happygiraffe.net/blog/articles/2007/09/26/jquery-logging">jQuery&nbsp;&nbsp;Loggin</a>.<br /><a href="http://jquery.com/plugins/project/metadata">Metadata -&nbsp;&nbsp;extract metadata from classes, attributes, elements</a>.<br /><a href="http://johannburkard.de/blog/programming/javascript/inc-a-super-tiny-client-side-include-javascript-jquery-plugin.html">Super-tiny&nbsp;&nbsp;Client-Side Include Javascript jQuery Plugin</a>.<br /><a href="http://humanized.com/weblog/2007/09/14/undo-made-easy-with-ajax-part-1/">Undo&nbsp;&nbsp;Made Easy with Ajax</a>.<br /><a href="http://www.jasons-toolbox.com/JHeartbeat/">JHeartbeat - periodically poll&nbsp;&nbsp;the server</a>.<br /><a href="http://www.appelsiini.net/projects/lazyload">Lazy&nbsp;&nbsp;Load Plugin</a>.<br /><a href="http://blog.brandonaaron.net/2007/08/19/new-plugin-live-query/">Live&nbsp;&nbsp;Query</a>.<br /><a href="http://jquery.offput.ca/every/">jQuery Timers</a>.<br /><a href="http://www.joanpiedra.com/jquery/shareit/">jQuery Share it - display&nbsp;&nbsp;social bookmarking icons</a>.<br /><a href="http://www.jdempster.com/category/code/jquery/cookiejar/">jQuery&nbsp;&nbsp;serverCookieJar</a>.<br /><a href="http://ideamill.synaptrixgroup.com/?p=3">jQuery&nbsp;&nbsp;autoSave</a>.<br /><a href="http://www.semicomplete.com/blog/geekery/jquery-interface-puffer.html">jQuery&nbsp;&nbsp;Puffer</a>.<br /><a href="http://33rockers.com/jquery/iframe-demo/">jQuery iFrame&nbsp;&nbsp;Plugin</a>.<br /><a href="http://www.stilbuero.de/2006/09/17/cookie-plugin-for-jquery/">Cookie&nbsp;&nbsp;Plugin for jQuery</a>.<br /><a href="http://leftlogic.com/lounge/articles/jquery_spy2">jQuery Spy - awesome&nbsp;&nbsp;plugin</a>.<br /><a href="http://www.learningjquery.com/2007/01/effect-delay-trick">Effect Delay&nbsp;&nbsp;Trick</a>.<br /><a href="http://jquick.sullof.com/jquick/">jQuick - a quick tag&nbsp;&nbsp;creator for jQuery</a>.<a href="http://noteslog.com/post/metaobjects-11-released-today/"><br />Metaobjects</a>.<br /><a href="http://www.thunderguy.com/semicolon/2007/08/14/elementready-jquery-plugin/">elementReady</a>.&nbsp;&nbsp; </p><p>英文：<a href="http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/" title="http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/"><a href="http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/" target="_blank">http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/</a></a></p><br/>Tags - <a href="http://zhoujin.com/tags/jquery/" rel="tag">jquery</a> , <a href="http://zhoujin.com/tags/%25E6%258F%2592%25E4%25BB%25B6/" rel="tag">插件</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/119/</link>
<title><![CDATA[纪念周总理！ ]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Thu, 08 Jan 2009 10:20:54 +0000</pubDate> 
<guid>http://zhoujin.com/post/119/</guid> 
<description>
<![CDATA[ 
	我们敬爱的周总理于１９７６年１月８日在北京逝世，终年７７岁！<br/>今天1月8号了，让我们大家一起缅怀周总理！<br/><a href="http://zhoujin.com/attachment.php?fid=6" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=6" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>人民的总理，永远存于我们的心中。<br/>总理永远活在我们的心中！ <br/>深鞠躬~~！！！然后深切缅怀！！<br/>Tags - <a href="http://zhoujin.com/tags/%25E5%2591%25A8%25E6%2580%25BB%25E7%2590%2586/" rel="tag">周总理</a> , <a href="http://zhoujin.com/tags/%25E7%25BC%2585%25E6%2580%2580/" rel="tag">缅怀</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/120/</link>
<title><![CDATA[基于jQuery的表单验证插件]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[jQuery]]></category>
<pubDate>Mon, 05 Jan 2009 13:18:12 +0000</pubDate> 
<guid>http://zhoujin.com/post/120/</guid> 
<description>
<![CDATA[ 
	表单验证，其实很简单，但做起来麻烦。没有统一规范的代码以及零散的脚本文件，一直是我最头疼的问题。最近做一些项目，于是，决定，做个插件来使用。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;请自行下载插件帮助文档，里面有例子，还有包含插件。如若碰到问题，或bug,或者建议，请联系本人。<br/><br/>本人第一次写博客，欢迎大家来踩踩。。。。<br/><a href="http://www.cnblogs.com/Files/Dabai/jQuery.FormValidator.rar">点击这里下载文件</a><br/><br/>Tags - <a href="http://zhoujin.com/tags/jquery/" rel="tag">jquery</a> , <a href="http://zhoujin.com/tags/%25E8%25A1%25A8%25E5%258D%2595%25E9%25AA%258C%25E8%25AF%2581%25E6%258F%2592%25E4%25BB%25B6/" rel="tag">表单验证插件</a> , <a href="http://zhoujin.com/tags/javascript/" rel="tag">javascript</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/118/</link>
<title><![CDATA[生命 爱情 旅行]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Sun, 30 Nov 2008 16:00:00 +0000</pubDate> 
<guid>http://zhoujin.com/post/118/</guid> 
<description>
<![CDATA[ 
	阳光灿烂，少有的温暖。报上说，明后两天会有一场强降温，气温会从现在的十八度狂降至零下一度。零下，会结冰的温度，想想，就觉得冷到骨子深处。<br/>身体越来越糟糕，像超负荷运转的零部件一样，不时出现这样那样的毛病，不知道哪天哪一部位就会罢工停摆拒绝运转。<br/><br/>不想去医院，不喜欢那股浓浓的来苏尔味道，不喜欢那每日都上演着生生死死欢笑悲泣的地方。不敢想象自己的身体真的出了问题，需要躺在那儿，自己内心会是怎样的苍凉。面对死，我会很坦然。可我却惧怕活着时那种欲罢不能的折磨。<br/><br/>早就明白，生命只是一场旅行，我们每个人都坐在时间的列车上，开始自己的行程。沿途，有风景无数险恶无数，也会有不同的人与我们邂逅，陪我们一程路途，然后各自西东而去。<br/><br/>人生太短暂太苍促，出生、死亡，谁都无法幸免，起点，终点，谁都会安于同一地平线下面，不同的只是，有人的一生平步青云，快乐幸福会多于痛楚，有人的一生荆棘满途，苦难沧桑多于幸福。无论前者还是后者，终其一生也不过只是由一些爱恨情愁、喜怒哀乐交织而成的黑白片段，最终会涅灭成灰。<br/><br/>睁着双眼，任凭黑暗将自己包围。仰望天际，一弯新月，两颗亮晶晶的星星，双星伴月，少见的奇观。原来，月亮并不寂寞，虽然它与星星有着遥不可及的距离。寂寞的是我们这颗凡尘俗世带有贪念的心。<br/><br/>打开播放器，带着迷幻味道的音乐响起，有空灵的女声在边沧桑的耳语，让人沉迷。边，听边有一句没一句的和朋友聊着天，那一段纠缠了她五年多的网络情感，在我刻薄尖酸一针见血的言词中终是尘埃落定。无论她在我面前用言辞掩饰得多少洒脱，从她忍不住滴落的泪水里，我还是看到了绝望、失落与不甘，情关难度，即使看透看破亦是枉然。<br/><br/>男女间的感情，最终都要输给时间。在分针秒针滴答滴答的声音里，会变得千疮百孔。曾经的激情已沦为如今的厌倦，相思不再温存不再，一切的一切，均以如鸡肋般食之无味，弃之如草履是迟早的事情。<br/><br/>爱情，只是沙漠深处那一泓浅浅的湖水，干涸是它唯一的结局。那一双曾经柔情似水让我们沉醉其中的眼眸，最后的最后都将变成沙漠，我们睡在彼此眼睛的沙漠里，看着自己同爱情一道死去。活在爱情里的男女，如同沙漠浅泓中的一尾鱼，畅游后是苦苦的挣扎，然后不情不愿不甘心的咽下最后一口气。<br/><br/>所幸自己是薄情的男子，这世上没有人能让我依恋，所以我迷恋自己迷恋音乐迷恋文字。好在自己是健忘善变的男子，这世上没有哪个女子能让我刻骨铭心伤痛一辈子，只是请相信,爱你的时候我是真的在爱你,忘记的时候是真的已忘了你，纵使当时再难舍再痛楚，过后，我一定会恢复到最初。<br/><br/>曾经我也柔情似水，曾经付出真心只想换来丁点儿的温暖与安慰，然而结局没有一点点的完美，所以开始对所有人都防备，因为距离让我觉得实实在在的安全。<br/><br/>某些人某些事，在我心里已如春之花凋秋之叶落，终是腐败成尸，连掩埋都不值。<br/><br/>薄情是我亦是你。<br/><br/>夜，黑得深了。音乐来来回回在我寂寞空洞的房子里播放着，时间像筛下的沙粒慢慢泻下来，我醒在沙漠深处，看红尘繁华故事，艰难的一步一步踏沙而行。我在失水的世界里幽闭自己，看着那些与爱情有关的令人沮丧令人绝望的人与事，渐渐的掩埋于沙里。<br/><br/>我的眼睛里，有了沙子，硌得生疼，却是没有泪水流得出。
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/116/</link>
<title><![CDATA[对乒乓球失去兴趣]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Thu, 21 Aug 2008 08:34:22 +0000</pubDate> 
<guid>http://zhoujin.com/post/116/</guid> 
<description>
<![CDATA[ 
	没劲！<br/><br/>每次都是包揽，这样的比赛已经失去了意义，我现在一看乒乓球比赛都希望中国队输，包括这次奥运会，这样对乒乓球这项运动才是有益的。否则，到最后只有中国人才玩乒乓球，如果这样，我真希望下一届奥运会取消掉乒乓球比赛。<br/><br/>更加没劲的是，中央台居然找了一个过气的杨影来当乒乓球比赛的解说，一听到她讲话，再好看的比赛我都会换台，经常她解说的比赛，嘉宾都是“嗯、啊、是、哦”的反应，整得跟叫床似的。以为自己很有能耐，可是请来的嘉宾哪个在以往的比赛都比她强100倍。<br/><br/>而且这并非我一家之言，多数人都对杨影的解说嗤之以鼻，中央台任何一个非此专业的解说都比她强。让杨影下去吧，否则没人看乒乓球了。。。。。。人家解说要钱，杨影解说要命啊。<br/>Tags - <a href="http://zhoujin.com/tags/%25E4%25B9%2592%25E4%25B9%2593%25E7%2590%2583/" rel="tag">乒乓球</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/115/</link>
<title><![CDATA[困惑]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Wed, 16 Jul 2008 04:28:30 +0000</pubDate> 
<guid>http://zhoujin.com/post/115/</guid> 
<description>
<![CDATA[ 
	很长时间来一直在考虑一些关于人生、世界观很头痛的问题。为了寻求答案，我不停的读书：技术的，非技术的；文学的，哲学的；古典的，西方的，却很难找到一个合适的答案。最近看的一些快意文字让我更加郁闷窘迫。感觉如同行进入黑黑的大地，四面星光，方向茫茫。对我来说，最困难的事情似乎还不是寻找答案，而是确切的描述问题。对于我目前考虑的一些问题，我还不具备提纲挈领将其描述清楚的能力。描述清楚这个问题在我看来还需要更多的积累。<br/><br/>文学在我身上渐渐复苏起来。我不知道为这种感觉该哭还是笑。我都以为自己的精神世界将要枯竭的时候，文学，艺术等等都将离我而去的时候，文人才有的迷茫、深思、激情却在我脑海中渐渐浮现。然而，仅有的这些冲动远远不能推动创作，远远不能写出理智而具有分量的东西。还需要沉淀。然而，对于沉淀，我这个曾经迷失于沉淀的人，是否能够把握呢？<br/><br/>写下的每一篇文字都不满意，都觉得没有表达自己真正的意思。然而，如同小学课本上的《最后一只小板凳》，这篇文字目的是保持沉淀状态，而不是沉沦。权当自己写过便扔的纸条罢了。<br/><br/><span style="color: #FF0000;">为什么看镜子中的东西，左右是颠倒的，而上下却不颠倒？<br/>为什么时间只向一个方向运动，我们可以知道过去，不能影响过去；我们不知道将来，可以影响将来？<br/>眼睛只能看到大脑相信的东西？<br/>我们所认识的世界，是确实存在的，还是我们自己想象出来的？</span>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/114/</link>
<title><![CDATA[控制发散思维]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Sat, 12 Jul 2008 04:06:43 +0000</pubDate> 
<guid>http://zhoujin.com/post/114/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;深入开源世界的程序员的思维大多发散严重，这种发散在很多情况下是有害的。在制作一个新的产品/项目之前，很多人都会说，唔，你应该参考好的开源东西，把他直接使用。殊不知这样拿来就用伤害最大：因为自己根本没有机会仔细思考自己要做的东西是什么样子的。这就是Hibernate之所以创建EHCache的原因。在EHCache之前，已经有不少Cache实现，为什么没有直接使用？因为Hibernate自己都不知道Cache接口应该是什么样的。因此有了小小的简陋的EHCache, 正是有了这个小小的东西，其他Cache机制的集成才成为可能。因为Hibernate知道与外界集成要遵循的接口是什么。如果当初直接采用某一种Cache实现，恐怕就没有了现在灵活的Cache机制了。（这种思维的方式同样可以推广，为什么小公司不愿意接受数额较大的融资，因为这样很容易将小公司原本不太清晰的发展观念冲垮，最后什么也不是。）<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在设计平台，发现陷入了这样一个怪圈：我总想将最新最好的开源产品集成到平台中，却忽略了Roadmap Feature的定义，也就是说，没有一个清晰的标尺来定义平台某一个版本应该包含那些特征，应该达到什么效果。这样做的后果是我陷入在一个又一个优秀的产品中，像上瘾的烟鬼拔不出来。在深邃的开源世界里，一切的一切都太又诱惑了：为了选定一种O/R映射方案，我比较了JDO的各种实现以及Hibernate，阅读了大量文档（广告？），最后还是回归到Hibernate; 为了选定一种Mock测试方案，我比较了EasyMock, jMock, 之前我从未用过Mock测试，现在我对EasyMock的机制已经相当清楚了；为了选定一种代码覆盖率工具，我比较了Clover, Jcoverage和Emma，最后选定了Jcoverage， 为了选择一种IoC容器，我比较了Spring和 HiveMind，最后选定Spring, 为了选定一种Web开发框架，我重新审视并比较了SpringMVC, WebWork, Struts, Tapestry.，最后选定了Tapestry。这个过程充满了感叹，也充满了诱惑性：很多具有相关性设计精美的项目会时不时招摇的在你眼前晃来晃去，让你忍不住看下去，然后你一个下午的光阴就耗费在从Google或者TSS或者JavaLobby一个链接开始而引入的一个深渊，留下你无法弥补的4个小时的时间。看着越来越近的Release Date, 心情越来越不爽。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因此，一旦前期调研结束，程序员应当果断的将与开源的联系一举切断，专心致志的投入到实现中去，一旦发现有可能抠出新的设计的地方，不要马上就找开源的产品，请先用自己的智慧设计一个能用哪怕是破败不堪的（好的设计是重构出来的，不是吗？）东西，先将框架搭建出来，一个迭代过后，开始重构，等到这个设计基本成型了，能够运行了，然后重新获得与OS的联系，参考同类产品，进行重构或者集成。这么做的目标是控制住发散的思维，在有限的时间内拿出一个在当前状态下最好的方案与实现，没有底线的项目/产品是个毫无意义的泡泡，脆弱，除了作为夸夸的谈资，经不起明眼人的一锥子。<br/>Tags - <a href="http://zhoujin.com/tags/%25E6%258E%25A7%25E5%2588%25B6/" rel="tag">控制</a> , <a href="http://zhoujin.com/tags/%25E6%2580%259D%25E7%25BB%25B4/" rel="tag">思维</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/113/</link>
<title><![CDATA[雨夜静思！ ]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Fri, 11 Jul 2008 14:29:32 +0000</pubDate> 
<guid>http://zhoujin.com/post/113/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;每一天 都有一些事情将会发生生，每段路 都有即将要来的旅程 ， 每颗心 都有值得期待的成分 .... <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;自己最近病了，每天的晚上想的就会多了，感觉累了，不是身体累了，心里累了？好像也不是，那就是————生命累了！这样说也不知道贴切不贴切，但是只能眼下联想到这个了.... <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; “人活着累不累？”有人这样问。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;东方哲人应曰：“天将降大任于斯人也，必先苦其心志，劳其筋骨，饿其体肤，空乏其身……，你说人活着累不累? <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;西方哲人又写道：“你隐没在黑夜里，周围的人都睡着了，而你，整夜不睡，你是守夜者之一，在你挥动的火把下，你瞥见脚下燃烧的火更近了……你为什么通宵不眠?必须有-个守夜，大家都这么说!必须有一个。“从本质上说，我们每个人都是守夜人，不论是天才还是凡人。守夜人不仅劳累，而且孤独，但世界因了这个守夜人的呵护，没有了孤独和惧怕。这时，守夜人的累上升成一种审美的观照，成了人类心灵的守护神，在他不息不歇的火把下，我们看到了美神与爱神携手并肩地微笑。
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/111/</link>
<title><![CDATA[圣斗士星矢的状态模式和观察者模式]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[设计模式]]></category>
<pubDate>Mon, 07 Jul 2008 01:18:06 +0000</pubDate> 
<guid>http://zhoujin.com/post/111/</guid> 
<description>
<![CDATA[ 
	星矢：动画片《圣斗士星矢》的男猪脚，超级小强，怎么打也打不死。 <br/>雅典娜：动画片《圣斗士星矢》的女猪脚，自称女神，手下有88个男人为他卖命。 <br/>状态模式：为了方便的控制状态的变化，避免一堆IF／ELSE，以及状态规则改变的时避免代码改动的混乱。 <br/>观察者模式：一个被观察者一动，多个观察者跟着动，经常用于界面UI。 <br/><br/>话说星矢和很强的某斗士甲对打，雅典娜在一边看，星矢总是挨揍，每次挨揍完之后星矢的状态总是会发生一些变化： <br/><br/>正常－－挨打－－瀕死－－挨打－－小宇宙爆发－－挨打－－瀕死－－挨打－－女神护体－－挨打（星矢无敌了，打也没用，战斗结束）－－正常 <br/><br/>以上状态转变用状态模式来表现，一个Saiya类代表星矢，一个SaiyaState代表他的状态，SaiyaState下面有多个子类，分别代表星矢的多种状态，如正常NORMAL、瀕死DYING、小宇宙爆发UNIVERSE、女神护体GODDESS，即把状态抽象成对象，在每种状态里面实现被打的时候所需要更改的状态，这样就避免了每次被打都要进行一次IF/ELSE的判断。 <br/><div class="code">public class Saiya extends Observable &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//定义星矢的四种状态&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public final SaiyaState NORMAL = new NormalState(this);&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public final SaiyaState DYING = new DyingState(this);&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public final SaiyaState GODDESS = new GoddessState(this);&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public final SaiyaState UNIVERSE = new UniverseState(this);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private SaiyaState state=NORMAL;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private SaiyaState laststate=null;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void hit()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//调用当前状态的被打方法 反过来改变自己的状态&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state.hit();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public String status()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//当前状态名&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return state.status();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;protected void setState(SaiyaState state)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;laststate=this.state;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.state=state;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//观察者模式&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setChanged();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;notifyObservers(&quot;星矢状态变化&quot;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public String getlastStatus()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return laststate.status();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&#125;</div><br/>星矢的状态<br/><div class="code">public abstract class SaiyaState &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;protected Saiya saiya;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public SaiyaState(Saiya saiya) &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.saiya = saiya;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public String status()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String name=getClass().getName();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return name.substring(name.lastIndexOf(&quot;.&quot;)+1);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//星矢被打了&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public abstract void hit();&nbsp;&nbsp; <br/>&#125; </div><br/>在每种状态里面实现被打的时候所需要更改的状态，例如小宇宙爆发状态下被打 <br/><div class="code">public class UniverseState extends SaiyaState &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param saiya&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public UniverseState(Saiya saiya) &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(saiya);&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/* 小宇宙爆发状态被打进入瀕死状态&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void hit() &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saiya.setState( saiya.DYING);&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;</div>&nbsp;&nbsp;<br/>雅典娜在一边看，星矢每次被打她都要给星矢加油，她是个观察者，星矢是被观察者，这里星矢实现java.util.Observable，每次被打hit就notifyObservers，雅典娜就加油。<br/><div class="code">public class Athena implements Observer &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/* 我是雅典娜 我是观察者&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void update(Observable arg0, Object arg1) &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;雅典娜说：星矢加油啊！！！&quot;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125; </div><br/>总的来看 这个过程就是这样子： <br/><div class="code">public class StateMain &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String&#91;&#93; args) &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Saiya saiya = new Saiya();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Observer athena = new Athena();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saiya.addObserver(athena);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;星矢最初的状态是：&quot; + saiya.status());&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; 5; i++) &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;星矢被揍了&quot; + (i + 1) + &quot;次&quot;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saiya.hit();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;星矢现在的状态是：&quot; + saiya.status());&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp;</div><br/>结果星矢在雅典娜的帮助下，有惊无险的战胜了很强的某斗士甲：<br/><div class="code">星矢最初的状态是：NormalState&nbsp;&nbsp; <br/>星矢被揍了1次&nbsp;&nbsp; <br/>雅典娜说：星矢加油啊！！！&nbsp;&nbsp; <br/>星矢现在的状态是：DyingState&nbsp;&nbsp; <br/>星矢被揍了2次&nbsp;&nbsp; <br/>雅典娜说：星矢加油啊！！！&nbsp;&nbsp; <br/>星矢现在的状态是：UniverseState&nbsp;&nbsp; <br/>星矢被揍了3次&nbsp;&nbsp; <br/>雅典娜说：星矢加油啊！！！&nbsp;&nbsp; <br/>星矢现在的状态是：DyingState&nbsp;&nbsp; <br/>星矢被揍了4次&nbsp;&nbsp; <br/>雅典娜说：星矢加油啊！！！&nbsp;&nbsp; <br/>星矢现在的状态是：GoddessState&nbsp;&nbsp; <br/>星矢被揍了5次&nbsp;&nbsp; <br/>雅典娜说：星矢加油啊！！！&nbsp;&nbsp; <br/>星矢现在的状态是：NormalState&nbsp;&nbsp;</div><br/><span style="color: #FF0000;">总结：状态模式的缺点就是会弄出很多子类，如果状态没那么复杂，状态规则改变的可能性比较小的话就不要用了 </span><br/>Tags - <a href="http://zhoujin.com/tags/%25E7%258A%25B6%25E6%2580%2581%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">状态模式</a> , <a href="http://zhoujin.com/tags/%25E8%25A7%2582%25E5%25AF%259F%25E8%2580%2585%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">观察者模式</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/112/</link>
<title><![CDATA[css定义几种格式]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[CSS]]></category>
<pubDate>Fri, 04 Jul 2008 01:44:43 +0000</pubDate> 
<guid>http://zhoujin.com/post/112/</guid> 
<description>
<![CDATA[ 
	1.类型选择符,直接使用元素名称定义 <br/>&nbsp;&nbsp; html&#123;/*<定义网页结构总体样式>*/&#125; <br/>&nbsp;&nbsp; body&#123;/*<定义页面属性>*/&#125; <br/>&nbsp;&nbsp;&nbsp;&nbsp;div&#123;/*<定义div元素的属性>*/&#125; <br/>&nbsp;&nbsp; span&#123;/*<定义span元素的属性>*/&#125; <br/><br/>2. id选择符<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #top &#123;/*<定义id为top元素的文本颜色为red>*/ color:red;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #top div&#123;/*<定义id为top的所有子div元素样式,但不包含id为top的样式>*/&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #top .child1&#123;/*<子级样式一>*/&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #top .child2&#123;/*<子级样式二>*/&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;div id=&quot;top&quot;&gt;我是div&lt;/div&gt;<br/><br/>3. class 选择符 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个就不说了<br/><br/>4. 分组选择符<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h1,h2,h3,h4,h5,h6,p&#123;/*<定义所有级别的标题和段落行高都为字体大小的1.6倍>*<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line-height:1.6em;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .class1,class2&#123;&#123;/*<所有这些class类型样式>*/&#125;<br/><br/>5. 包含选择符<br/>&nbsp;&nbsp;&nbsp;&nbsp;.div1 h2 p span&#123;/*多层包含选择符*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;font-size:18px;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>6.&nbsp;&nbsp;元素指定选择符<br/>&nbsp;&nbsp;&nbsp;&nbsp;span.red&#123;/*定义div元素中class为red元素的颜色为红色*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color:red;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;span#top&#123;/*定义div元素中id为top元素的颜色为红色宽度为百分之百*/<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width:100%;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>7. 子对象选择符<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#main &gt; table&#123;/*定义id为main的主体模块中子对象table的样式*/&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#main &gt; .title&#123;/*定义id为main的主体模块中子对象class为title的样式*/&#125;<br/><br/>以上是定义css格式的语法格式,但是不同格式也让样式具有优先级,简单说下优先级顺序:<br/>&nbsp;&nbsp;&nbsp;&nbsp;id选择符 >&nbsp;&nbsp;class选择符 > 类型选择符<br/>Tags - <a href="http://zhoujin.com/tags/css/" rel="tag">css</a> , <a href="http://zhoujin.com/tags/%25E5%25AE%259A%25E4%25B9%2589/" rel="tag">定义</a> , <a href="http://zhoujin.com/tags/%25E6%25A0%25BC%25E5%25BC%258F/" rel="tag">格式</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/110/</link>
<title><![CDATA[记忆]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Tue, 01 Jul 2008 02:30:04 +0000</pubDate> 
<guid>http://zhoujin.com/post/110/</guid> 
<description>
<![CDATA[ 
	爱情，本身是无色的，然而，人们却赋予了它五彩的颜色，所以，很多人说，爱情是多彩的。 <br/><br/>记忆，本身是空白的，然而，人们将多种元素加入到记忆中，当经历了人生的酸甜苦辣后，记忆变成了调味品，它不再只是幸福的寄托，也加入了辛酸的味道。 <br/><br/>人生，本身是一成不变的，然而，人们却给予太多的幻想，所以，当梦想变为现实时，人生也被定义成另外一个角色，缥缈般的，来了，去了。。。 <br/><br/>我在写字间游走，也在爱恨间穿梭，记忆时而清晰，间或模糊，只在想念地每一个瞬间。。。 <br/><br/>当秋风拂起下一片落叶的时候，你是否会想起我？如同我思念你般地记起我们的曾经，还有那些抹不去的记忆。。。<br/>Tags - <a href="http://zhoujin.com/tags/%25E7%2588%25B1%25E6%2583%2585/" rel="tag">爱情</a> , <a href="http://zhoujin.com/tags/%25E8%25AE%25B0%25E5%25BF%2586/" rel="tag">记忆</a> , <a href="http://zhoujin.com/tags/%25E4%25BA%25BA%25E7%2594%259F/" rel="tag">人生</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/109/</link>
<title><![CDATA[关于软件架构设计]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Wed, 25 Jun 2008 02:10:38 +0000</pubDate> 
<guid>http://zhoujin.com/post/109/</guid> 
<description>
<![CDATA[ 
	软件架构设计其实分为三方面的问题： <br/><br/>1、软件逻辑架构设计，逻辑架构设计主要设计软件的模块组成，模块分层，模块间的接口和契约，只有细化模块设计的时候，才可能考虑到所谓三层结构问题，可能很多的人都把模块的细化设计看成了架构设计 <br/>2、系统架构设计，系统架构设计要考虑的问题就是系统的伸缩性，可扩展性，安全性，稳定性、高性能性等方面的问题，这个时候主要考虑WEB服务器、数据库服务器怎么部署，考虑热备问题，大缓存问题，集群问题、加密访问(如VPN)等方面的问题。这里面会涉及到大量的性能估算问题，这才是考验功力的地方。 <br/>3、物理架构设计，物理架构设计主要考虑硬件的物理放置问题，要考虑到流量的分配、代理问题等，这方面我不是很了解。 <br/><br/><span style="color: #FF0000;">对软件架构的设计居然在相当长的一段时间里面存在误区，居然把软件架构设计和程序框架结构设计混淆等同，以为就架构设计就是设计那些三层结构怎么划分，怎么流转的问题!</span><br/>Tags - <a href="http://zhoujin.com/tags/%25E6%259E%25B6%25E6%259E%2584%25E8%25AE%25BE%25E8%25AE%25A1/" rel="tag">架构设计</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/108/</link>
<title><![CDATA[Visitor - 访问者模式]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[设计模式]]></category>
<pubDate>Mon, 23 Jun 2008 16:05:56 +0000</pubDate> 
<guid>http://zhoujin.com/post/108/</guid> 
<description>
<![CDATA[ 
	话说有一个银行，有三个窗口，但是每个窗口的智能都是一样的，即都能办理所有的业务。因此每位来银行办理业务的人只要排队就是了，排到你了，就向业务员说明你要办理的业务，然后业务员根据你的业务选择不同的单据，打开不同的账本。……。<br/><br/>业务员此时典型的工作流程是：<br/><div class="code">if (service instanceof Saving)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//存款&nbsp;&nbsp; <br/>&nbsp;&nbsp; ......&nbsp;&nbsp; <br/>&#125;else if (service instanceof Draw)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//提款&nbsp;&nbsp; <br/>&nbsp;&nbsp; ......&nbsp;&nbsp; <br/>&#125;else if (service instanceof Fund)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//基金&nbsp;&nbsp; <br/>&nbsp;&nbsp; ......&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>......</div><br/>于是每位业务员的桌面总是塞得满满的，更重要的是大量的时间都花在受理不同业务之间的切换，使得效率很低。<br/><br/>有没有方法能够使得业务员的工作效率提高呢？银行经理苦思冥想了半天，终于想出了一个好办法。他让每个窗口各负责一个业务，同时委任了一位访问者(Visitor)，负责在客户进门时，询问他要办理什么业务，告诉他应该去哪个窗口办理。这样，每个窗口的业务员就只负责一项业务，<span style="color: #FF0000;">减少了在不同业务间切换的时间耗费</span>，效率大大提高。更重要的是，<span style="color: #FF0000;">当某一项业务的处理流程发生变更时，不需要同时麻烦三个窗口的业务员，而只需要让处理这项业务的业务员进行修改就可以了。</span><br/><br/>下面就来定义Visitor类，这个Visitor类实际上还办含了不同窗口受理员的职责，可以认为是银行的受理反应机制吧。<br/><div class="code">public class Visitor &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void process(Service service)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 默认业务&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void process(Saving service)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 存款&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void process(Draw service)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 提款&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void process(Fund service)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 基金&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; </div><br/>接着我们定义业务基类。<br/><div class="code">public class Service &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void accept(Visitor visitor) &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;visitor.process(this);&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;</div><br/>不同的业务类。<br/><div class="code">public class Saving extends Service &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//各种业务处理流程&nbsp;&nbsp; <br/>&#125;</div><br/><div class="code">public class Draw extends Service &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//各种业务处理流程&nbsp;&nbsp; <br/>&#125;</div><br/><div class="code">public class fund extends Service &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//各种业务处理流程&nbsp;&nbsp; <br/>&#125; </div><br/>好了，接下来就是我们的访问者与到来的客户之间的交互了。<br/><div class="code">public class Client &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String&#91;&#93; args) &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service s1 = new Saving();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service s2 = new Draw();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Service s3 = new Fund();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Visitor visitor = new Visitor();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s1.accept(visitor);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s2.accept(visitor);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s3.accept(visitor);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125; </div><br/>后话：专门设定一个访问者的职位还是有点多余，于是后来银行经理请设备公司做了一个排号机来代替访问者。<br/><br/>总结 <br/><br/>Visitor模式实际上是利用的语言本身的特性，见Vistor类的各个函数，通过不同的参数来自动查找相应的处理函数。<br/><br/>采用Visitor的好处如上面说到的那样，当需要改变其中一项业务的处理时，不需要每个地方都进行修改，而只需要改动Visitor类中相应的处理函数就可以了。也就是说它适合于业务处理时常发生变动的情况。<br/><br/>当然，Visitor也有它自身的限制。它不适合于业务数量的经常变化，因为一旦新增或删除一些Service时，需要对visitor进行相应的增删。也就是说具体Service与Visitor是耦合的。<br/>Tags - <a href="http://zhoujin.com/tags/visitor/" rel="tag">visitor</a> , <a href="http://zhoujin.com/tags/%25E8%25AE%25BF%25E9%2597%25AE%25E8%2580%2585%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">访问者模式</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/105/</link>
<title><![CDATA[opoa项目实践]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[歪布天地]]></category>
<pubDate>Mon, 23 Jun 2008 06:32:40 +0000</pubDate> 
<guid>http://zhoujin.com/post/105/</guid> 
<description>
<![CDATA[ 
	一 定义<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;One Page, One Application(后面缩写为OPOA，或者1P1A)， 含义很简单：一个页面就是一个应用。不再使用iframe, 页面提交不能再使用submit方式。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在众多的基于Web的MIS系统中，没有人关心页面的组织形式；大多数稍微复杂的MIS系统，都采用分祯(Frame)的方式来组织页面，这样，在进行业务操作的时候，url的变化表现在一个框架页面内，从浏览器的地址看起来，只有一个地址；更有甚者，一些应用干脆弹出一个去掉了浏览器菜单、工具条、地址栏、状态栏的窗口（比如招商银行、民生银行的网上银行系统），连地址都看不见。因此，一个页面就是一个应用，从用户的角度来说，对于操作型系统，是一种非常自然的体现。用户无需了解每一个具体的操作对应的地址是什么。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这种设计背后的含义实际是：是希望由程序来控制用户的行为，还是反过来。在操作型系统中，每一步的操作往往被业务含义严格定义，无论是应用的设计者，还是其使用者，都希望在一种受控的状况下来进行操作。例如，一个审批动作，用户更希望是通过一个按钮来触发，而不是访问类似于/approve.action?itemid=123的方式。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样的好处是：很多东西，例如：JS，CSS，HEAD等整个系统都只需加载一次。加快响应速度。客户体验也有所提高，不再弹出窗口，不再整个页面进行刷新。<br/><br/>二 场景<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;显然，OPOA的设计只能针对那些对URL不敏感的系统，或者说操作型系统。绝大多数MIS系统都属于这一范畴，Email系统也是这一范畴，其他领域，如监控系统，聊天室等都可以采用这种思路。反面的例子是，对于内容型系统，如新闻系统，Blog系统，论坛系统，用户更希望能够通过一个明确的URL来定位页面内容，搜索引擎也喜欢这种地址。这种应用需要的是一个合理，易懂，明确的地址。<br/><br/>三 设计与实现<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;大多数MIS系统，无论是有意识或者无意识，都遵循了OPOA的思路。要么采用框架，要么采用弹出窗口来屏蔽URL的直接访问。实现上也很简单，这里就不再赘述了。注意到上述的OPOA地实现只是对用户而言，看起来好像是一个页面一样，但实际上还是有众多的action， page在后面工作。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面我要说的一种实现是，采用buffalo技术来实现真正意义上的OPOA. 简而言之：主页面（或者称布局页面）只加载一次，其他的操作页面通过buffalo技术来加载，并将其中的操作脚本与布局内容分开，最后进行展示。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先存在一个布局页面，这个页面定义了一个应用大致的外观，（例如，大部分MIS系统按照上中下三栏，中间部分左右两栏分别为顶部logo, 操作菜单，具体操作内容，底部状态栏）。用你喜欢的网页编辑工具，将这个页面设计美观，然后按照应用的要求，将页面进行拆分。此时的拆分不用Frame了，只需要在不同的部位加上<div id=”…”>就可以。<br/>然后在主页面定义一个函数，例如switchPage, 将这个函数使用在需要进行页面切换的地方。switchPage函数这样实现：<br/><div class="code">function switchPage(page) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; pageBuffalo.remoteCall(”pageService.loadPage”, &#91;page&#93;, function(reply) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var pageObj = reply.getResult();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Buffalo.getElementById(”body”).innerHTML = pageObj.html;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (pageObj.script != null &#124;&#124; pageObj.script != “”) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;execScript(pageObj.script);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;);<br/>&#125;</div><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;剩下的工作都可以想象了。你可以将web应用的网页资源全部用html编写，并放在一个不为人知的地方，而通过pageService来读取他们；你可以任意组织你的应用外观，更加自如的切换他们。应用的URL地址永远只有真正的一个，你的应用也要比别人快很多，因为只加载那么一小块内容。<br/><br/>项目实践过程中遇到的问题：<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 1. 须保证页面元素ID唯一，全系统JS函数名唯一 [定义一个规范]<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 2. 回调函数处理 [封闭buffalo提交的方式，增加回调处理]<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 3. FORM提交 [使用buffalo的form提交]<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; 4. JS加载问题 [使用与buffalo组件绑定的方式加载]<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;5. 事务同步问题 [通过设置buffalo提交参数，并且自己在回调进行特殊处理]<br/>&nbsp;&nbsp;&nbsp;&nbsp; ……<br/><br/>四 小结<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AJAX的兴起为我们开阔了很多视野。比起原来的web框架，这种OPOA的方式能够更快，减少更多的编码量，并提供更好的用户体验。当然，上文中提出的只是一个原型实现，如果尝试自行实现，可能更多的东西需要考虑，如安全，缓存，事件回调机制，内存管理等等。但这将是一个方向，一个可以提高开发体验与用户体验的方向。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这是我们项目第一次使用OPOA思想，在大概一个月的摸索道路上，需要解决的问题是比较多的。而且前期开发的压力也是比较大！思想不同了，处理方式不同了，带来了更高的客户体验！ 有得必有失，权衡中间的得失才是最重要的！我们正在成长，在OPOA的道路上！<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 善于总结，我们就能提高，善于发现，我们就有机会！<br/>Tags - <a href="http://zhoujin.com/tags/opoa/" rel="tag">opoa</a> , <a href="http://zhoujin.com/tags/buffalo/" rel="tag">buffalo</a> , <a href="http://zhoujin.com/tags/ajax/" rel="tag">ajax</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/104/</link>
<title><![CDATA[学会放弃]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Sun, 22 Jun 2008 07:27:46 +0000</pubDate> 
<guid>http://zhoujin.com/post/104/</guid> 
<description>
<![CDATA[ 
	许多事情，只有要经历过之后才会懂得放弃 <br/>　一如感情，爱的时候伤的遍体鳞伤，不一定就会刻苦铭心，有些事情＂只可远视而不可近瞧的＂！ <br/>　　学会放弃，生活就会比较容易． <br/>　　　学会放弃，在落泪以前转身离去． <br/>　　　　学会放弃，在天黑以前携阳归去． <br/>　　　　．．．．．．<br/>Tags - <a href="http://zhoujin.com/tags/%25E6%2594%25BE%25E5%25BC%2583/" rel="tag">放弃</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/92/</link>
<title><![CDATA[n＋1统计解决办法]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[HIBERNATE]]></category>
<pubDate>Thu, 19 Jun 2008 18:32:13 +0000</pubDate> 
<guid>http://zhoujin.com/post/92/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;业务场景，Department和Employee是一对多关系。现在我对Department进行分页查询，要求在显示的页面上同时显示每个Department中Employee的数量。这是一个很简单的业务场景，但是想象一下如何用hibernate进行映射？ <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先否定一种做法：hql：FROM Department department。然后针对每个department，去做department.getEmployees().size()。这样不仅会发送n＋1条SQL，而且性能太低。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们肯定希望采用一句HQL解决问题，但是此时问题来了，当你试图做SELECT department, count(employee.id) FROM .....这样的HQL时，在Java端，发现没有一个合适的对象可以映射。 <br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;从OO的角度，其实可以在Department这个类中加一个employeeSize来表示这种业务场景。但是好像Hibernate无法去做类似的映射。而iBatis在这个方面却灵活的多。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以用hql一句话写： <br/><div class="code">select new DepartmentView(d.poin,count(e.poin)) from Department d inner join d.employeeSet group by d.poin. </div><br/>Tags - <a href="http://zhoujin.com/tags/hibernate/" rel="tag">hibernate</a> , <a href="http://zhoujin.com/tags/%25E7%25BB%259F%25E8%25AE%25A1/" rel="tag">统计</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/94/</link>
<title><![CDATA[Spring配置初始化ApplicationContext]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[SPRING]]></category>
<pubDate>Wed, 18 Jun 2008 07:16:42 +0000</pubDate> 
<guid>http://zhoujin.com/post/94/</guid> 
<description>
<![CDATA[ 
	1. 在struts-config.xml里，以插件的形式<br/><br/>xml 代码<br/><div class="code">&lt;plug-in className=&quot;org.springframework.web.struts.ContextLoaderPlugIn&quot;/&gt;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;set-property property=&quot;contextConfigLocation&quot; value=&quot;/WEB-INF/applicationContext.xml&quot;/&gt;&nbsp;&nbsp; <br/>&lt;/plug-in&gt; </div><br/>这种方式如果没有配置contextConfigLocation的值，则会自动加载xx-servlet.xml.<br/><br/>xx的值是和web.xml里的配置org.apache.struts.action.ActionServlet的servlet-name的值一样<br/><br/>如下：xx的值也就是 action,所以会自动加载action-servlet.xml<br/><br/>xml 代码<br/><div class="code">&lt;servlet&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;action&lt;/servlet-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup &gt;1&lt;/load-on-startup &gt;<br/>&lt;/servlet&gt;&nbsp;&nbsp; <br/>&lt;servlet-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;action&lt;/servlet-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br/>&lt;/servlet-mapping&gt;</div><br/> 如果sturts-config.xml里配置了contextConfigLocation的值，那么就不会自动加载xx-servlet.xml了，而只会加载contextConfigLocation所指定的xml.<br/><br/> 2. 第2种方式<br/><br/>在web.xml里配置Listener<br/><br/>xml 代码<div class="code">&lt;listener&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br/>&lt;/listener&gt;</div><br/>如果在web.xml里给该Listener指定要加载的xml,如：<div class="code">&lt;context-param&gt;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;contextConfigLocationparam-name&gt;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;classpath*:spring/*.xmlparam-value&gt;&nbsp;&nbsp; <br/>&lt;/context-param&gt; </div>&nbsp;&nbsp;<br/><br/>则会去加载相应的xml,而不会去加载/WEB-INF/下的applicationContext.xml。。但是，如果没有指定的话，默认会去/WEB-INF/下加载applicationContext.xml。<br/><br/>3. 第三种方式：ContextLoaderServlet<br/><br/>xml 代码<br/><div class="code">&lt;servlet&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;context&lt;/servlet-name&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;org.springframework.web.context.ContextLoaderServlet&lt;/servlet-class&gt;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br/>&lt;/servlet&gt; </div>&nbsp;&nbsp; <br/><br/> 这种方式和第二种Listener方式一样，唯一的区别就是用Listener方式初始化ApplicationContext，可以和用第一种方式（struts-config.xml里 plugin方式）同时存在，而ContextLoaderServlet则不可以和第一种方式同时存在<br/><br/>总结：<br/>ContextLoaderServlet已经不推荐用了，它只是为了兼容低版本的servlet.jar才用的。<br/><br/>总的来说:Listerner要比Servlet更好一些，而且Listerner监听应用的启动和结束，而Servlet启动要稍微延迟一些。<br/>Tags - <a href="http://zhoujin.com/tags/spring/" rel="tag">spring</a> , <a href="http://zhoujin.com/tags/%25E9%2585%258D%25E7%25BD%25AE/" rel="tag">配置</a> , <a href="http://zhoujin.com/tags/%25E5%2588%259D%25E5%25A7%258B%25E5%258C%2596/" rel="tag">初始化</a> , <a href="http://zhoujin.com/tags/applicationcontext/" rel="tag">applicationcontext</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/107/</link>
<title><![CDATA[哈佛的幸福课]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Tue, 17 Jun 2008 10:29:41 +0000</pubDate> 
<guid>http://zhoujin.com/post/107/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;出人意料，去年哈佛最受欢迎的选修课是"幸福课"，听课人数超过了王牌课《经济学导论》。教这门课的是一位名不见经传的年轻讲师，名叫泰勒·本－沙哈尔。在一周两次的"幸福课"上，本－沙哈尔没有大讲特讲怎么成功，而是深入浅出地教他的学生，如何更快乐、更充实、更幸福。　<br/>　　本－沙哈尔自称是一个害羞、内向的人。"在哈佛，我第一次教授积极心理学课时，只有8个学生报名，其中，还有2人中途退课。第二次，我有近400名学生。到了第三次，当学生数目达到850人时，上课更多的是让我感到紧张和不安。特别是当学生的家长、爷爷奶奶和那些媒体的朋友们，开始出现在我课堂上的时侯。"　<br/>　　本－沙哈尔成了"哈佛红人"。校刊和《波士顿环球报》等多家媒体，报道了积极心理学课在哈佛火爆的情景。　 <br/>"幸福课"为何会在哈佛大受欢迎？<br/> <br/><span style="color: #D2691E;">一、我们越来越富有，可为什么还是不开心呢?</span><br/>　　"我曾不快乐了30年。"本－沙哈尔这样说自己。　<br/>　　他也是哈佛的毕业生，从本科读到博士。在哈佛，作为三名优秀生之一，他曾被派往剑桥进行交换学习。他还是个一流的运动员，在社团活动方面也很活跃。但这些并没有让他感到持久的幸福。他坦言，自己的内心并不快乐。　<br/>　　"最初，引起我对积极心理学兴趣的是我的经历。我开始意识到，内在的东西比外在的东西，对幸福感更重要。通过研究这门学科，我受益匪浅。我想把我所学的东西和别人一起分享，于是，我决定做一名教师。"　<br/>　　在本－沙哈尔第二次开设"幸福课"的2004年，哈佛校报上有一篇报道：《学校面临心理健康危机》，标题下的导语说：在过去的一年，绝大多数学生感到过沮丧和消沉。文章引述了一位学校舍区辅导员写给舍区主管的信。　<br/>　　"我快覆没了。"这位辅导员写道。在他分管的舍区内，有20个学生出现了心理问题。一个学生因为严重焦虑而无法完成学期作业；另一个学生因为精神崩溃而错过三门考试……舍区主管把这封信转给了哈佛校长，并强调该舍区的问题并不是特例。　<br/>　　一位曾患严重焦虑和情绪紊乱的哈佛毕业生说：大多数哈佛学生还没意识到，即使那些表面看来很积极、很棒的学生，也很有可能正在被心理疾病折磨着，即使你是他最要好的朋友，也未必意识到他有心理问题。　<br/>　　"在内心深处，我经常觉得自己会窒息或者死去。"这名学生说。她时常不明原由地哭泣，总要把自己关起来才能睡觉。她看过几个心理医生，试过6种药物，休学两个月，来应付自己的心理问题。"我是一个成绩优异的哈佛精神病患者。"她这样描述自己。　<br/>　　有个名叫玛丽亚的哈佛女生，在宿舍内自杀，年仅19岁。她的室友回忆说：就在自杀前一晚，玛丽亚和班里同学谈论天气时，还表现得十分开心的样子。"她看起来很好。她在听音乐，调子好像还很欢快。"　<br/>　　哈佛一项持续6个月的调查发现，学生正面临普遍的心理健康危机。调查称：过去的一年中，有80％的哈佛学生，至少有过一次感到非常沮丧、消沉。47％的学生，至少有过一次因为太沮丧而无法正常做事，10％的学生称他们曾经考虑过自杀……　<br/>　　"我们越来越富有，可为什么还是不开心呢？"这是令许多美国人深感困惑的问题。据统计，在美国，抑郁症的患病率，比起20世纪60年代高出10倍，抑郁症的发病年龄，也从上世纪60年代的29.5岁下降到今天的14.5岁。而许多国家，也正在步美国后尘。1957年，英国有52％的人，表示自己感到非常幸福，而到了2005年，只剩下36％。但在这段时间里，英国国民的平均收入却提高了3倍。 <br/><br/><span style="color: #D2691E;">二、我们来到这个世上，到底追求什么才是最重要的？　</span> <br/>　　本－沙哈尔坚定地认为：<span style="color: #008000;">幸福感是衡量人生的唯一标准，是所有目标的最终目标。</span>　<br/>　　"人们衡量商业成就时，标准是钱。用钱去评估资产和债务、利润和亏损，所有与钱无关的都不会被考虑进去，金钱是最高的财富。但是我认为，人生与商业一样，也有盈利和亏损。　<br/>　　"<span style="color: #008000;">具体地说，在看待自己的生命时，可以把负面情绪当作支出，把正面情绪当作收入。当正面情绪多于负面情绪时，我们在幸福这一'至高财富'上就盈利了</span>。　<br/>　　长期的抑郁，可以被看成是一种'情感破产'。整个社会，也有可能面临这种问题，如果个体的问题不断增长，焦虑和压力的问题越来越多，社会就正在走向幸福的'大萧条'。"　<br/>　　一项有关"幸福"的研究表明，人的幸福感主要取决3个因素："遗传基因、与幸福有关的环境因素以及能够帮助我们获得幸福的行动。而积极心理学，可以帮助人们活得更快乐、更充实。幸福，是可以通过学习和练习获得的。"　<br/>　　本－沙哈尔说："我知道它是可行的，因为，它已深深地帮助了我。"　<br/>　　我们的很多课，都在教学生如何更好地思考、更好地阅读、更好地写作，可是为什么就不该有人教学生更好地生活呢？把艰深的积极心理学学术成果简约化、实用化，教学生懂得自我帮助，这是本－沙哈尔开设"幸福课"的初衷。<br/> <br/><span style="color: #D2691E;">三、幸福，应该是快乐与意义的结合</span><br/>　　让本－沙哈尔对幸福的理解，发生根本转变的起因，是他早年的一次重要经历。　<br/>　　16岁那年，在以色列长大的本－沙哈尔，获得了全国壁球赛的冠军。在长达5年的训练中，空虚感如影相伴，他一直觉得生命中缺少了什么。虽为此闷闷不乐，但他仍坚信：无论身体或心理都要坚强，才能最终取胜；而胜利，一定会带来充实感，也能让自己最终幸福。　<br/>　　终于，本－沙哈尔如愿以偿，夺冠后的他欣喜若狂，和家人、朋友举行了隆重的庆贺。那时，他对自己的理念更加深信不疑：成功可以带来快乐，过去所受的种种苦痛，都是值得的。　<br/>　　"可就在那天晚上，睡前我坐在床上，试着再回味一下无限的快感。可是突然间，那种胜利的感觉，那种梦想成真的喜悦，所有的快乐，都消失得无影无踪。我的内心，忽然又变得很空虚，只有迷惘和恐惧。泪水涌出，不再是喜极而泣，而是伤心难过。在如此顺意的情况下，尚不能感到幸福的话，那我将到何处，去寻找我人生的幸福？"　<br/>　　他极力让自己镇定，并告诉自己这只是暂时的神经过敏。但在接下来的日子里，他仍没有找回快乐；相反，内心的空虚感越来越重。慢慢地他发现：胜利，并没为他带来任何幸福，他所依赖的逻辑彻底被打破。"从那时起，我开始对一个问题非常着迷：如何才能得到真正的幸福？"　<br/>　　本－沙哈尔注意观察周围的人，谁看起来幸福，他就向谁请教。他读有关幸福的书，从亚里士多德到孔子，从古代哲学到现代心理学，从学术研究到自助书籍等等。最后他决定去大学主修哲学和心理学。　<br/>　　他的幸福观，逐渐清晰起来：幸福，应该是快乐与意义的结合。　<br/>　　"<span style="color: #008000;">一个幸福的人，必须有一个明确的、可以带来快乐和意义的目标，然后努力地去追求。真正快乐的人，会在自己觉得有意义的生活方式里，享受它的点点滴滴。"　</span><br/>　　本－沙哈尔竟然从汉堡里，总结出了4种人生模式。　<br/>　　当年，为了准备重要赛事，除了苦练外，他须严格节制饮食。开赛前一个月，只能吃最瘦的肉类，全麦的碳水化合物，以及新鲜蔬菜和水果。他曾暗中发誓，一旦赛事完了，一定要大吃两天"垃圾食品"。比赛一结束，他干的第一件事，就是奔到自己喜爱的汉堡店，一口气买下4只汉堡。当他急不可待地撕开纸包，把汉堡放在嘴边的刹那，却停住了。因为他意识到，上个月，因为健康的饮食，自己体能充沛。如果享受了眼前汉堡的美味，很可能会后悔，并影响自己的健康。望着眼前的汉堡，他突然发现，它们每一种都有自己独特的风味，可以说，代表着4种不同的人生模式。　<br/>　　第一种汉堡，就是他最先抓起的那只，口味诱人，但却是标准的"垃圾食品"。吃它等于是享受眼前的快乐，但同时也埋下未来的痛苦。用它比喻人生，就是及时享乐，出卖未来幸福的人生，即"享乐主义型"；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第二种汉堡，口味很差，里边全是蔬菜和有机食物，吃了可以使人日后更健康，但会吃得很痛苦。牺牲眼前的幸福，为的是追求未来的目标，他称之为"忙碌奔波型"；<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第三种汉堡，是最糟糕的，既不美味，吃了还会影响日后的健康。与此相似的人，对生活丧失了希望和追求，既不享受眼前的事物，也不对未来抱期许，是"虚无主义型"；会不会还有一种汉堡，又好吃，又健康呢？<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第四种"幸福型"汉堡。一个幸福的人，是即能享受当下所做的事，又可以获得更美满的未来。　<br/>　　不幸的是，据本－沙哈尔观察，现实生活中的大部分人，都属于"忙碌奔波型"。 <br/><br/><span style="color: #D2691E;">四、人们习惯性地去关注下一个目标，而常常忽略了眼前的事情。</span><br/>　　本－沙哈尔经常讲"蒂姆的故事"。在这个故事里，晃动着许多人熟悉的影子。　<br/>　　蒂姆小时候，是个无忧无虑的孩子。但自打上小学那天起，他忙碌奔波的人生就开始了。父母和老师总告诫他，上学的目的，就是取得好成绩，这样长大后，才能找到好工作。没人告诉他，学校，可以是个获得快乐的地方，学习，可以是件令人开心的事。因为害怕考试考不好，担心作文写错字，蒂姆背负着焦虑和压力。他天天盼望的，就是下课和放学。他的精神寄托就是每年的假期。　<br/>　　渐渐地，蒂姆接受了大人的价值观。虽然他不喜欢学校，但还是努力学习。成绩好时，父母和老师都夸他，同学们也羡慕他。到高中时，蒂姆已对此深信不疑：牺牲现在，是为了换取未来的幸福；没有痛苦，就不会有收获。当压力大到无法承受时，他安慰自己：一旦上了大学，一切就会变好。　<br/>　　收到大学录取通知书时，蒂姆激动得落泪。他长长舒了一口气：现在，可以开心地生活了。但没过几天，那熟悉的焦虑又卷土重来。他担心在和大学同学的竞争中，自己不能取胜。如果不能打败他们，自己将来就找不到好工作。　<br/>　　大学4年，蒂姆依旧奔忙着，极力为自己的履历表增光添彩。他成立学生社团、做义工，参加多种运动项目，小心翼翼地选修课程，但这一切完全不是出于兴趣，而是这些科目，可以保证他获得好成绩。　<br/>　　大四那年，蒂姆被一家著名的公司录用了。他又一次兴奋地告诉自己，这回终于可以享受生活了。可他很快就感觉到，这份每周需要工作84小时的高薪工作，充满压力。他又说服自己：没关系，这样干，今后的职位才会更稳固，才能更快地升职。当然，他也有开心的时刻，在加薪、拿到奖金或升职时。但这些满足感，很快就消退了。　<br/>　　经过多年的打拼，蒂姆成了公司合伙人。他曾多么渴望这一天。可是，当这一天真的到来时，他却没觉得多快乐。蒂姆拥有了豪宅、名牌跑车。他的存款一辈子都用不完。　<br/>　　他被身边的人认定为成功的典型。朋友拿他当偶像，来教育自己的小孩。可是蒂姆呢，由于无法在盲目的追求中找到幸福，他干脆把注意力集中在了眼下，用酗酒、吸毒来麻醉自己。他尽可能延长假期，在阳光下的海滩一呆就是几个钟头，享受着毫无目的的人生，再也不去担心明天的事。起初，他快活极了，但很快，他又感到了厌倦。　<br/>　　做"忙碌奔波型"并不快乐，做"享乐主义型"也不开心，因为找不到出路，蒂姆决定向命运投降，听天由命。但他的孩子们怎么办呢？他该引导他们过怎样的一种人生呢？蒂姆为此深感痛苦。　<br/>　　为什么当今社会有那么多"忙碌奔波型"的人呢？本－沙哈尔这样解释：因为人们常常被"幸福的假象"所蒙蔽。　<br/>　　我们所处的社会环境和文化背景是这样的：假如孩子成绩全优，家长就会给奖励；如果员工工作出色，老板就会发给奖金。人们习惯性地去关注下一个目标，而常常忽略了眼前的事情，最后，导致终生的盲目追求。　<br/>　　然而一旦目标达成后，人们常把放松的心情，解释为幸福。好像事情越难做，成功后的幸福感就越强。不可否认，这种解脱，让我们感到真实的快乐，但它绝不等同于"幸福"。它只是"幸福的假象"。　<br/>　　这就好比一个人头痛好了之后，他会为头不痛而高兴，这是由于这种喜悦，来自于痛苦的前因。"忙碌奔波型"的人，错误地认为成功就是幸福，坚信目标实现后的放松和解脱，就是幸福。因此，他们不停地从一个目标奔向另一个目标。　<br/>　　在本－沙哈尔看来，寻找真正能让自己快乐而有意义的目标，才是获得幸福的关键。<br/><br/><span style="color: #D2691E;">五、他们把物质与财富，放在了快乐和意义之上</span><br/>　　在课堂上，本－沙哈尔不断地向听讲者发问：　<br/>　　我们可以不停地追问"为什么"，来反思自己所追求的东西：可以是大房子、升职或任何其他的目标。看看要问多少个"为什么"，才能落到"幸福"的追求上？问问自己，我做的事情，对我有意义吗？它们给我带来了乐趣吗？我的内心，是否鼓励我去做不同的尝试？是不是在提醒我，需要彻底改变目前的生活？　<br/>　　本－沙哈尔的哲学老师在他毕业时，给了他一点忠告："<span style="color: #FF0000;">生命很短暂，在选择道路前，先确定自己能做的事。其中，做那些你想做的。然后再细化，找出你真正想做的。最后，对于那些真正、真正想做的事，付诸行动</span>。"　<br/>　　本－沙哈尔也这样教他的学生，如何寻找能发挥自己优势和热情的工作。　<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用以下3个关键问题，先来问问自己：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一，什么带给我意义？<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二，什么带给我快乐？<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;三，我的优势是什么？<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;并且要注意顺序。然后看一下答案，找出这其中的交集点，那个工作，就是最能使你感到幸福的工作了。　<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10多年前，本－沙哈尔遇到过一个年轻人。他是一名律师，在纽约一家知名公司上班，并即将成为合伙人。坐在他的高级公寓里，中央公园的美景一览无余。年轻人非常努力地工作，一周至少干60个小时。早上，他挣扎着起床，把自己拖到办公室，与客户和同事的会议、法律报告与合约事项，占据了他的每一天。当本－沙哈尔问他，在一个理想世界里还想做什么时，这名律师说，最想去一家画廊工作。　<br/>　　"难道说，现实世界里找不到画廊的工作吗？"年轻人说不是的。但如果在画廊工作，收入会少许多，生活水平也会下降。他虽对律师楼很反感，但觉得没其他选择。　<br/>　　因为被一个不喜欢的工作所捆绑，所以他每天并不开心。在美国，有50％的人对自己的工作不甚满意。但本－沙哈尔认为，这些人之所以不开心，并不是因为他们别无选择，而是他们的决定，让他们不开心。因为他们把物质与财富，放在了快乐和意义之上。　<br/>　　"金钱和幸福，都是生存的必需品，并非互相排斥。"他说。　<br/>　　他进一步说，通常在越感兴趣的事情里，人就越能发挥自己的天赋，越能做得持久。人一旦有了热情，不但动机坚定，连做事效率也会提高。举例讲，一个热爱学习的学生，可以在学习中享受创造的愉悦，而这快乐的成果，还可以帮他取得好成绩，助其获得未来的幸福。在亲密关系中也一样，两个人共享着爱情的美好，并促进彼此的成长和发展。　<br/>　　许多研究表明，一个幸福的人，在生活的各个层面上都会很成功，包括婚姻、友谊、收入、工作表现以及健康。<span style="color: #FF0000;">幸福与成功，存在强烈的相互作用，无论是工作上还是感情上的成功，可以带来幸福；而幸福本身，也能带来更多的成功。</span>　<br/>　　本－沙哈尔总结出这样3种工作境界：赚钱谋生、事业、使命感。　<br/>　　如果只把工作当成任务和赚钱的手段，就没有任何的个人实现。这样每天去上班，只是必须而不是想去，他所期盼的，除了薪水，就是节假日了；把工作当事业的人，除了注重财富的积累外，还会关注事业的发展，如权力和声望等。他们会关心下一个升职的机会，期望从副教授到终身教授、从教师到校长、从职员到主管、从编辑到总编辑；假如，把工作当成使命，那工作本身就是目标了。薪水、职位固然重要，但他们工作，是因为他们想要做这份工作，动力源自内心。工作是一种恩典，而不是为人打工。他们对工作充满热情，在工作中自我实现，获得充实感。他们的目标，正是自我和谐的目标。　<br/>　　有一项研究，是针对医院清洁工的。一组人觉得自己的清洁工作很无聊，没啥意义；但另一组人，觉得很有意义，做得很投入。他们与护士、病人以及家属交谈，想办法让医院员工、病人舒适。他们看待工作的角度更高，并在其中找到了意义：我不仅仅是个倒垃圾和洗衣服的人，正是我的工作，让医院正常运转，帮助病人更快地康复。　<br/>　　就像第二组人，由于在日常工作中找到了使命感，因而从中也得到了更多的意义和快乐，他们与服务对象的关系，也不再是简单的金钱关系。有时候，人们并没有换工作，或改变工作环境，他们所做的，只是赋予了工作本身更多的意义，从中发现乐趣，因而也提升了幸福感。　<br/>　　可以想像，一个因为家长的压力而学法律的人，是无法在其中找到长久快乐的；相反，如果是基于对法律的热爱而成为律师的话，那他在维护公义的同时，也会觉得很幸福。　<br/>　　"一个在工作中找到意义与快乐的投资家，一个出于正确动机的商人，绝对要比一个心不在焉的和尚，高尚和有意义得多。"本－沙哈尔笃定地说。　<br/>　　不同的人，会在不同的事里找到意义。如创业、当义工、抚养子女、行医、甚至是打家具。重要的是，选择目标时，必须确定它符合自己的价值观、爱好，符合自己内心的愿望，而不是为了满足社会标准，或是迎合他人的期待。"真我的呼唤"，就是使命感。　<br/>　　"那真是神奇的时刻。"本－沙哈尔用一段话，描述这种美妙的体验：我甚至形成了一种迷信，世上确实有看不见的力量在帮我。只要你追随自己的天赋和内心，你就会发现，生命的轨迹原已存在，正期待你的光临，你所经历的，正是你应拥有的生活。当你能够感觉到自己正行走在命运的轨道上，你会发现，周围的人，开始源源不断地带给你新的机会。　<br/>　　"<span style="color: #FF0000;">在追求有意义而又快乐的目标时，我们不再是消磨光阴，而是在让时间，闪闪发光</span>。"<br/><br/><span style="color: #D2691E;">六、我也有不快乐的时刻，因为我们是人</span>　 <br/>　　一天，在哈佛的食堂，有个学生走到本－沙哈尔面前，问他：你就是那个教人如何快活的老师吧。学生接着又说：你要小心，我的室友选了你的课，如果哪天我发现你并不快乐，我就要告诉他，别再上你的课。本－沙哈尔看着这个学生，笑着道：没关系，我现在就可以告诉你，我也有不快乐的时刻，因为我们是人。　<br/>　　"总有人问我，你能帮我消除痛苦吗？可是为什么要用这种态度来对待痛苦。痛苦，是我们的人生经验，会让我们从中学到很多。人生的成长和飞跃，经常发生在你觉得非常痛苦的时刻。"　<br/>　　漫漫人生，每个人都不可避免地会面临悲伤的时刻，比如经历失败或失去，但我们依然可以活得幸福。事实上，期盼无时无刻的快乐，只会带来失望和不满，并最终导致负面情绪的产生。　<br/>　　一个幸福的人，也会有情绪上的起伏，但整体上，能保持一种积极的人生态度。他经常被积极的情绪推动着，如欢乐和爱；很少被愤怒或内疚，这些负面情绪所控制。快乐是常态，而痛苦都是小插曲。　<br/>　　刚开始讲"幸福课"时，本－沙哈尔很想扮演一个无所不知、幽默的人，一个完美的导师，为此，他特地跑到喜剧演员培训班学习。但他不是那种能开激烈的玩笑，做夸张表演的人。无论怎么学，他也达不到想要的戏剧效果。　<br/>　　想让自己当一个完美的老师，他发现这样即害了自己，也害了学生。"每次都很紧张，怕被发现面具下真实的样子，结果把自己搞得很累。这样不仅害了我自己，也伤害了学生，等于给学生树立了一个'完人'典型，告诉学生走一条永远走不通、错误的路。打开自己，袒露真实的人性，会唤起学生真实的人性。在学生面前做一个自然的人，反而会更受尊重。"　<br/>　　本－沙哈尔希望他的学生，学会接受自己，不要忽略自己所拥有的独特性；要摆脱"完美主义"，要"学会失败"。　<br/>　　为了更好地记住"幸福课"的要点，本－沙哈尔还为学生简化出10条小贴士：　<br/>　　1．遵从你内心的热情。选择对你有意义并且能让你快乐的课，不要只是为了轻松地拿一个A而选课，或选你朋友上的课，或是别人认为你应该上的课。　<br/>　　2．多和朋友们在一起。不要被日常工作缠身，亲密的人际关系，是你幸福感的信号，最有可能为你带来幸福。　<br/>　　3．学会失败。成功没有捷径，历史上有成就的人，总是敢于行动，也会经常失败。不要让对失败的恐惧，绊住你尝试新事物的脚步。　<br/>　　4．接受自己全然为人。失望、烦乱、悲伤是人性的一部分。接纳这些，并把它们当成自然之事，允许自己偶尔的失落和伤感。然后问问自己，能做些什么来让自己感觉好过一点。　<br/>　　5．简化生活。更多并不总代表更好，好事多了，也不一定有利。你选了太多的课吗？参加了太多的活动吗？应求精而不在多。　<br/>　　6．有规律地锻炼。体育运动是你生活中最重要的事情之一。每周只要3次，每次只要30分钟，就能大大改善你的身心健康。　<br/>　　7．睡眠。虽然有时"熬通宵"是不可避免的，但每天7到9小时的睡眠是一笔非常棒的投资。这样，在醒着的时候，你会更有效率、更有创造力，也会更开心。　<br/>　　8．慷慨。现在，你的钱包里可能没有太多钱，你也没有太多时间。但这并不意味着你无法助人。"给予"和"接受"是一件事的两个面。当我们帮助别人时，我们也在帮助自己；当我们帮助自己时，也是在间接地帮助他人。　<br/>　　9．勇敢。勇气并不是不恐惧，而是心怀恐惧，仍依然向前。　<br/>　　10。表达感激。生活中，不要把你的家人、朋友、健康、教育等这一切当成理所当然的。它们都是你回味无穷的礼物。记录他人的点滴恩惠，始终保持感恩之心。每天或至少每周一次，请你把它们记下来。　<br/>　　"上这门课，真是一种享受。它非常有趣，而且值得学生学习。"一位读经济学专业的本科生，在发给我们的邮件中写道。她还说：事实上，这门课并不会帮我拿攻读学位的学分。但比起其它课程，我更喜欢做这门课的作业。　<br/>　　在哈佛的校报上，也留下学生们的反馈意见：　<br/>　　"他教心理学，同其他心理学老师有很大的不同。他试图让你把这些理念，应用到自己的生活中去。""我从记'感恩簿'中收获最大，在那里，我每天写下我充满感激的事情。""上这门课之前，听到'冥想'这个词，我会不以为然。但是现在，我惊奇地发现，它真的让我在接下来的几个小时里，放松了。""我认识的每个上过这门课的人都说，这是他们在哈佛上过的最好的课。一位和我要好的女生说，它改变了她的生命，给了她一种看问题的不同视角，对幸福的理解，也改变了。"　<br/>　　甚至助教们也说，自打跟本－沙哈尔教授"幸福课"以来，一年中，身体出奇得好，心情也爽多了。"我改善了我的饮食、睡眠、人际关系，还有人生的方向感。这些对我来说，都是很重要的东西。"另一位助教称，这门课的出勤率，平均在95％以上。"它的奇妙之处在于，当学生们离开教室的时候，都迈着春天一样的步子。"　<br/>　　2006年2月，哈佛出了件大事，校长萨默斯为自己的惊人之语"女人先天不如男"，付出了"下课"的代价。即将去职的萨默斯闷闷不乐，他的好友找到本－沙哈尔，讨要如何让校长快乐起来的秘笈，本－沙哈尔慷慨支招。　<br/>　　首先，他现在可能很烦乱、失落、难过，这些都属正常，因为他也是人。去大胆地经历他现在正经历着的任何事，并且自然地接受下来。　<br/>　　第二，建议萨默斯本人，阅读一下哈佛积极心理学教授丹尼尔·吉尔波特的书，书中说：人类有非凡的克服令情绪失落事件的能力。事情并没有像他最初看起来的那么糟，即使是被逐出世界顶级大学的校长之位。　<br/>　　第三，他可以仔细反省一下作为哈佛校长的经历，回忆自己任期内的巅峰时刻，并用他所学到的东西，去寻找新的机会和用武之地。　<br/>　　假如上述办法仍不奏效的话，本－沙哈尔支了最后一招：我可以在我的课堂上，留下一个座位，校长先生<br/>Tags - <a href="http://zhoujin.com/tags/%25E5%2593%2588%25E4%25BD%259B/" rel="tag">哈佛</a> , <a href="http://zhoujin.com/tags/%25E5%25B9%25B8%25E7%25A6%258F%25E8%25AF%25BE/" rel="tag">幸福课</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/84/</link>
<title><![CDATA[Hibernate-核心接口]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[HIBERNATE]]></category>
<pubDate>Mon, 16 Jun 2008 03:06:31 +0000</pubDate> 
<guid>http://zhoujin.com/post/84/</guid> 
<description>
<![CDATA[ 
	Session 接口:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Session 接口对于Hibernate 开发人员来说是一个最重要的接口。然而在Hibernate 中，实例化的Session是一个轻量级的类，创建和销毁它都不会占用很多资源。这在实际项目中确实很重要，因为在客户程序中，可能会不断地创建以及销毁Session 对象，如果Session 的开销太大，会给系统带来不良影响。但值得注意的是Session 对象是非线程安全的，因此在你的设计中，最好是一个线程只创建一个Session对象。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Hibernate 的设计者的头脑中，他们将session看作介于数据连接与事务管理一种中间接口。我们可以将session想象成一个持久对象的缓冲区，Hibernate能检测到这些持久对象的改变，并及时刷新数据库。我们有时也称Session是一个持久层管理器，因为它包含这一些持久层相关的操作，诸如存储持久对象至数据库，以及从数据库从获得它们。请注意，Hibernate 的session不同于JSP应用中的HttpSession。当我们使用session这个术语时，我们指的是Hibernate 中的session，而我们以后会将HttpSesion 对象称为用户session。<br/><br/>SessionFactory 接口:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里用到了一个设计模式――工厂模式，用户程序从工厂类SessionFactory中取得Session 的实例。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;令你感到奇怪的是SessionFactory并不是轻量级的！实际上它的设计者的意图是让它能在整个应用中共享。典型地来说，一个项目通常只需要一个SessionFactory就够了，但是当你的项目要操作多个数据库时，那你必须为每个数据库指定一个SessionFactory。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SessionFactory在Hibernate中实际起到了一个缓冲区的作用，它缓冲了Hibernate自动生成的SQL语句和一些其它的映射数据，还缓冲了一些将来有可能重复利用的数据。 <br/><br/>Configuration 接口:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Configuration 接口的作用是对Hibernate 进行配置，以及对它进行启动。在Hibernate 的启动过程中，Configuration 类的实例首先定位映射文档的位置，读取这些配置，然后创建一个SessionFactory对象。虽然Configuration 接口在整个Hibernate 项目中只扮演着一个很小的角色，但它是启动hibernate 时你所遇到的每一个对象。<br/><br/>Transaction 接口:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transaction 接口是一个可选的API，你可以选择不使用这个接口，取而代之的是Hibernate 的设计者自己写的底层事务处理代码。 Transaction 接口是对实际事务实现的一个抽象，这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面，使得自己的项目可以在不同的环境和容器之间方便地移值。<br/><br/>Query 和Criteria接口 <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Query接口让你方便地对数据库及持久对象进行查询，它可以有两种表达方式：HQL语言或本地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量，并最终执行查询操作。Criteria接口与Query接口非常类似，它允许你创建并执行面向对象的标准化查询。值得注意的是Query接口也是轻量级的，它不能在Session之外使用。<br/><br/>Callback 接口:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当一些有用的事件发生时――例如持久对象的载入、存储、删除时，Callback 接口会通知 <br/>Hibernate去接收一个通知消息。一般而言，Callback接口在用户程序中并不是必须的，但你要在你 <br/>的项目中创建审计日志时，你可能会用到它。<br/><br/>策略接口:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate与某些其它开源软件不同的还有一点――高度的可扩展性，这通过它的内置策略机制来实现。当你感觉到Hibernate 的某些功能不足，或者有某些缺陷时，你可以开发一个自己的策略来替换它，而你所要做的仅仅只是继承它的某个策略接口，然后实现你的新策略就可以了，以下是 <br/>它的策略接口： <br/>· 主键的生成 (IdentifierGenerator 接口) <br/>· 本地SQL语言支持 (Dialect 抽象类) <br/>· 缓冲机制 (Cache 和CacheProvider 接口) <br/>· JDBC 连接管理 (ConnectionProvider接口) <br/>· 事务管理 (TransactionFactory, Transaction, 和 TransactionManagerLookup 接口) <br/>· ORM 策略 (ClassPersister 接口) <br/>· 属性访问策略 (PropertyAccessor 接口) <br/>· 代理对象的创建 (ProxyFactory接口) <br/>Hibernate为以上所列的机制分别创建了一个缺省的实现，因此如果你只是要增强它的某个策略的功能的话，只需简单地继承这个类就可以了，没有必要从头开始写代码。 <br/>Tags - <a href="http://zhoujin.com/tags/%25E6%258E%25A5%25E5%258F%25A3/" rel="tag">接口</a> , <a href="http://zhoujin.com/tags/hibernate/" rel="tag">hibernate</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/106/</link>
<title><![CDATA[Servlet和Filter的url匹配以及url-pattern详解]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[J2EE]]></category>
<pubDate>Fri, 13 Jun 2008 07:56:40 +0000</pubDate> 
<guid>http://zhoujin.com/post/106/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Servlet和filter是J2EE开发中常用的技术，使用方便，配置简单，老少皆宜。估计大多数朋友都是直接配置用，也没有关心过具体的细节，今天遇到一个问题，上网查了servlet的规范才发现，servlet和filter中的url-pattern还是有一些文章在里面的，总结了一些东西，放出来供大家参考，以免遇到问题又要浪费时间。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一，servlet容器对url的匹配过程：<br/>　&nbsp;&nbsp; 当一个请求发送到servlet容器的时候，容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url，比如我访问的是<a href="http://localhost/test/aaa.html" target="_blank">http://localhost/test/aaa.html</a>，我的应用上下文是test，容器会将<a href="http://localhost/test" target="_blank">http://localhost/test</a>去掉，剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的，而且当有一个servlet匹配成功以后，就不会去理会剩下的servlet了（filter不同，后文会提到）。其匹配规则和顺序如下：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">　　1. 精确路径匹配。例子：比如servletA 的url-pattern为 /test，servletB的url-pattern为 /* ，这个时候，如果我访问的url为<a href="http://localhost/test" target="_blank">http://localhost/test</a> ，这个时候容器就会先 进行精确路径匹配，发现/test正好被servletA精确匹配，那么就去调用servletA，也不会去理会其他的servlet了。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.最长路径匹配。例子：servletA的url-pattern为/test/*，而servletB的url-pattern为/test/a/*，此时访问<a href="http://localhost/test/a" target="_blank">http://localhost/test/a</a>时，容器会选择路径最长的servlet来匹配，也就是这里的servletB。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.扩展匹配，如果url最后一段包含扩展，容器将会根据扩展选择合适的servlet。例子：servletA的url-pattern：*.action<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.如果前面三条规则都没有找到一个servlet，容器会根据url选择对应的请求资源。如果应用定义了一个default servlet，则容器会将请求丢给default servlet（什么是default servlet？后面会讲）。</div></div><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据这个规则表，就能很清楚的知道servlet的匹配过程，所以定义servlet的时候也要考虑url-pattern的写法，以免出错。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对于filter，不会像servlet那样只匹配一个servlet，因为filter的集合是一个链，所以只会有处理的顺序不同，而不会出现只选择一个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;二，url-pattern详解<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在web.xml文件中，以下语法用于定义映射：<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content"> 1.以”/’开头和以”/*”结尾的是用来做路径映射的。<br/>2.以前缀”*.”开头的是用来做扩展映射的。<br/>3.“/” 是用来定义default servlet映射的。<br/>4.剩下的都是用来定义详细映射的。比如： /aa/bb/cc.action</div></div><br/>&nbsp;&nbsp;&nbsp;&nbsp; 所以，为什么定义”/*.action”这样一个看起来很正常的匹配会错？因为这个匹配即属于路径映射，也属于扩展映射，导致容器无法判断。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;【参考内容】Java&nbsp;&nbsp;Servlet 2.4 Specification<br/>Tags - <a href="http://zhoujin.com/tags/servlet/" rel="tag">servlet</a> , <a href="http://zhoujin.com/tags/filter/" rel="tag">filter</a> , <a href="http://zhoujin.com/tags/url-pattern/" rel="tag">url-pattern</a> , <a href="http://zhoujin.com/tags/%25E8%25A7%2584%25E5%2588%2599/" rel="tag">规则</a> , <a href="http://zhoujin.com/tags/%25E5%258C%25B9%25E9%2585%258D/" rel="tag">匹配</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/85/</link>
<title><![CDATA[[转]由毕设答辩看国内高等教育——出离愤怒！]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Fri, 13 Jun 2008 03:12:57 +0000</pubDate> 
<guid>http://zhoujin.com/post/85/</guid> 
<description>
<![CDATA[ 
	昨天的答辩与其说让我失望，不如说是让我愤怒，甚至出离愤怒，无以言谈！ <br/>回来后立马把QQ签名改成了：“所谓论文，论众家之言也。打磨创新，统一模式，归于中庸！”算是对学院本科毕设论文与答辩的一种反讽，也确是一种真实而无奈的写照。 <br/>任何有价值的个人见解都被否认的一文不值或搪塞为没有论据与先例。答辩过程中所谓“专家”的老师们，发表最多有建设性的见解就是论文格式不好，需要重新排版，或是按一般写作路程，第三、四章要结合系统实例，给出设计与代码。下面列举些经典的答辩问答如下： <br/><br/>专家：“论文不要中英文间杂，比如说Ruby on Rails，直接写Ruby在Rails中的应用就好了。” <br/><br/>专家：“你这个重构示例有什么量化指标吗？比如重构后代码行数减少了多少，怎么证明你的重构就更好？” <br/>学生：“重构主要是改善代码质量，使其更具可读性与易修改性，借由我文中谈到的具体手段找出代码中存在的坏味道，并逐步优化设计。因此，很难说行数越少就是越好的重构。” <br/>专家：“那你应该设计一个重构框架，让别人能有拿来就用的重构组件拿......” <br/><br/>专家：“你文中提到的参考文献是最优的解决方案，何以见得？” <br/>学生：“这篇文章是Oxford一个研究院在2007年8月公开发布的一个算法，被业界公认为现有的最优解。” <br/>专家：“07年8月到现在也快一年了，你怎么就知道这中间没有更好的研究成果发布？所以永远不要用最优这类绝对的说法！” <br/><br/>专家：“你这个论文写的比较边缘化，谈项目管理为什么不结合实例给出一个管理模型，并给出测量数据，说明这个模型到底是好是坏？” <br/>学生：“我在绪论中就说了,在软件开发中，每个人都使用他自己的模式来解析他在项目中的经验，每个人也往往成为这种常见错误的受害者，因此按进度做出成功的软件是世界上最困难的事情之一，不能完全依赖于公式，每一个软件都有其独特性，在软件开发的任何时刻，都需要特别的付出才行。这也是全文团队自管理的提出先决。所以我无法给出唯一模型。” <br/>专家：“你没明白我说的，我觉得你这篇文章不符合论文规范，没有写明应该怎么做，怎么验证，谈的都是你个人的见解。” <br/><br/>专家：“论文中不要出现全文、是什么等词，那样会显得很没水平。用词既不要文学化也不要通俗化，写的要有深度，让别人一下子看不懂、不能理解。” <br/><br/>所以，由于专家们根本没时间细看和理解你的论文，任何有新意的论点都是边缘化、危险的信号，因为那样根本就不能被一知半解，且以己之见度他人之心的专家们认可。最好的论文，就是依照专家们的指导和理解，规规矩矩的把专家看问题的角度和论点说清楚，不要加任何自己的创建与理解。同时严格按论文要求排版，写章节大纲，一点儿发挥的余地都不能有。 <br/>在我看来，如此的论文评审标准与自明代起沿袭数百年的八股作文无异，都要遵循固定的格式，破题、承题、起讲、入手步步不离，阐述圣人之道，稍作合众之意的评述就是好文。这真是国内高等教育的可悲！无数抄袭、综述之作，只因合乎众意，虽无甚创见却亦无大过，而被导师、专家们网开一面。而我却因为写了些有别传统的个人见解而被评定为“论文边缘化”，需大动干戈，增删五次方，可修为正果，顺利毕业。 <br/>想想自己这半年来的经历也确实丧气。原本心高气傲地打算利用在校的最后时间不受约束地为了理想而开发一款产品推出去运营下，因此义无反顾的辞掉了实习与几个工作offer，学期初就回到学校组建团队。最终因大家志向不同，而分道扬镳，项目流产。之后调整心情，专心论文，希望把自己带领团队的经验与体会融入文中，阐述自己对软件开发与团队管理的理解，也算对大学四年软件工程专业学习的诠释。然而一个月没日没夜的奋斗却换来如此结果，既是心有不甘又又无比愤慨。 <br/>相比美国的教育，人家一再强调独立与创新，MIT的算法导论第一节课上，Leiserson教授花了20多分钟专门说明课程要求与独立创新的重要。而我们在教学最重要的一环，毕设论文的评定与答辩上确是如此导向，实在令人寒心。 <br/>在这里不是因为个人私怨而愤世嫉俗，主要是这过程中有太多的不能理解与看不懂，让人不能不一吐为快。一篇论及软件开发团队管理的文章竟被软件工程专业的老师们一致认为偏离了专业主旨，那您在教学的过程中还安排这么多探讨管理项目的“边缘课程”又是何意？一个个仅扫了眼标题与目录，就敢对自己不曾设计领域而横加批评的专家们，还真以为自己无所不通了吧？那专家的名号也该换换，下次叫您们博古通今的大师好了。 <br/>算了，一时愤慨之言，也知道自己多说无益，国内高等教育的风气已然如此，没有选择继续进修硕士就已是自己看破体制现状的英明了，其他原本也没任何再可期望的了。 <br/>Tags - <a href="http://zhoujin.com/tags/%25E6%2595%2599%25E8%2582%25B2%25E5%258F%258D%25E6%2580%259D/" rel="tag">教育反思</a> , <a href="http://zhoujin.com/tags/%25E9%25A1%25B9%25E7%259B%25AE%25E7%25AE%25A1%25E7%2590%2586/" rel="tag">项目管理</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/99/</link>
<title><![CDATA[命令模式]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[设计模式]]></category>
<pubDate>Thu, 12 Jun 2008 07:48:21 +0000</pubDate> 
<guid>http://zhoujin.com/post/99/</guid> 
<description>
<![CDATA[ 
	命令模式主要包括几个角色 <br/>1.接受者角色（相当于厨师） <br/>2.请求者角色(相当于顾客) <br/>3.命令角色 <br/>4.具体命令角色 <br/>5.客户角色 <br/><br/>具体代码如: <br/><br/><div class="code">package com.pattern.command;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> *接受者（相当于厨师）&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public class Receiver &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void doReceiverAction()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;接受者执行完毕&quot;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.command;<br/>/**<br/> *接受者（相当于厨师）<br/> */<br/>public class Receiver &#123;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;public void doReceiverAction()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;接受者执行完毕&quot;);<br/>&nbsp;&nbsp;&#125;<br/><br/>&#125;<br/><br/><br/>package com.pattern.command;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> *命令角色&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public interface Command &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void execute();&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.command;<br/>/**<br/> *命令角色<br/> */<br/>public interface Command &#123;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;public void execute();<br/><br/>&#125;<br/><br/> <br/>package com.pattern.command;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>/**&nbsp;&nbsp;<br/> * 具体命令角色,调用接受者执行具体命令。自己不能执行具体命令，所以需要创建一个接受者对象&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public class CommandImpl implements Command&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private Receiver receiver;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public CommandImpl(Receiver receiver)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.receiver = receiver;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void execute()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;receiver.doReceiverAction();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.command;<br/><br/>/**<br/> * 具体命令角色,调用接受者执行具体命令。自己不能执行具体命令，所以需要创建一个接受者对象<br/> */<br/>public class CommandImpl implements Command&#123;<br/><br/>&nbsp;&nbsp;private Receiver receiver;<br/>&nbsp;&nbsp;public CommandImpl(Receiver receiver)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;this.receiver = receiver;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;public void execute()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;receiver.doReceiverAction();<br/>&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/><br/>package com.pattern.command;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> * 请求者角色，需要发出一个命令，所以需要创建一个命令角色的对象.(相当于顾客)&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public class ReqRole &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private Command command;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public ReqRole(Command command)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.command = command;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;&nbsp;void&nbsp;&nbsp;doAction()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;command.execute();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.command;<br/>/**<br/> * 请求者角色，需要发出一个命令，所以需要创建一个命令角色的对象.(相当于顾客)<br/> */<br/>public class ReqRole &#123;<br/><br/>&nbsp;&nbsp;private Command command;<br/>&nbsp;&nbsp;public ReqRole(Command command)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;this.command = command;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;public&nbsp;&nbsp;void&nbsp;&nbsp;doAction()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;command.execute();<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&#125;<br/><br/>package com.pattern.command;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> *客户角色&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public class Test &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String&#91;&#93; args)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Receiver receiver = new Receiver();//接受者。不和任何对象关联&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Command command = new CommandImpl(receiver);//构建一个命令角色。因为自己不执行任何命令，真正执行命令的是接受者，所以需要传递一个接受者对象&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReqRole reqRole = new ReqRole(command);//请求角色。因为需要请求一个命令，所以需要接受一个命令角色对象&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reqRole.doAction();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;</div><br/>Tags - <a href="http://zhoujin.com/tags/%25E5%2591%25BD%25E4%25BB%25A4%25E6%25A8%25A1%25E5%25BC%258F%25E8%25AE%25BE%25E8%25AE%25A1%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">命令模式设计模式</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/98/</link>
<title><![CDATA[缺省适配器模式和模板方法模式]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[设计模式]]></category>
<pubDate>Wed, 11 Jun 2008 07:47:39 +0000</pubDate> 
<guid>http://zhoujin.com/post/98/</guid> 
<description>
<![CDATA[ 
	缺省适配器模式和模板方法模式。 <br/><br/>缺省适配器模式：当一个接口有很都方法时，所有的实现类都需要实现该接口的所有方法。即使不需要的方法也需要空实现。这时就需要一个适配器类。该适配器类主要是实现该接口的所有方法（一般都空实现）。给真正的子类带来方便。 <br/><br/>模板方法模式:父类定义了几个方法。并规定了这几个方法的具体执行流程(哪个方法先执行，哪个方法后执行)，然后其子类实现这些方法。 <br/>Tags - <a href="http://zhoujin.com/tags/%25E7%25BC%25BA%25E7%259C%2581%25E9%2580%2582%25E9%2585%258D%25E5%2599%25A8%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">缺省适配器模式</a> , <a href="http://zhoujin.com/tags/%25E6%25A8%25A1%25E6%259D%25BF%25E6%2596%25B9%25E6%25B3%2595%25E6%25A8%25A1%25E5%25BC%258F%25E8%25AE%25BE%25E8%25AE%25A1%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">模板方法模式设计模式</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/97/</link>
<title><![CDATA[组合(Composite)模式]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[设计模式]]></category>
<pubDate>Tue, 10 Jun 2008 07:46:12 +0000</pubDate> 
<guid>http://zhoujin.com/post/97/</guid> 
<description>
<![CDATA[ 
	组合(Composite)模式主要角色： <br/>1.Component角色 <br/>2.Leaf角色 <br/>3.Composite角色 <br/><br/>Java代码 <br/><div class="code">package com.pattern.composite;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> * 组件抽象角色&nbsp;&nbsp;<br/> *&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public interface Component &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void run();&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.composite;<br/>/**<br/> * 组件抽象角色<br/> *<br/> */<br/>public interface Component &#123;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;public void run();<br/><br/>&#125;<br/><br/>package com.pattern.composite;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> * 叶子角色&nbsp;&nbsp;<br/> *&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public class Leaf implements Component&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void run()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot; run invoked...&quot;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.composite;<br/>/**<br/> * 叶子角色<br/> *<br/> */<br/>public class Leaf implements Component&#123;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;public void run()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot; run invoked...&quot;);<br/>&nbsp;&nbsp;&#125;<br/><br/>&#125;<br/> <br/>package com.pattern.composite;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>import java.util.ArrayList;&nbsp;&nbsp; <br/>import java.util.List;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> * 组合角色&nbsp;&nbsp;<br/> * 实现组件角色接口，并且添加，删除的也是组件角色&nbsp;&nbsp;<br/> *&nbsp;&nbsp; <br/> * Composite本来可以再包含Leaf和Composite的。而 Leaf和Composite 又都属于 Component，所以增加，删除 的是Component&nbsp;&nbsp;<br/> *&nbsp;&nbsp; <br/> * 组合模式主要分为2种&nbsp;&nbsp;<br/> *&nbsp;&nbsp; <br/> * 1 透明式&nbsp;&nbsp;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;添加Component对象的操作定义在Component角色中，这样的话不仅Composite需要实现这些方法，Leaf也需要实现这些方法，&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;而这些方法对于Leaf来说没有任何意义，不过将系统实现统一起来了，因此对用户来说透明（用户无需区分Composite还是Leaf）&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;，因为这些角色中都具备这些方法。&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp; 2 安全式&nbsp;&nbsp;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;添加Component对象的操作定义在Composite角色中，这样的话Leaf就无需实现这些方法（因为Leaf本身根本不需要实现这些方法）&nbsp;&nbsp;<br/> *&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public class Composite&nbsp;&nbsp;implements Component&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Component&gt; list = new ArrayList&lt;Component&gt;();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//添加&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void addComponent(Component component)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(component);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//删除&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void removeComponent(Component component)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.remove(component);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//get&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public List&lt;Component&gt; getAll()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return list;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void run()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(Component component : list)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component.run();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.composite;<br/><br/>import java.util.ArrayList;<br/>import java.util.List;<br/>/**<br/> * 组合角色<br/> * 实现组件角色接口，并且添加，删除的也是组件角色<br/> * <br/> * Composite本来可以再包含Leaf和Composite的。而 Leaf和Composite 又都属于 Component，所以增加，删除 的是Component<br/> * <br/> * 组合模式主要分为2种<br/> * <br/> * 1 透明式<br/><br/>&nbsp;&nbsp;添加Component对象的操作定义在Component角色中，这样的话不仅Composite需要实现这些方法，Leaf也需要实现这些方法，<br/>&nbsp;&nbsp;而这些方法对于Leaf来说没有任何意义，不过将系统实现统一起来了，因此对用户来说透明（用户无需区分Composite还是Leaf）<br/>&nbsp;&nbsp;，因为这些角色中都具备这些方法。<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp; 2 安全式<br/><br/>&nbsp;&nbsp;添加Component对象的操作定义在Composite角色中，这样的话Leaf就无需实现这些方法（因为Leaf本身根本不需要实现这些方法）<br/> *<br/> */<br/>public class Composite&nbsp;&nbsp;implements Component&#123;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;List&lt;Component&gt; list = new ArrayList&lt;Component&gt;();<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;//添加<br/>&nbsp;&nbsp;public void addComponent(Component component)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;list.add(component);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;//删除<br/>&nbsp;&nbsp;public void removeComponent(Component component)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;list.remove(component);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;//get<br/>&nbsp;&nbsp;public List&lt;Component&gt; getAll()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return list;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;public void run()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;for(Component component : list)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component.run();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125;<br/><br/>&#125;<br/><br/>package com.pattern.composite;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>public class Client &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String&#91;&#93; args)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Leaf leaf1 = new Leaf();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Leaf leaf2 = new Leaf();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Leaf leaf3 = new Leaf();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite composite = new Composite();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite.addComponent(leaf1);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite.addComponent(leaf2);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Composite composite1 = new Composite();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite1.addComponent(composite);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite1.addComponent(leaf3);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composite1.run();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp;</div><br/>Tags - <a href="http://zhoujin.com/tags/%25E7%25BB%2584%25E5%2590%2588%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">组合模式</a> , <a href="http://zhoujin.com/tags/composite/" rel="tag">composite</a> , <a href="http://zhoujin.com/tags/%25E8%25AE%25BE%25E8%25AE%25A1%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">设计模式</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/96/</link>
<title><![CDATA[适配器(Adapter)模式(包装模式)]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[设计模式]]></category>
<pubDate>Mon, 09 Jun 2008 07:42:57 +0000</pubDate> 
<guid>http://zhoujin.com/post/96/</guid> 
<description>
<![CDATA[ 
	适配器(Adapter)模式也叫包装模式，主要有两种实现形式: <br/>A:类适配器模式 <br/>B:对象适配器模式 <br/><br/>都有三种角色 <br/>1:Target:供客户端调用 <br/>2:Adaptee:具体调用角色 <br/>3:Adapter:包装角色 <br/><br/>A:类适配器模式 <br/><br/><div class="code">package com.pattern.adapter.classadapter;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> * 客户端要使用的目标类&nbsp;&nbsp;<br/> *&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public interface Target &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void method1();&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.adapter.classadapter;<br/>/**<br/> * 客户端要使用的目标类<br/> *<br/> */<br/>public interface Target &#123;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;public void method1();<br/><br/>&#125;<br/><br/>package com.pattern.adapter.classadapter;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>public class Adaptee &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void method2()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;执行...&quot;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.adapter.classadapter;<br/>public class Adaptee &#123;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;public void method2()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;执行...&quot;);<br/>&nbsp;&nbsp;&#125;<br/><br/>&#125;<br/><br/>package com.pattern.adapter.classadapter;&nbsp;&nbsp; <br/>//继承Adaptee类&nbsp;&nbsp; <br/>public class Adapter extends Adaptee implements Target &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//包装类&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void method1() &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.method2();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.adapter.classadapter;<br/>//继承Adaptee类<br/>public class Adapter extends Adaptee implements Target &#123;<br/><br/>&nbsp;&nbsp;//包装类<br/>&nbsp;&nbsp;public void method1() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;this.method2();<br/>&nbsp;&nbsp;&#125;<br/><br/>&#125;<br/>package com.pattern.adapter.classadapter;&nbsp;&nbsp; <br/>//适配器模式也叫包装模式&nbsp;&nbsp; <br/>public class Client &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//类适配器模式&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String&#91;&#93; args)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Target target = new Adapter();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target.method1();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.adapter.classadapter;<br/>//适配器模式也叫包装模式<br/>public class Client &#123;<br/>&nbsp;&nbsp;//类适配器模式<br/>&nbsp;&nbsp;public static void main(String&#91;&#93; args)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;Target target = new Adapter();<br/>&nbsp;&nbsp;&nbsp;&nbsp;target.method1();<br/>&nbsp;&nbsp;&#125;<br/><br/>&#125;<br/></div><br/><br/>B:对象适配器模式 <br/><div class="code"><br/>package com.pattern.adapter.objectadapter;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> * 客户端要使用的目标类&nbsp;&nbsp;<br/> *&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public interface Target &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void method1();&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.adapter.objectadapter;<br/>/**<br/> * 客户端要使用的目标类<br/> *<br/> */<br/>public interface Target &#123;<br/>&nbsp;&nbsp;public void method1();<br/>&#125;<br/><br/>package com.pattern.adapter.objectadapter;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>public class Adaptee &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void method2()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;执行...&quot;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.adapter.objectadapter;<br/><br/>public class Adaptee &#123;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;public void method2()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;执行...&quot;);<br/>&nbsp;&nbsp;&#125;<br/><br/>&#125;<br/> <br/>package com.pattern.adapter.objectadapter;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>//不继承Adaptee类&nbsp;&nbsp; <br/>public class Adapter implements Target &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private Adaptee adaptee ;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public Adapter(Adaptee adaptee)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.adaptee = adaptee;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void method1() &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;adaptee.method2();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/><br/>package com.pattern.adapter.objectadapter;<br/><br/>//不继承Adaptee类<br/>public class Adapter implements Target &#123;<br/><br/>&nbsp;&nbsp;private Adaptee adaptee ;<br/>&nbsp;&nbsp;public Adapter(Adaptee adaptee)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;this.adaptee = adaptee;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;public void method1() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;adaptee.method2();<br/>&nbsp;&nbsp;&#125;<br/><br/>&#125;<br/>package com.pattern.adapter.objectadapter;&nbsp;&nbsp; <br/>//适配器模式也叫包装模式&nbsp;&nbsp; <br/>public class Client &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//对象适配器模式&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String&#91;&#93; args)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Target target = new Adapter(new Adaptee());&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target.method1();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;</div><br/>Tags - <a href="http://zhoujin.com/tags/%25E9%2580%2582%25E9%2585%258D%25E5%2599%25A8/" rel="tag">适配器</a> , <a href="http://zhoujin.com/tags/adapter/" rel="tag">adapter</a> , <a href="http://zhoujin.com/tags/%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">模式</a> , <a href="http://zhoujin.com/tags/%25E5%258C%2585%25E8%25A3%2585%25E6%25A8%25A1%25E5%25BC%258F%25E8%25AE%25BE%25E8%25AE%25A1%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">包装模式设计模式</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/91/</link>
<title><![CDATA[CSS2.0的box模型]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[CSS]]></category>
<pubDate>Sat, 07 Jun 2008 16:38:31 +0000</pubDate> 
<guid>http://zhoujin.com/post/91/</guid> 
<description>
<![CDATA[ 
	<div align="center" style="text-align: center"><img style="width: 360px; height: 270px" src="attachment.php?fid=2" border="0" width="360" height="270" /></div><br /> <ul><li><strong>Content </strong>-实际显示文本或图片的区域，其宽度由css的width定义。 </li><li><strong>Padding </strong>-环绕Content的区域，通过padding-top, padding-right, padding-bottom, padding-left 和padding等属性来进行设定。 </li><li><strong>Border </strong>-环绕padding的区域，通过border-top, border-right, border-bottom, border-left 和border 等属性来进行设定。 </li><li><strong>Margin </strong>-环绕Border的区域，通过margin-top, margin-right, margin-bottom, margin-left 和margin 等属性来进行设定。</li></ul><br />　　整个box的宽度= margin-left + border-left-width + padding-left + width + padding-right + border-right-width + margin-right<br /><p></p><a name="more" title="more"></a><p>　　ms IE5误解了width的含义，结果把width定义成了content+border的宽度之和。下列两行的定义显示是相同： </p><ul><li><strong>CSS 2.0</strong>width: 100px; padding: 10px; border: 10px </li><li><strong>IE 5</strong>width: 140px; padding: 10px; border: 10px</li></ul>IE6虽然改正了这个错误，则需要通过正确的Doctype来指定浏览器的显示模式。 <p></p><p>　　Eric Meyer在她的&quot;CSS 2.0 Programer's Reference&quot;一书中，更为详细地画出了box模型结构图。<img style="width: 626px; height: 457px" src="attachment.php?fid=3" border="0" width="626" height="457" align="middle" /><br /></p><p>参考文献：</p><ol><li><a href="http://jessey.net/simon/articles/003.html"><span style="color: #003366">CSS Box Model</span></a><br /></li><li><a href="http://hedong.3322.org/newblog/archives/docs/css20programer.pdf"><span style="color: #003366">Eric Meyer, CSS 2.0 Programer's Reference<br /></span><li><a href="http://www.positioniseverything.net/articles/box-model.html">The Box Model Problem</a></li></a></li><li><a href="http://www.positioniseverything.net/articles/box-model.html">The Box Model Problem</a></li></ol><br/>Tags - <a href="http://zhoujin.com/tags/css/" rel="tag">css</a> , <a href="http://zhoujin.com/tags/box/" rel="tag">box</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/83/</link>
<title><![CDATA[一段女生写的C语言代码]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Fri, 06 Jun 2008 02:32:00 +0000</pubDate> 
<guid>http://zhoujin.com/post/83/</guid> 
<description>
<![CDATA[ 
	今天看到一邮件列表中的东西，特转发一下！<br/><br/>我是个孤独的幽灵，如此苍白和落寞。永远没有自己的生活方式，一只在空气中苦苦挣扎的鱼... <br/>#include "stdio.h" <br/>#include "stdlib.h" <br/>result love(boy, girl) &#123; <br/>　　if ( boy.有房() and boy.有车()) &#123; <br/>　　　　boy.set(nothing); <br/>　　　　return girl.嫁给(boy); <br/>　　&#125;<br/>　　if ( girl.愿意等()) &#123; <br/>　　　while( ! (boy.赚钱 ＞ 100,000 and girl.感情> 8 ) ) &#123; <br/>　　　　for ( day=1; day ＜=365; day++) &#123; <br/>　　　　　if ( day == 情人节 ) <br/>　　　　　if ( boy.givegirl(玫瑰)) <br/>　　　　　　girl.感情++; <br/>　　　　　　else <br/>　　　　　　　girl.感情--; <br/>　　　　　 if( day == girl.生日) <br/>　　　　　&nbsp;&nbsp;&nbsp;&nbsp;if ( boy.givegirl(玫瑰) ) <br/>　　　　　　　　girl.感情++; <br/>　　　　　　　　else <br/>　　　　　　　　girl.感情--; <br/><br/>　　　　　　boy.拼命赚钱(); <br/>　　　　　 &#125; <br/>　　　　 &#125; <br/>　　　　if ( boy.有房() and boy.有车() ) &#123; <br/>　　 boy.set(nothing); <br/>　return girl.嫁给(boy); <br/>　&#125; <br/>　　　年龄++; <br/>　　　girl.感情--; <br/>　　 &#125; <br/>　　return girl.goto( another_boy); <br/>&#125;<br/>Tags - <a href="http://zhoujin.com/tags/c/" rel="tag">c</a> , <a href="http://zhoujin.com/tags/%25E5%25A5%25B3%25E7%2594%259F/" rel="tag">女生</a> , <a href="http://zhoujin.com/tags/%25E6%2584%259F%25E6%2583%2585/" rel="tag">感情</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/95/</link>
<title><![CDATA[装饰(Decorator)模式]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[设计模式]]></category>
<pubDate>Thu, 05 Jun 2008 07:37:30 +0000</pubDate> 
<guid>http://zhoujin.com/post/95/</guid> 
<description>
<![CDATA[ 
	装饰(Decorator)模式:也叫包装模式，Adaptor模式也可以叫包装模式，不过有本质的区别，Adaptor模式没有使原有功能增强 <br/>Decorator模式使原有功能增强，而且不是通过子类来实现功能增强的。 <br/><br/>装饰模式主要特色： <br/>1.用来扩展特定对象的功能，不是扩充某个类的功能。 <br/>2.不需要子类，防止由于子类而导致的复杂和混乱 <br/>3.对于一个给定的对象，同事可能有不同的装饰对象，客户端可以通过它的需要选择合适的装饰对象 <br/><br/>java.io包下类大量使用到装饰模式。 <br/><br/>装饰模式主要角色 <br/>1.抽象构件角色:给出一个抽象接口，以规范准备接受附加责任的对象 <br/>2.具体构件角色:定义一个将要接收附加责任的类 <br/>3.装饰角色：持有一个构件对象的实例，并定义一个与抽象构件接口一致的接口 <br/>4.具体装饰角色:负责给构件对象"贴上"附加的责任 <br/>Java代码<br/><div class="code">package com.pattern.decorator;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> * 抽象构件角色&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public interface Component &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void doSomething();&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp;</div><br/><div class="code">package com.pattern.decorator;<br/>/**<br/> * 抽象构件角色<br/> */<br/>public interface Component &#123;<br/><br/>&nbsp;&nbsp;public void doSomething();<br/>&#125;</div><br/><div class="code">package com.pattern.decorator;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> * 具体构件角色&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public class ConcreteComponent implements Component &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void doSomething() &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;功能A&quot;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;</div><br/><div class="code">package com.pattern.decorator;<br/>/**<br/> * 具体构件角色<br/> */<br/>public class ConcreteComponent implements Component &#123;<br/><br/>&nbsp;&nbsp;public void doSomething() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;功能A&quot;);<br/>&nbsp;&nbsp;&#125;<br/><br/>&#125;</div><br/><div class="code">package com.pattern.decorator;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> * 装饰角色&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public class Decorator implements Component &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//拥有一个抽象构件对象&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private Component component;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public Decorator(Component component)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.component = component;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void doSomething() &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component.doSomething();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;</div><br/><div class="code">package com.pattern.decorator;<br/>/**<br/> * 装饰角色<br/> */<br/>public class Decorator implements Component &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;//拥有一个抽象构件对象<br/>&nbsp;&nbsp;private Component component;<br/>&nbsp;&nbsp;public Decorator(Component component)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;this.component = component;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;public void doSomething() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;component.doSomething();<br/>&nbsp;&nbsp;&#125;<br/><br/>&#125;</div><br/><br/><div class="code">package com.pattern.decorator;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> * 具体装饰角色一&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public class ConcreteDecorator1 extends Decorator &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public ConcreteDecorator1(Component component)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(component);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void doSomething()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.doSomething();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.doAnotherthing();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private void doAnotherthing()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;功能B&quot;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp;</div><br/><br/><div class="code">package com.pattern.decorator;<br/>/**<br/> * 具体装饰角色一<br/> */<br/>public class ConcreteDecorator1 extends Decorator &#123;<br/><br/>&nbsp;&nbsp;public ConcreteDecorator1(Component component)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;super(component);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;public void doSomething()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;super.doSomething();<br/>&nbsp;&nbsp;&nbsp;&nbsp;this.doAnotherthing();<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;private void doAnotherthing()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;功能B&quot;);<br/>&nbsp;&nbsp;&#125;<br/>&#125;</div><br/><div class="code">package com.pattern.decorator;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> * 具体装饰角色二&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public class ConcreteDecorator2 extends Decorator &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public ConcreteDecorator2(Component component)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super(component);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void doSomething()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.doSomething();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.doAnotherthing();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;private void doAnotherthing()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;功能C&quot;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp;</div><br/><div class="code">package com.pattern.decorator;<br/>/**<br/> * 具体装饰角色二<br/> */<br/>public class ConcreteDecorator2 extends Decorator &#123;<br/><br/>&nbsp;&nbsp;public ConcreteDecorator2(Component component)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;super(component);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;public void doSomething()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;super.doSomething();<br/>&nbsp;&nbsp;&nbsp;&nbsp;this.doAnotherthing();<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;private void doAnotherthing()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;功能C&quot;);<br/>&nbsp;&nbsp;&#125;<br/>&#125;</div><br/><div class="code">package com.pattern.decorator;&nbsp;&nbsp; <br/>/**&nbsp;&nbsp;<br/> * 客户端&nbsp;&nbsp;<br/> */&nbsp;&nbsp;<br/>public class Client &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String&#91;&#93; args)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp; //扩充了component 对象的功能。&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Component component = new ConcreteDecorator2(new ConcreteDecorator1(new ConcreteComponent()));&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;component.doSomething();&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125; </div><br/>Tags - <a href="http://zhoujin.com/tags/%25E8%25A3%2585%25E9%25A5%25B0%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">装饰模式</a> , <a href="http://zhoujin.com/tags/decorator/" rel="tag">decorator</a> , <a href="http://zhoujin.com/tags/%25E8%25AE%25BE%25E8%25AE%25A1%25E6%25A8%25A1%25E5%25BC%258F/" rel="tag">设计模式</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/82/</link>
<title><![CDATA[buffalo使用问题集锦]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[BUFFALO]]></category>
<pubDate>Tue, 03 Jun 2008 08:27:50 +0000</pubDate> 
<guid>http://zhoujin.com/post/82/</guid> 
<description>
<![CDATA[ 
	1.提交数组问题<br/><div class="code">var int1=document.getElementsByName(&quot;a&quot;); </div><br/>页面用js封装成array,后台用String[]接收.<br/>2.解决传递web页面多个表单<br/>当增加一条数据时。获取前台页面表单值。如果有很N个。。 <br/><br/><div class="code">&lt;form id=&quot;addForm&quot; &gt; <br/>&lt;input id=&quot;add.name&quot; &gt; <br/>&lt;input id=&quot;add.address&quot;&gt; <br/>&lt;input id=&quot;add.tel&quot;&gt;。。。。。。N个。 <br/>&lt;/form&gt; </div><br/>做法。 <br/><br/><div class="code">var addObj = &#123;&#125;; <br/>addObj&#91;Buffalo.BOCLASS&#93;=&quot;com.ptn.opera.domain.user.User&quot;; </div><br/><br/>接下来对以对传递对象的方式处理页面上的所有表单的参数 <br/><br/><div class="code">FormUtil.formToObject(&quot;addForm&quot;,addObj,&quot;add&quot;); </div><br/>之后利于 <br/><br/><div class="code">buffalo.remoteCall(&quot;userService.addUsers&quot;, &#91;addObj&#93;, function(reply)&#123; <br/>if (reply.isFault()) &#123; <br/>alert(reply.getResult()); <br/>&#125; else &#123; <br/>alert(reply.getResult()); <br/>&#125; <br/>&#125;); </div><br/><br/><br/>对方法 FormUtil。formToObject代码 如下。 <br/><br/>对于其中的("jType")实际出现在 <br/><div class="code">&lt;input id=&quot;add.id&quot; jtpye=&quot;int&quot; &gt;</div>对表单值类型转换 <br/><br/><div class="code"><br/>FormUtil.formToObject = function(formId, obj, objName) &#123; <br/>var formObj = document.getElementById(formId); <br/>var elements = formObj.elements; <br/>for (var i=0; i&lt;elements.length; i++) &#123; <br/>var elemName = elements&#91;i&#93;.name; <br/>if (elemName.indexOf(objName) != 0) &#123; <br/>continue; <br/>&#125; <br/>elemName = elemName.substring(objName.length + 1); <br/>var jType = elements&#91;i&#93;.getAttribute(&quot;jType&quot;); <br/>if (jType != null) &#123; <br/>if (jType == &quot;int&quot;) &#123; <br/>obj&#91;elemName&#93; = parseInt(elements&#91;i&#93;.value); <br/>&#125; else if (jType == &quot;Date&quot; &amp;&amp; elements&#91;i&#93;.value != &quot;&quot;) &#123; <br/>var d = &#123;&#125;; <br/>d&#91;Buffalo.BOCLASS&#93; = &quot;java.sql.Timestamp&quot;; <br/>var dateValue = elements&#91;i&#93;.value; <br/>var year = dateValue.substring(0,4); <br/>var monthDay = dateValue.substring(5, 10); <br/>var hhmmss = dateValue.substring(10); <br/>dateValue = monthDay + &quot;-&quot; + year + hhmmss; <br/>alert(dateValue); <br/>var dateTime = new Date(dateValue); <br/>//var dateTime = new Date(&quot;01-26-2007 23:21:20&quot;); <br/>dateTime.setHours(dateTime.getHours() - 8); <br/>d&#91;&quot;value&quot;&#93; = dateTime; <br/>obj&#91;elemName&#93; = d; <br/>&#125; <br/>&#125; else &#123; <br/>obj&#91;elemName&#93; = elements&#91;i&#93;.value; <br/>&#125; <br/>&#125; <br/>&#125; </div><br/>Tags - <a href="http://zhoujin.com/tags/buffalo/" rel="tag">buffalo</a> , <a href="http://zhoujin.com/tags/ajax/" rel="tag">ajax</a> , <a href="http://zhoujin.com/tags/%25E9%2597%25AE%25E9%25A2%2598/" rel="tag">问题</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/81/</link>
<title><![CDATA[buffalo与spring集成]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[BUFFALO]]></category>
<pubDate>Tue, 03 Jun 2008 08:07:01 +0000</pubDate> 
<guid>http://zhoujin.com/post/81/</guid> 
<description>
<![CDATA[ 
	只要把spring中的一个bean,如下：<br/><br/><div class="code">&lt;bean name=&quot;simpleService&quot; class=&quot;net.buffalo.demo.simple.SimpleService&quot;&gt;&lt;/bean&gt;</div><br/>然后再在spring相关配置文件中加入如下配置：<br/><br/><div class="code">&lt;bean name=&quot;buffaloConfigBean&quot; class=&quot;net.buffalo.service.BuffaloServiceConfigurer&quot;&gt;<br/>　　&lt;property name=&quot;services&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;map&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;entry key=&quot;springSimpleService&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;ref bean=&quot;simpleService&quot;/&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/entry&gt;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/map&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;<br/>&lt;/bean&gt;</div><br/>另外，官方版本只支持spring启动方式为：<br/><div class="code">org.springframework.web.context.ContextLoaderServlet</div>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/77/</link>
<title><![CDATA[智慧与人品 — 周国平]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Sat, 31 May 2008 04:33:00 +0000</pubDate> 
<guid>http://zhoujin.com/post/77/</guid> 
<description>
<![CDATA[ 
	　　我相信，骄傲是和才能成正比的。但是，正如大才朴实无华，小才华而不实一样，大骄傲往往谦逊平和，只有小骄傲才露出一副不可一世的傲慢脸相。有巨大优越感的人，必定也有包容万物、宽待众生的胸怀。<br/><br/>　　文明之对于不同的人，往往进入其不同的心理层次。进入意识层次，只是学问；进入无意识层次，才是教养。<br/><br/>　　有两种人最不会陷入琐屑的烦恼,最能够看轻外在的得失.他们似是两个极端：自信者和厌世者。前者知道自己的价值，后者知道世界的无价值。<br/><br/>　　狂妄者往往有点才气，但无知，因无知而不能正确估量自己这一点才气。这是少年人易犯的毛病，阅历常能把它治愈。<br/><br/>　　傲慢者却多半是些毫无才气的家伙，不但无知，而且无礼，没有教养。这差不多是一种人格上的缺陷，极难纠正。<br/><br/>　　真正相信自己的人是很少的，有些人的自信不过是一种“有益的盲目”，似乎下意识地知道自己内心的空虚，避免去看透自己，以维持虚假的充实。真正的自信者必是有勇气正视自己的人，而这样的自信也必定和对<br/><br/>　　自己的怀疑及不满有着内在的联系。这种人的自信必须靠自己去争得。事实上，几乎所有伟大的天才都并非天性自信的人，相反倒有几分自卑，他们知道自己的弱点，为这弱点而苦恼，不肯毁于这弱点，于是奋起自强，反而有了令一般人吃惊的业绩。<br/><br/>　　我相信，天才骨子里都有一点自卑，成功的强者内心深处往往埋着一段屈辱的经历。<br/>Tags - <a href="http://zhoujin.com/tags/%25E6%2588%2590%25E5%258A%259F/" rel="tag">成功</a> , <a href="http://zhoujin.com/tags/%25E5%25BC%25BA%25E8%2580%2585/" rel="tag">强者</a> , <a href="http://zhoujin.com/tags/%25E5%2586%2585%25E5%25BF%2583/" rel="tag">内心</a> , <a href="http://zhoujin.com/tags/%25E5%25B1%2588%25E8%25BE%25B1/" rel="tag">屈辱</a> , <a href="http://zhoujin.com/tags/%25E8%2587%25AA%25E4%25BF%25A1/" rel="tag">自信</a> , <a href="http://zhoujin.com/tags/%25E5%25A4%25A9%25E6%2589%258D/" rel="tag">天才</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/90/</link>
<title><![CDATA[[转]马云经典语录！]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Wed, 28 May 2008 02:44:25 +0000</pubDate> 
<guid>http://zhoujin.com/post/90/</guid> 
<description>
<![CDATA[ 
	在中国互联网的发展中，不能不提及马云。马云以良好的口碑和卓越的领导才能赢得了广大站长的尊敬和拥护，现整理收集一些马云在《赢在中国》中的经典语录，想必对很多人特别是创业者有一定的指导借鉴意义。 <br/><br/>1 ：这世界上没有优秀的理念，只有脚踏实地的结果。 <br/>2 ：有时候死扛下去总是会有机会的。 <br/>3 ：建立自我、追求忘我。 <br/>4 ：天不怕，地不怕，就怕CFO当CEO。 <br/>5 ：永远要相信边上的人比你聪明。 <br/>6 ：五年以后还想创业，你再创业。 <br/>7 ：上当不是别人太狡猾，而是自己太贪，是因为自己才会上当。 <br/>8 ：其实很多人的问题是因为他们回答的全是对的。 <br/>9 ：一个一流的创意，三流的执行，我宁可喜欢一个一流的执行，三流的创意。 <br/>10：蒙牛不是策划出来的，而是踏踏实实的产品、服务和体系做出来的。 <br/>11：最优秀的模式往往是最简单的东西。 <br/>12：要少开店、开好店，店不在于多，而在于精。 <br/>13：创业者书读得不多没关系，就怕不在社会上读书。 <br/>14：在今天的商场上已经没有秘密了，秘密不是你的核心竞争力。 <br/>15：很多人失败的原因不是钱太少，而是钱太多。 <br/>16：概念到今天这个时代已经不能卖钱了。 <br/>17：创业者光有激情和创新是不够的，它需要很好的体系、制度、团队以及良好的盈利模式。 <br/>18：这个世界不是因为你能做什么，而是你该做什么。 <br/>19：你的项目感觉是一个生意，不是一个独特的企业。 <br/>20：建一个公司的时候要考虑有好的价值才卖。如果一开始想到卖，你的路可能就走偏掉。 <br/>21：人要有专注的东西，人一辈子走下去挑战会更多，你天天换，我就怕了你。 <br/>22：要找风险投资的时候，必须跟风险投资共担风险，你拿到的可能性会更大。 <br/>23：记住，关系特别不可靠，做生意不能凭关系，做生意也不能凭小聪明。 <br/>24：不要贪多，做精做透很重要，碰到一个强大的对手或者榜样的时候，你应该做的不是去挑战它，而是去弥补它。 <br/>25：赚钱模式越多越说明你没有模式。 <br/>26：一个好的东西往往是说不清楚的，说得清楚的往往不是好东西。 <br/>27：如果你看了很多书，千万别告诉别人，告诉别人别人就会不断考你。 <br/>28：做战略最忌讳的是面面俱到，一定要记住重点突破，所有的资源在一点突破，才有可能赢。 <br/>29：小企业有大的胸怀，大企业要讲细节的东西。 <br/>30：做企业不是做侠客。 <br/>31：所有的创业者应该多花点时间，去学习别人是怎么失败的。 <br/>32：关注对手是战略中很重要的一部分，但这并不意味着你会赢。 <br/>33：战略不能落实到结果和目标上面，都是空话。 <br/>34：绝大部分创业者从微观推向宏观，通过发现一部分人的需求，然后向一群人推起来。 <br/>35：不管你拥有多少资源，永远把对手想得强大一点。 <br/>36：80年代的人不要跟70年代，跟60年代的人竞争，而是要跟未来，跟90年代的人竞争，这样你才有赢的可能性。 <br/>37：商业计划绝对不是一个销售计划，里面有无数细节，无数人才的运营。 <br/>38：战略有很多意义，小公司的战略简单一点，就是活着，活着最重要。 <br/>39：必须先去了解市场和客户的需求，然后再去找相关的技术解决方案，这样成功的可能性才会更大。 <br/>40：最核心的问题是根据市场去制定你的产品，关键是要倾听客户的声音。 <br/>41：免费是世界上最昂贵的东西。所以尽量不要免费。等你有了钱以后再考虑免费。 <br/>42：“营销”这两个字强调既要追求结果，也要注重过程，既要“销”，更要“营”。 <br/>43：诚信绝对不是一种销售，更不是一种高深空洞的理念，它是实实在在的言出必行、点点滴滴的细节。 <br/>44：公关是个副产品，由于你解决了以后会逐渐传出去，这才是最好的公关。 <br/>45：短暂的激情是不值钱的，只有持久的激情才是赚钱的。 <br/>46：聪明是智慧者的天敌，傻瓜用嘴讲话，聪明的人用脑袋讲话，智慧的人用心讲话。 <br/>47：永远要把对手想得非常强大，哪怕非常弱小，你也要把他想得非常强大。 <br/>48：我自己不愿意聘用一个经常在竞争者之间跳跃的人。 <br/>49：多花点时间在你的其他员工身上。 <br/>50：什么是团队呢?团队就是不要让另外一个人失败，不要让团队任何一个人失败。 <br/>51：把你太太当合作伙伴，不要把她当太太看。 <br/>52：有时候学历很高不一定把自己沉得下来做事情。 <br/>53：创业时期千万不要找明星团队，千万不要找已经成功过的人。创业要找最适合的人，不要找最好的人。 <br/>54：最大的挑战和突破在于用人，而用人最大的突破在于信任人。 <br/>55：什么都想自己干，这个世界上你干不完。 <br/>56：每一笔生意必须挣钱，免费不是一个好策略，它付出的代价会非常大。 <br/>57：领导力在顺境的时候，每个人都能出来，只有在逆境的时候才是真正的领导力。 <br/>58：碰到灾难第一个想到的是你的客户，第二想到你的员工，其他才是想对手。 <br/>59：永远记住每次成功都可能导致你的失败，每次失败好好接受教训，也许就会走向成功。 <br/>60：暴躁在某种程度上讲是因为有不安全感，或者是自己没有开放的心态。 <br/>61：可能一个人说你不服气，两个人说你不服气，很多人在说的时候，你要反省，一定是自己出了一些问题。 <br/>62：一个成功的创业者，三个因素，眼光、胸怀和实力。 <br/>63：别人可以拷贝我的模式，不能拷贝我的苦难，不能拷贝我不断往前的激情。 <br/>64：80年代的人还需要摔打，不管做任何事，要检查主观原因。 <br/>65：做小了，一定要做到独特。 <br/>66：人永远不要忘记自己第一天的梦想，你的梦想是世界上最伟大的事情，就是帮助别人成功。 <br/>67：不想当将军的士兵不是好士兵，但是一个当不好士兵的将军一定不是好将。 <br/>68：小公司的战略就是两个词：活下来，挣钱。 <br/>69：生存下来的第一个想法是做好，而不是做大。 <br/>70：《赢在中国》没有失败者，只有幸运者。 <br/>71：有结果未必是成功，但是没有结果一定是失败。 <br/>72：永远把别人对你的批评记在心里，别人的表扬，就把它忘了。 <br/>73：权威是你把权给别人的时候，你才能有真正的权利，你懂得倾听、懂得尊重，承担责任的时候，别人一定会听你，你才会有权威。 <br/>Tags - <a href="http://zhoujin.com/tags/%25E9%25A9%25AC%25E4%25BA%2591/" rel="tag">马云</a> , <a href="http://zhoujin.com/tags/%25E8%25AF%25AD%25E5%25BD%2595/" rel="tag">语录</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/73/</link>
<title><![CDATA[闲人]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Sun, 25 May 2008 10:44:55 +0000</pubDate> 
<guid>http://zhoujin.com/post/73/</guid> 
<description>
<![CDATA[ 
	不过是个喜欢简单生活的闲人，不经意就走进了网络， <br />不小心就沉迷于泡泡的美丽景致当中， <br />喜欢穿梭于网络的感觉，是得是失已经不是三言两语就说得清楚的， <br />只是，从不想否认在网络中的快乐还是多过苦恼， <br />更不想否认其实充实的感觉还是多过空虚&hellip;&hellip; <br />生活中无奈已有太多，就把论坛当作是自己的家， <br />开心也好，烦恼也好， <br />这份来之不易的缘更要好好珍惜！！<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%2597%25B2%25E4%25BA%25BA/" rel="tag">闲人</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/103/</link>
<title><![CDATA[javascript---类的继承]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[JAVASCRIPT]]></category>
<pubDate>Fri, 16 May 2008 08:07:46 +0000</pubDate> 
<guid>http://zhoujin.com/post/103/</guid> 
<description>
<![CDATA[ 
	1.<span style="color: #FF0000;">第一种方式,冒充对象的方式.(利用js里的每一个方法名都是一个Function对象) </span><br/><div class="code">//第一种方式,冒充对象的方式.(利用js里的每一个方法名都是一个Function对象)&nbsp;&nbsp; <br/>function Parent(username)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.username = username;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.say = function()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.username);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp;&nbsp;&nbsp; <br/>function Child(username,password)&#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.temp = Parent;//temp指向Parent所指向的地方 。 利用js里的每一个方法名都是一个Function对象,指向一个方法。&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.temp(username);//初始化方法里的内容&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;delete this.temp;//temp没有用了。可以直接删除掉.this不可以丢了&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//Parent(username);//这样写表面看起来是正确的，其实是错误的。因为只有new出来的对象才有this,所以调用Parent里的this就没有值了&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.password = password;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.hello = function()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.password);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>var parent = new Parent(&quot;zhangsan&quot;);&nbsp;&nbsp; <br/>parent.say();//zhangsan <br/>&nbsp;&nbsp;<br/>var child = new Child(&quot;lisi&quot;,&quot;123456&quot;);&nbsp;&nbsp; <br/>child.say();//lisi&nbsp;&nbsp; <br/>child.hello();//123456 </div><br/>2.<span style="color: #FF0000;">第二种方式：call()函数方式 </span>//call()函数是Function对象的一个函数&nbsp;&nbsp; <br/>//具体用法如&nbsp;&nbsp; <br/><div class="code">function test(str)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(this.username + &quot;,&quot;&nbsp;&nbsp;+ str);&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var o = new Object();&nbsp;&nbsp; <br/>o.username = &quot;zhangsan&quot;;&nbsp;&nbsp; <br/>test.call(o,&quot;123456&quot;);//zhangsan,123456 .因为每个Function 对象都有一个call()方法，而函数名就是一个Function对象.call()函数的第一个参数是test函数里的this.&nbsp;&nbsp;<br/><br/>//call()函数是Function对象的一个函数<br/>//具体用法如 <br/>function test(str)&#123;<br/>&nbsp;&nbsp;alert(this.username + &quot;,&quot;&nbsp;&nbsp;+ str);<br/>&#125;<br/><br/>var o = new Object();<br/>o.username = &quot;zhangsan&quot;;<br/>test.call(o,&quot;123456&quot;);//zhangsan,123456 .因为每个Function 对象都有一个call()方法，而函数名就是一个Function对象.call()函数的第一个参数是test函数里的this.</div><br/>所以继承可以这样实现： <br/><div class="code">function Parent(username)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.username = username;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.say = function()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.username);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>function Child(username,password)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;Parent.call(this,username);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.password = password;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.hello = function()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.password);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>var parent = new Parent(&quot;zhangsan&quot;);&nbsp;&nbsp; <br/>parent.say();//zhangsan&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var child = new Child(&quot;lisi&quot;,&quot;123456&quot;);&nbsp;&nbsp; <br/>child.say();//lisi&nbsp;&nbsp; <br/>child.hello();//123456 </div><br/><br/>3.<span style="color: #FF0000;">第三种实现方式:apply()函数方式，apply()和call()是一样的，只不过参数传递不同而已,apply的参数为数组</span><br/><div class="code">//第三种实现方式:apply()函数方式，apply()和call()是一样的，只不过参数传递不同而已,apply的参数为数组&nbsp;&nbsp; <br/>//所以继承可以这样实现&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>function Parent(username)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.username = username;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.say = function()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.username);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>function Child(username,password)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;Parent.apply(this,new Array(username));&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.password = password;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.hello = function()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(this.password);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>var parent = new Parent(&quot;zhangsan&quot;);&nbsp;&nbsp; <br/>parent.say();//zhangsan&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var child = new Child(&quot;lisi&quot;,&quot;123456&quot;);&nbsp;&nbsp; <br/>child.say();//lisi&nbsp;&nbsp; <br/>child.hello();//123456&nbsp;&nbsp;</div><br/>4. <span style="color: #FF0000;">第4种方式:原型链实现继承</span><br/><div class="code">//原型链实现继承&nbsp;&nbsp; <br/>function Parent()&#123;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>Parent.prototype.hello = &quot;hello&quot;;&nbsp;&nbsp; <br/>Parent.prototype.sayHello = function()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(this.hello);&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>function Child ()&#123;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>Child.prototype = new Parent();//关键&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>Child.prototype.world = &quot;world&quot;;&nbsp;&nbsp; <br/>Child.prototype.sayWorld = function()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(this.world);&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var child = new Child();&nbsp;&nbsp; <br/>child.sayHello();&nbsp;&nbsp; <br/>child.sayWorld(); </div><br/><br/>5.<span style="color: #FF0000;">第五种方式:混合模式实现继承</span><br/><div class="code">//混合模式实现继承&nbsp;&nbsp; <br/>function Parent(hello)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.hello = hello;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>Parent.prototype.sayHello = function()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(this.hello);&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>function Child(hello,world)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.world = world;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;Parent.call(this,hello);//关键&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp; <br/>Child.prototype = new Parent(); //关键&nbsp;&nbsp; <br/>Child.prototype.sayWorld = function()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(this.world);&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var child = new Child(&quot;hello&quot;,&quot;world&quot;);&nbsp;&nbsp; <br/>child.sayHello();&nbsp;&nbsp; <br/>child.sayWorld();&nbsp;&nbsp;</div><br/>Tags - <a href="http://zhoujin.com/tags/javascript/" rel="tag">javascript</a> , <a href="http://zhoujin.com/tags/%25E7%25B1%25BB/" rel="tag">类</a> , <a href="http://zhoujin.com/tags/%25E7%25BB%25A7%25E6%2589%25BF/" rel="tag">继承</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/102/</link>
<title><![CDATA[javascript---类的构建]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[JAVASCRIPT]]></category>
<pubDate>Thu, 15 May 2008 07:57:10 +0000</pubDate> 
<guid>http://zhoujin.com/post/102/</guid> 
<description>
<![CDATA[ 
	javascript里构建类主要有4种方式 <br/>1.构造方式定义类 <br/>2.原型方式定义类 <br/>3.构造和原型结合方式创建类 <br/>4.动态的原型方式 <br/><br/>各有优缺点,具体如下 <br/>1.<span style="color: #FF0000;">构造方式定义类，优点:多个实例对象不共享类的属性值，缺点:每个实例对象都会产生出一个函数say</span><br/><br/><div class="code">//构造方式定义类，优点:多个实例对象不共享类的属性值，缺点:每个实例对象都会产生出一个函数say&nbsp;&nbsp; <br/>function User()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.username = &quot;zhangsan&quot;;//this.不能丢&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.say = function()&#123;//this.不能丢&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;username:&quot; + this.username );//this.不能丢&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//下面注释的这种写法不对&nbsp;&nbsp; <br/>//&nbsp;&nbsp;function say()&#123;&nbsp;&nbsp; <br/>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;username:&quot; + this.username );&nbsp;&nbsp; <br/>//&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var user = new User();&nbsp;&nbsp; <br/>user.username = &quot;lisi&quot;;&nbsp;&nbsp; <br/>user.say();//username:lisi&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var user1 = new User();&nbsp;&nbsp; <br/>user1.say();//username:zhangsan,不受user对象的影响&nbsp;&nbsp;<br/><br/>//构造方式定义类，优点:多个实例对象不共享类的属性值，缺点:每个实例对象都会产生出一个函数say<br/>function User()&#123;<br/>&nbsp;&nbsp;this.username = &quot;zhangsan&quot;;//this.不能丢<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;this.say = function()&#123;//this.不能丢<br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;username:&quot; + this.username );//this.不能丢<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;//下面注释的这种写法不对<br/>//&nbsp;&nbsp;function say()&#123;<br/>//&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;username:&quot; + this.username );<br/>//&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>var user = new User();<br/>user.username = &quot;lisi&quot;;<br/>user.say();//username:lisi<br/><br/>var user1 = new User();<br/>user1.say();//username:zhangsan,不受user对象的影响</div><br/><br/><br/>//多个实例对象不共享类的属性值: <br/><div class="code">//多个实例对象不共享类的属性值，如下:&nbsp;&nbsp; <br/>function User()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.username = new Array();//this.不能丢&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.say = function()&#123;//this.不能丢&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;username:&quot; + this.username );//this.不能丢&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var user = new User();&nbsp;&nbsp; <br/>user.username.push(&quot;zhangsan&quot;);&nbsp;&nbsp; <br/>user.say();//username:zhangsan&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var user1 = new User();&nbsp;&nbsp; <br/>user1.say();//user1的username为空，不为zhangsan,因为user1的属性值不受user影响 </div><br/><br/>2.<span style="color: #FF0000;">原型方式定义类,缺点:类的属性值如果是引用类型的(非Number和String类型)，则多个实例对象共享</span><br/><div class="code">//原型方式定义类,缺点:类的属性值如果是引用类型的(非Number和String类型)，则多个实例对象共享&nbsp;&nbsp; <br/>function User()&#123;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>User.prototype.username = &quot;zhangsan&quot;;&nbsp;&nbsp; <br/>User.prototype.say = function()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;username: &quot; + this.username );&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var user = new User();&nbsp;&nbsp; <br/>user.username = &quot;lisi&quot;;&nbsp;&nbsp; <br/>user.say();//username:lisi&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var user1 = new User();&nbsp;&nbsp; <br/>user1.say();//username:zhangsan&nbsp;&nbsp;<br/><br/>//原型方式定义类,缺点:类的属性值如果是引用类型的(非Number和String类型)，则多个实例对象共享<br/>function User()&#123;<br/>&#125;<br/>User.prototype.username = &quot;zhangsan&quot;;<br/>User.prototype.say = function()&#123;<br/>&nbsp;&nbsp;alert(&quot;username: &quot; + this.username );<br/>&#125;<br/><br/>var user = new User();<br/>user.username = &quot;lisi&quot;;<br/>user.say();//username:lisi<br/><br/>var user1 = new User();<br/>user1.say();//username:zhangsan</div><br/><br/><br/>类的属性值如果是引用类型的(非Number和String类型)，则多个实例对象共享：<br/><div class="code">//类的属性值如果是引用类型的(非Number和String类型)，则多个实例对象共享,如下&nbsp;&nbsp; <br/>function User()&#123;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>User.prototype.username = new Array();&nbsp;&nbsp; <br/>User.prototype.say = function()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;username: &quot; + this.username );&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var user = new User();&nbsp;&nbsp; <br/>user.username.push(&quot;zhangsan&quot;) ;&nbsp;&nbsp; <br/>user.say();//username:zhangsan&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var user1 = new User();&nbsp;&nbsp; <br/>user1.say();//username:zhangsan,因为user1属性也会受到user的影响，user1和user指向同一引用，即共享同一属性</div>3.<span style="color: #FF0000;">构造和原型结合方式创建类:优点:类的方法只会产生一个，不会产生大量方法,同时属性还不共享;缺点:属性和方法分开定义不是太好。 </span><br/><div class="code">//构造和原型结合方式创建类:优点:类的方法只会产生一个，不会产生大量方法,同时属性还不共享;缺点:属性和方法分开定义不是太好。&nbsp;&nbsp; <br/>function User()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;this.username = &quot;zhangsan&quot;;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>User.prototype.say = function()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;username: &quot; + this.username );&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>var user = new User();&nbsp;&nbsp; <br/>alert(user.username);&nbsp;&nbsp;</div><br/><br/>4.<span style="color: #FF0000;">动态的原型方式:优点:类的方法只会产生一个，不会产生大量方法,同时属性还不共享,同时属性和方法不是分开定义的 </span> <br/><br/>////动态的原型方式:优点:类的方法只会产生一个，不会产生大量方法,同时属性还不共享,同时属性和方法不是分开定义的<br/><div class="code">function User()&#123;<br/>&nbsp;&nbsp;this.username = &quot;zhangsan&quot;;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;if(typeof User.flag == &quot;undefined&quot;)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;execute...&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;User.prototype.say = function()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;username: &quot; + this.username );<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;User.flag = true;<br/>&nbsp;&nbsp;&#125;<br/>&#125;<br/><br/>var user1 = new User();//execute...<br/>var user2 = new User();//不会打印出execute...，则说明方法只创建了一次，即方法只会产生一个<br/>user1.say();//username</div><br/><br/>总结: <br/><span style="color: #FF0000;">构造方式定义类:缺点:类里的方法，每个实例对象都会产生一个，导致产生大量方法;优点:所有实例对象都单独拥有一份类里的属性，即属性不共享 <br/>原型方法定义类:缺点:所有实例对象都共同拥有一份类里的属性，即属性共享。优点:类的方法只会产生一个，不会产生大量方法 <br/>构造和原型结合方式创建类:优点:类的方法只会产生一个，不会产生大量方法,同时属性还不共享;缺点:属性和方法分开定义不是太好。 <br/>动态的原型方式:优点:类的方法只会产生一个，不会产生大量方法,同时属性还不共享,同时属性和方法不是分开定义的</span><br/>Tags - <a href="http://zhoujin.com/tags/javascript/" rel="tag">javascript</a> , <a href="http://zhoujin.com/tags/%25E7%25B1%25BB/" rel="tag">类</a> , <a href="http://zhoujin.com/tags/%25E6%259E%2584%25E5%25BB%25BA/" rel="tag">构建</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/89/</link>
<title><![CDATA[CSS中Float概念相关文章采撷]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[CSS]]></category>
<pubDate>Wed, 14 May 2008 13:43:41 +0000</pubDate> 
<guid>http://zhoujin.com/post/89/</guid> 
<description>
<![CDATA[ 
	<p><span><a href="http://www.smashingmagazine.com/2007/05/01/css-float-theory-things-you-should-know/"><span>原始出处</span></a></span></p><p><span>Float</span>（浮动）概念也许是<span><span><span><span>CSS</span></span></span></span>中最让人迷惑的一个概念吧。<span>Float</span>经常被错误理解，而且因为将上下文元素全部浮动导致的可读性、可用性问题备受责难。然而，这些问题的根源并不在于理论本身，而是开发人员以及浏览器对理论的解读造成的。<span> </span></p><p>如果你认真的去读一下浮动概念，你会发现并不像所见的那样复杂。大多数问题都是由于老版本的<span>IE</span>带来的（我只是猜想）。如果你知道这些<span>bug</span>，你就能避免这些问题。<span> </span></p><p>让我们尝试去解决这些问题并澄清一些以前使用浮动的误解。我们参考了成打的相关文章，并选取了最为重要的一些你必须了解的问题。<br /><span><strong>What You Should Know About Floats</strong> </span></p><span>&ldquo;</span>关于图文围绕的实践可以追溯到很久很久以前。这也就是为什么从<span>Netscape1.1</span>开始这个功能被引入浏览器，以及为什么<span><span><span><span>CSS</span></span></span></span>使用浮动属性来实现它。<span>&lsquo;Float(浮动)&rsquo;这个术语引用自伴随Netscape1.1一同发布的&lsquo;Additions to HTML 2.0&rsquo;文档，描述一个元素浮动至某一侧并停下的表现方式。&rdquo;[</span><span><a href="http://www.complexspiral.com/publications/containing-floats/"><span><span>Containing Floats</span></span></a></span><span>] </span><span><br /></span><p><span>&ldquo;</span>浮动元素的定位还是基于正常的文档流，然后从文档流中抽出并尽可能远的移动至左侧或者右侧。文字内容会围绕在浮动元素周围。当一个元素从正常文档流中抽出后，仍然在文档流中的其他元素将忽略该元素并填补他原先的空间。<span>&rdquo; [<a href="http://css.maxdesign.com.au/floatutorial/definitions.htm"><span>Float Positioning</span></a>] </span></p><span>&ldquo;</span>元素浮动后将自动转为块级元素。该元素可以被移动至当前行的左侧或右侧。<span>属性如下：float: left, float: right or float: none&rdquo;[</span><span><a href="http://css.maxdesign.com.au/floatutorial/introduction.htm"><span><span>Floatutorial: Float Basics</span></span></a></span><span>] <p></p></span><p><span>&ldquo;</span>你应该为所有的浮动元素设定宽度属性（除非是＜img＞元素，因其具有隐含的宽度）。如果不设定宽度，结果将是不可预知的。<span>&rdquo;[<a href="http://css.maxdesign.com.au/floatutorial/introduction.htm"><span>Floatutorial: Float Basics</span></a>] </span></p><p><span>&ldquo;</span>举例来说，浮动元素应该定义宽度属性，不论是显式指定的还是隐含的。另外，它会尽可能的水平的填充容器元素，就像非浮动内容那样，不给其他内容空间以围绕它们。其次，和正常文档流中的元素不同，浮动元素的垂直边距<span>(margin)</span>不会叠加。最后，浮动元素可以和临近在正常文档流中块级元素重叠（译注：浮动元素不占任何正常文档流空间，所以建议不要理解成重叠，而是腾空浮动的概念。）。<span>&rdquo;[<a href="http://www.brainjar.com/css/positioning/default3.asp"><span><span><span><span>CSS</span></span></span> Positioning: Floats</span></a>]<span> </span></span></p><p><span>&ldquo;</span>首先我们要牢记的一件事情是，浮动元素只能浮动至左侧或者右侧，没有浮动至中间一说，这是很多新手容易范的错误。记住，最基本的规则，浮动元素只能浮动至两侧。<span>&rdquo; [<a href="http://www.autisticcuckoo.net/archive.php?id=2004/12/10/floating"><span>Float Layouts</span></a>] </span></p><p><span>&ldquo;</span>当我们让一个元素浮动，它会往右或者往左浮动直至遇到容器的边缘。如果我们向同一方向再浮动一个元素，它会浮动直至碰到前一个浮动元素的边缘。如果我们浮动更多的元素，他们将一个挨一个排列，但不久就会空间不足，当该行已经无法容纳更多的浮动元素，则下一个浮动元素会换行继续排列。<span>&rdquo; [<a href="http://www.autisticcuckoo.net/archive.php?id=2004/12/10/floating"><span>Float Layouts</span></a>] </span></p><p><span>Containing blocks or containing boxes</span>：<span>&ldquo;</span>容器元素是指包含其他子元素的行级或块级元素。。。。<span>&rdquo;</span><span> </span><span>[<a href="http://css.maxdesign.com.au/floatutorial/definitions.htm"><span>Floatutorial</span></a>] </span></p><span>&ldquo;</span>当明确指定时，浮动元素垂直位置由它原先在文档流中的位置决定，顶端与当前行顶端对其。但是水平方向上，它尽可能远的向容器元素边缘移动，但是仍遵循容器元素的填充距离<span>(padding)</span>。<span>同行的行内元素则围绕浮动元素排列。&rdquo;</span><span> </span><span>[</span><span><a href="http://www.brainjar.com/css/positioning/default2.asp"><span><span><span><span><span>CSS</span></span></span> Positioning: Floats</span></span></a></span><span>] </span><span><p></p></span><span>&ldquo;</span>由于浮动元素不占据正常文档流空间，所以浮动元素前后那些未明确指定位置的块级元素会占据浮动元素本来应该处在的位置，就好像它从来不曾存在过。而浮动元素之后的那行会根据浮动元素缩小宽度。浮动元素之前的元素则会重新被排列，占据独立的一行。<span>（译注：ie 和 ff 在这种情况下的表现不尽相同）&rdquo;</span><span> </span><span>[</span><span><a href="http://www.w3.org/TR/CSS2/visuren.html#floats"><span><span>W3C Visual Formatting Model</span></span></a></span><span>] </span><span><p></p></span><p><span>&ldquo;</span>如果当前行的水平方向上没有足够的空间容纳浮动元素，则向下一行，直至有能容纳该元素的行。<span>&rdquo; [<a href="http://css.maxdesign.com.au/floatutorial/introduction.htm"><span>Floatutorial: Float Basics</span></a>] </span></p><span>&ldquo;</span>任何浮动元素都不可能超过原来所处文档留位置的上边界。浮动元素的顶端必定和当前行顶端对齐（或者在没有当前行元素时和前一个块级元素底部边缘对齐）。<span>&rdquo;[<a href="http://www.autisticcuckoo.net/archive.php?id=2004/12/10/floating"><span>Float Layouts</span></a>] </span><span><p></p></span><span>&ldquo;</span>想要真正理解浮动理论，你必须明白在<span><span><span><span>CSS</span></span></span></span>中什么是行<span> </span><span>(line box)</span>。不幸的是，为了解释什么是行，你必须先明白什么是行级元素。行级元素指的是那些非块级元素，例如＜em＞而行是一个逻辑上的概念，是一个虚拟的矩形，包含了组成该行的所有行级元素，其高度至少等于这些行级元素中最高的那个。<span>&rdquo; [</span><span><a href="http://www.autisticcuckoo.net/archive.php?id=2004/12/10/floating"><span><span>Float Layouts</span></span></a></span><span>]<span> </span><p></p></span><span>&ldquo;如果我们将Div中所有的列都加上 float: left 它们会挨个向左排列，如果我们希望在页面底部有一个页脚，并不需要一个最长的列，只要加上 clear: both 就可以了&rdquo;[</span><span><a href="http://www.autisticcuckoo.net/archive.php?id=2004/12/10/floating"><span><span>Float Layouts</span></span></a></span><span>] </span><span><p></p></span><p><span>&ldquo;</span>使用浮动元素包含浮动元素这样的布局方式有一个潜在的缺点，即你的页面是否能够一直保持一致的展现效果将取决于浏览器的实现是否保持一致。特别是当浮动元素是一个更为复杂的布局中的一部分的话，将变得更加不堪一击。<span>&rdquo;[<a href="http://www.complexspiral.com/publications/containing-floats/"><span>Containing Floats</span></a>] </span></p><p></p><h1><span>Clearing the floats </span></h1><p></p><div><span><br /></span></div><span><p></p></span><span>&ldquo;</span>浮动元素之后的元素会自动围绕该浮动元素。如果你不希望这样，你可以为这些元素应用<span>&lsquo;clear&rsquo;</span>属性。<span>该属性有4种设值：</span><span>clear: left</span><span>, </span><span><span>clear: right</span></span><span>, </span><span><span>clear: both</span></span><span> or </span><span><span>clear: none</span></span><span>&rdquo;[</span><span><a href="http://css.maxdesign.com.au/floatutorial/clear.htm"><span><span>Floats and &ldquo;clear&rdquo;</span></span></a></span><span>] </span><span><p></p></span><p>有很多技巧可以做到清理浮动元素，但不引入额外的无语义标签。下面<span>3</span>种是比较常见的做法：<span> a) </span>将容器元素一起浮动<span> b) </span>在容器元素上使用<span> overflow: hidden c) </span>使用<span>:after</span>这样的<span><span><span><span>css</span></span></span></span>伪类。<span> [<a href="http://www.robertnyman.com/2007/04/12/how-to-clear-css-floats-without-extra-markup-different-techniques-explained/"><span>How to clear <span><span><span>CSS</span></span></span> floats without extra markup</span></a>]<span> </span></span></p><span>&ldquo;</span>插入一个清理元素是使容器正确包裹所有浮动元素的标准做法，这样做具有将容器底部边缘<span>&lsquo;</span>拖拉<span>&rsquo;</span>以包裹所含元素的效果。<span>&rdquo; [<a href="http://www.positioniseverything.net/easyclearing.html"><span>How To Clear Floats Without Structural Markup</span></a>] </span><span><p></p></span><p><span>&ldquo;</span>对于基于浮动设计的布局来说，一个常见的问题就是浮动元素的容器不会自动伸展来包含浮动元素。如果你希望在所有的浮动元素的外面加上边框（例如，在容器元素上加上边框），这样你必须显示的命令浏览器来伸展容器。你可以是用<span><a href="http://www.quirksmode.org/blog/archives/2005/03/clearing_floats.html"><span>overflow method</span></a></span>方法。<span>&rdquo; </span></p><p>使用<span>:after </span>想像一下我们使用<span>:after</span>来插入一个点号，并且设置它的属性<span>&#123;clear: both;&#125;</span>。这就是所有你需要做的事情，但是没有人会接受容器底部有那么一丝空隙，所以我们还要设置<span>&#123;height: 0;&#125;</span><span> </span>和 <span><span>&#123;visibility: hidden;&#125;</span></span><span> </span>来保证严丝合缝。 <span><span>[</span></span><span><a href="http://www.positioniseverything.net/easyclearing.html"><span>How To Clear Floats Without Structural Markup</span></a></span><span><span>]</span></span></p><br/>Tags - <a href="http://zhoujin.com/tags/css/" rel="tag">css</a> , <a href="http://zhoujin.com/tags/float/" rel="tag">float</a> , <a href="http://zhoujin.com/tags/html/" rel="tag">html</a> , <a href="http://zhoujin.com/tags/w3c/" rel="tag">w3c</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/101/</link>
<title><![CDATA[javascript特性二]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[JAVASCRIPT]]></category>
<pubDate>Tue, 13 May 2008 07:55:21 +0000</pubDate> 
<guid>http://zhoujin.com/post/101/</guid> 
<description>
<![CDATA[ 
	1.<div class="code">User = function ()&#123;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>User.prototype.name = &quot;zhangsan&quot;;&nbsp;&nbsp; <br/>//User.name = &quot;zhangsan&quot;;//错误定义&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>var u = new User();&nbsp;&nbsp; <br/>u.password = &quot;123456&quot;;&nbsp;&nbsp; <br/>//u.prototype.password = &quot;987654&quot;;//错误定义&nbsp;&nbsp; <br/>alert(u.name);&nbsp;&nbsp; <br/>alert(u.password);&nbsp;&nbsp;</div><br/>2. js里的数组 <br/><div class="code">//数组定义，第一种定义方式&nbsp;&nbsp; <br/>var arr = new Array();&nbsp;&nbsp; <br/>//数组赋值&nbsp;&nbsp; <br/>arr.push(1);&nbsp;&nbsp; <br/>arr.push(2);&nbsp;&nbsp; <br/>arr&#91;2&#93; = 3;&nbsp;&nbsp; <br/>alert(arr.length);//3&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>//第二种定义方式&nbsp;&nbsp; <br/>var arr1 = &#91;&#93;;&nbsp;&nbsp; <br/>arr1.push(1);&nbsp;&nbsp; <br/>arr1.push(2);&nbsp;&nbsp; <br/>arr1&#91;2&#93; = 3;&nbsp;&nbsp; <br/>alert(arr1.length);//3&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>//第三种定义方式&nbsp;&nbsp; <br/>var arr2 = &#91;1,2,3,4,5&#93;;&nbsp;&nbsp; <br/>arr2&#91;5&#93; = 6;&nbsp;&nbsp; <br/>alert(arr2.length);//6&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>//数组排序sort()方法&nbsp;&nbsp; <br/>var arr3 = &#91;1,4,2&#93;;&nbsp;&nbsp; <br/>arr3.sort();&nbsp;&nbsp; <br/>alert(arr3);//1,2,4&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>//&nbsp;&nbsp; <br/>var arr3 = &#91;1,4,23&#93;;&nbsp;&nbsp; <br/>arr3.sort();&nbsp;&nbsp; <br/>alert(arr3);//1,23,4&nbsp;&nbsp;顺序不对的原因是因为js里排序会先转换为字符串，再根据ascii码进行排序。所以23排在了4的前面&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>//&nbsp;&nbsp;&nbsp;&nbsp;<br/>function compare(num1,num2)&nbsp;&nbsp; <br/>&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;//因为排序前都转化成了字符串，所以要给parse成int,可以用函数parseInt()函数&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; var temp1 = parseInt(num1);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; var temp2 = parseInt(num2);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; if(temp1 &lt; temp2)&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; &#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;else if(temp1 == temp2)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;else&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>var arr4 = &#91;1,4,23&#93;;&nbsp;&nbsp; <br/>arr4.sort(compare);//1,4,23 因为通过自定义函数compare进行了转换&nbsp;&nbsp; <br/>alert(arr4);&nbsp;&nbsp;<br/><br/>//数组定义，第一种定义方式<br/>var arr = new Array();<br/>//数组赋值<br/>arr.push(1);<br/>arr.push(2);<br/>arr&#91;2&#93; = 3;<br/>alert(arr.length);//3<br/><br/>//第二种定义方式<br/>var arr1 = &#91;&#93;;<br/>arr1.push(1);<br/>arr1.push(2);<br/>arr1&#91;2&#93; = 3;<br/>alert(arr1.length);//3<br/><br/>//第三种定义方式<br/>var arr2 = &#91;1,2,3,4,5&#93;;<br/>arr2&#91;5&#93; = 6;<br/>alert(arr2.length);//6<br/><br/><br/>//数组排序sort()方法<br/>var arr3 = &#91;1,4,2&#93;;<br/>arr3.sort();<br/>alert(arr3);//1,2,4<br/><br/>//<br/>var arr3 = &#91;1,4,23&#93;;<br/>arr3.sort();<br/>alert(arr3);//1,23,4&nbsp;&nbsp;顺序不对的原因是因为js里排序会先转换为字符串，再根据ascii码进行排序。所以23排在了4的前面<br/><br/>// <br/>function compare(num1,num2)<br/>&#123;<br/>&nbsp;&nbsp;//因为排序前都转化成了字符串，所以要给parse成int,可以用函数parseInt()函数<br/>&nbsp;&nbsp;&nbsp;&nbsp; var temp1 = parseInt(num1);<br/>&nbsp;&nbsp;&nbsp;&nbsp; var temp2 = parseInt(num2);<br/>&nbsp;&nbsp;&nbsp;&nbsp; if(temp1 &lt; temp2)<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return -1;<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;else if(temp1 == temp2)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;else&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;return 1;<br/>&nbsp;&nbsp;&nbsp;&nbsp; &#125;<br/>&#125;<br/><br/>var arr4 = &#91;1,4,23&#93;;<br/>arr4.sort(compare);//1,4,23 因为通过自定义函数compare进行了转换<br/>alert(arr4);</div>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/100/</link>
<title><![CDATA[javascript特性一]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[JAVASCRIPT]]></category>
<pubDate>Mon, 12 May 2008 07:51:52 +0000</pubDate> 
<guid>http://zhoujin.com/post/100/</guid> 
<description>
<![CDATA[ 
	1.js不支持重载，因为js里的函数都是一个对象，js里有个隐含对象Function,所有的js函数都是一个Function类型的对象。比如： <br/><div class="code">function add(number)&nbsp;&nbsp; <br/>&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp; alert(&quot;hello&quot;);&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp;<br/><br/>function add(number)<br/>&#123;<br/>&nbsp;&nbsp; alert(&quot;hello&quot;);<br/>&#125;</div><br/>等价于<br/><div class="code">var add = new Function(&quot;number&quot;,&quot;alert(&#039;hello&#039;);&quot;);&nbsp;&nbsp;<br/><br/>var add = new Function(&quot;number&quot;,&quot;alert(&#039;hello&#039;);&quot;);</div><br/><br/>由于js里每一个函数里都隐含一个对象叫arguments,该arguments是一个数组，通过arguments可以获得到实际传递参数的个数(arguments.length)及实际传递参数的值(arguments[0],arguments[1]...) <br/>所以可以通过arguments对象来模拟重载，如下： <br/><div class="code">function add()&nbsp;&nbsp; <br/>&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(arguments.length == 1)&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(arguments&#91;0&#93; + 10);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(arguments.length == 2)&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(arguments&#91;0&#93; + arguments&#91;1&#93; + 10);&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>add(5);&nbsp;&nbsp; <br/>add(5,1);&nbsp;&nbsp;<br/><br/>function add()<br/>&#123;<br/>&nbsp;&nbsp;if(arguments.length == 1)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(arguments&#91;0&#93; + 10);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;if(arguments.length == 2)<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alert(arguments&#91;0&#93; + arguments&#91;1&#93; + 10);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&#125;<br/>&#125;<br/>add(5);<br/>add(5,1);</div><br/><br/><br/>2.每个函数的名字都有一个属性叫length,“属性名.length ”获得该函数能接受参数的个数。 <br/>如：<div class="code">function a1()&nbsp;&nbsp; <br/>&#123;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>function a2(number)&nbsp;&nbsp; <br/>&#123;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>alert(a1.length);//0&nbsp;&nbsp; <br/>alert(a2.length);//1&nbsp;&nbsp;<br/><br/>function a1()<br/>&#123;<br/>&#125;<br/>function a2(number)<br/>&#123;<br/>&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>alert(a1.length);//0<br/>alert(a2.length);//1</div><br/><br/><br/>3.JavaScript中有五种原始基本数据类型：Undefined,Null,Boolean,Number,String <br/><br/>Undefined数据类型的值只有一个：undefined <br/><br/>Null数据类型的值只有一个：null <br/><br/>Boolean数据类型的值只有两个：true，false <br/><br/>Number数据类型的值有很多：数字即可 <br/><br/>String a = "hello";和String a = new String("hello");是不一样的。有点类似java里的对象。String a = "hello"只是在栈内存里生成，String a = new String("hello");则堆内存里生成"hello"值，栈内容里变量a指向堆内存。 <br/><br/>4.typeof一元操作符，它的返回值有五个：undefined,boolean,number,string,object <br/><br/>5.alert(函数名) 是把该函数的函数名及函数体都给打印出来。方便调试 javascript. <br/><br/>如：<div class="code">function test()&nbsp;&nbsp; <br/>&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;var a = &quot;aa&quot;;&nbsp;&nbsp; <br/>&#125;&nbsp;&nbsp; <br/>alert(test());//undefined&nbsp;&nbsp; <br/>alert(test);//function test()&#123; var a = &quot;aa&quot;;&#125;&nbsp;&nbsp; <br/>&lt;SPAN style=&quot;COLOR: red&quot;&gt;对于函数来说，如果其不返回值，那么其返回值就为undefined&lt;/SPAN&gt;&nbsp;&nbsp;<br/><br/>function test()<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var a = &quot;aa&quot;;<br/>&#125;<br/>alert(test());//undefined<br/>alert(test);//function test()&#123; var a = &quot;aa&quot;;&#125;</div>对于函数来说，如果其不返回值，那么其返回值就为undefined<br/><br/>6. <br/><div class="code">var s ;//变量s1未定义&nbsp;&nbsp; <br/>alert(typeof s);//undefined&nbsp;&nbsp; <br/>alert(typeof s1);//undefined&nbsp;&nbsp; <br/>alert(s);//undefined&nbsp;&nbsp; <br/>alert(s1);//报错&nbsp;&nbsp;<br/><br/>var s ;//变量s1未定义<br/>alert(typeof s);//undefined<br/>alert(typeof s1);//undefined<br/>alert(s);//undefined<br/>alert(s1);//报错</div><br/><br/>7.null与undefined的关系：undefined实际上从null派生而来 <br/><div class="code">alert(undefined == null);//true&nbsp;&nbsp;<br/><br/>alert(undefined == null);//true</div><br/><br/>8.对于函数定义中的变量来说，加var表示局部变量，不加var表示全局变量 <br/><br/>9.javascript里 ，Object类是所有类的父类，类的强制转换有三种：Boolean(value),Number(value),String(value) <br/><br/>Object 对象有个方法叫：propertyIsEnumerable("属性名") <br/>所以所有子类都有该方法，如果 "对象.propertyIsEnumerable("属性名")"为true，则表示该属性可以通过for(var temp in 对象的实例名)来进行遍历出来。 <br/>如： <br/><div class="code">var o = new Object();&nbsp;&nbsp; <br/>alert(o.propertyIsEnumerable(&quot;prototype&quot;));//false,说明prototype是不可以通过for(var temp in )进行遍历出来的&nbsp;&nbsp;<br/><br/>var o = new Object();<br/>alert(o.propertyIsEnumerable(&quot;prototype&quot;));//false,说明prototype是不可以通过for(var temp in )进行遍历出来的</div><br/><br/>Object对象里的所有属性propertyIsEnumerable都为 false <br/><div class="code">var o = new Object();&nbsp;&nbsp; <br/>for(var temp&nbsp;&nbsp;in&nbsp;&nbsp;o)&nbsp;&nbsp; <br/>&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(temp);&nbsp;&nbsp;&nbsp;&nbsp;//一个都不会打印出来&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#125;&nbsp;&nbsp;<br/><br/>var o = new Object();<br/>for(var temp&nbsp;&nbsp;in&nbsp;&nbsp;o)<br/>&#123;<br/>&nbsp;&nbsp;alert(temp);&nbsp;&nbsp;//一个都不会打印出来&nbsp;&nbsp;<br/>&#125;</div><br/><br/>可以把o改为内置window对象，就可以打印出来很多了。 <br/><br/>10.定义对象后增加属性或删除属性 <br/><div class="code">var o = new Object();&nbsp;&nbsp; <br/>o.name=&quot;test&quot;;&nbsp;&nbsp; <br/>alert(o.name);//test&nbsp;&nbsp; <br/>delete o.name;&nbsp;&nbsp; <br/>alert(o.name);//undefined </div><br/>Tags - <a href="http://zhoujin.com/tags/javascript/" rel="tag">javascript</a> , <a href="http://zhoujin.com/tags/%25E7%2589%25B9%25E6%2580%25A7/" rel="tag">特性</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/88/</link>
<title><![CDATA[Javascript与CSS在IE和Firefox中的误区及区别]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[JAVASCRIPT]]></category>
<pubDate>Fri, 09 May 2008 09:36:41 +0000</pubDate> 
<guid>http://zhoujin.com/post/88/</guid> 
<description>
<![CDATA[ 
	1. 集合类对象问题 <br/>现有代码中许多集合类对象取用时使用 ()，IE 能接受，Firefox 不能。 <br/>解决方法：改用 [] 作为下标运算。如：document.forms("formName") 改为<br/><div class="code">document.forms&#91;&quot;formName&quot;&#93;;&nbsp;&nbsp; <br/>//又如：&nbsp;&nbsp; <br/>document.getElementsByName(&quot;inputName&quot;)(1);&nbsp;&nbsp; <br/>//改为&nbsp;&nbsp; <br/>document.getElementsByName(&quot;inputName&quot;)&#91;1&#93;;&nbsp;&nbsp;</div><br/>2. DIV对象 <br/>在 IE 中，DIV对象可以使用ID作为对象变量名直接使用。在 Firefox 中不能。 <br/>DivId.style.display = "none"; <br/>解决方法：document.getElementById("DivId").style.display = "none"; <br/>ps:得对象的方法不管是不是DIV对象，都应该使用getElementById方法。 <br/><br/>3. 关于frame <br/>现有问题：在 IE中 可以用window.testFrame取得该frame，mf中不行 <br/>解决方法：在frame的使用方面Firefox和IE的最主要的区别是： <br/>如果在frame标签中书写了以下属性： <br/>那么IE可以通过id或者name访问这个frame对应的window对象 <br/>而mf只可以通过name来访问这个frame对应的window对象 <br/>例如如果上述frame标签写在最上层的window里面的htm里面，那么可以这样访问 <br/>IE： window.top.frameId或者window.top.frameName来访问这个window对象 <br/>Firefox：只能这样window.top.frameName来访问这个window对象 <br/>另外，在mf和ie中都可以使用window.top.document.getElementById("frameId")来访问frame标签 <br/>并且可以通过window.top.document.getElementById("testFrame").src = 'xx.htm'来切换frame的内容 <br/>也都可以通过window.top.frameName.location = 'xx.htm'来切换frame的内容 <br/><br/>4. 窗口 <br/>现有问题：IE中可以通过showModalDialog和showModelessDialog打开模态和非模态窗口，但是Firefox不支持。 <br/>解决办法：直接使用window.open(pageURL,name,parameters)方式打开新窗口。 <br/>如果需要传递参数，可以使用frame或者iframe。 <br/><br/>5. 在JS中定义各种对象变量名时，尽量使用id，避免使用name. <br/>在 IE 中，HTML 对象的 ID 可以作为 document 的下属对象变量名直接使用。在 Firefox 中不能，所以在平常使用时请尽量使用id，避免只使用name，而不使用id。 <br/><br/>6. document.all <br/>Firefox可以兼容document.all， 但会生成一条警告。可以用getElementById("*") 或者 getElementByTagName("*)来代替 <br/>不过对于document.all.length等属性，则完全不兼容。大家尽量不要使用document.all属性. <br/><br/>7. parentElement <br/>IE中支持使用parentElement和parentNode获取父节点. <br/>而Firefox只可以使用parentNode. <br/><br/>8. event <br/>W3C不支持windows.event <br/>比方说,在IE里面: <br/><div class="code">function onMenuClick()&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;collapseMenu(event.srcElement);&nbsp;&nbsp; <br/>&#125; </div><br/>工作正常。不过在Firefox中，则改成： <br/><div class="code">function onMenuClick(evt)&#123;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;if(evt == null)&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;evt = window.event; // For IE&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;var srcElement = evt.srcElement? evt.srcElement : evt.target;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;// IE使用srcElement, 而Firefox使用target&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;collapseMenu(srcElement);</div><br/>9. event.x 与 event.y 问题 <br/>在IE 中，event 对象有 x, y 属性，Firefox中没有。 <br/>解决方法: <br/>在Firefox中，与event.x 等效的是 event.pageX。但event.pageX IE中没有。 <br/>故采用 event.clientX 代替 event.x。在IE 中也有这个变量。 <br/>event.clientX 与 event.pageX 有微妙的差别（当整个页面有滚动条的时候）， <br/>不过大多数时候是等效的。 <br/>如果要完全一样，可以稍麻烦些： <br/><div class="code">mX = event.x ? event.x : event.pageX; </div><br/>然后用 mX 代替 event.x <br/><br/>10. 用idName字符串取得对象的问题 <br/>在IE中，利用 eval(idName) 可以取得 id 为 idName 的 HTML 对象，在Firefox中不能。 <br/>解决办法:用 getElementById(idName) 代替 eval(idName). <br/><br/>14. nodeName 和 tagName 问题 <br/>在Firefox中，所有节点均有 nodeName 值，但 textNode 没有 tagName 值。 <br/>在IE中nodeName 的使用有时会有问题。 <br/>解决方法： <br/>使用 tagName，但应检测其是否为空。 <br/><br/>15. input的type属性 <br/>IE下 input.type属性为只读，但是Firefox下可以修改. <br/><br/>16. 自定义属性 <br/>在mf中，自己定义的属性必须getAttribute()取得 <br/>而IE可以直接通过"."运算符获取. <br/><br/>17.const 问题 <br/>在 IE 中不能使用 const 关键字。如 <br/>const constVar = 32; <br/>在IE中这是语法错误. <br/>解决方法: <br/>不使用 const ，以 var 代替. <br/><br/>18. body 对象 <br/>Firefox的body在body标签没有被浏览器完全读入之前就存在，而IE则必须在body完全被读入之后才存在. <br/><br/>19. img对象alt和title的解析 <br/>alt：当照片不存在或者load错误时的提示, <br/>title：照片的tip说明, <br/>在IE中如果没有定义title，alt也可以作为img的tip使用，但是在Firefox中，两者完全按照标准中的定义使用 <br/>在定义img对象时，最好将alt和title对象都写全，保证在各种浏览器中都能正常使用 <br/><br/>20.childNodes获取的节点 <br/>childNodes的下标的含义在IE和Firefox中不同，Firefox使用DOM规范，childNodes中会插入空白文本节点。 <br/>获取子节点时,一般可以通过node.getElementsByTagName()来回避这个问题。 <br/><br/>21.removeNode() <br/>Firefox中节点没有removeNode方法，必须使用如下方法 <br/><div class="code">node.parentNode.removeChild(node); </div><br/>22.innerText <br/>IE支持，FIREFOX不支持 <br/>FF中设置内容文本是用textConent属性. <br/><br/>23. XMLHTTP的区别 <br/>FireFox中的创建方法为: <br/><div class="code">xmlhttp=new XMLHttpRequest()&nbsp;&nbsp;</div><br/>而在IE中为:<br/><div class="code">xmlhttp=new ActiveXObject(”Microsoft.XMLHTTP”) </div><br/>24. img的src刷新问题 <br/>在IE 下可以用 可以刷新图片，但在FireFox下不行。主要是缓存问题，在地址后面加个随机数就解决了:<br/><div class="code">myImg.src=this.src+’?&#039;+Math.random(); </div><br/>25. setAttribute()设置属性问题 <br/>IE中很多属性都不能用setAttribute进行设置,但Firefox中却可以,如:<br/><div class="code">theDiv.setAttribute(&#039;style&#039;,&#039;color:red&#039;);&nbsp;&nbsp; <br/>//改为:&nbsp;&nbsp; <br/>object.style.cssText = &#039;color:red;&#039;;&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>setAttribute(&#039;class&#039;,&#039;styleClass&#039;)&nbsp;&nbsp; <br/>//改为:&nbsp;&nbsp; <br/>setAttribute(&#039;className&#039;,&#039;styleClass&#039;);&nbsp;&nbsp; <br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;<br/>obj.setAttribute(&#039;onclick&#039;,&#039;funcitonname();&#039;);&nbsp;&nbsp; <br/>//改为:&nbsp;&nbsp; <br/>obj.onclick=function()&#123;fucntionname();&#125;;&nbsp;&nbsp;</div><br/>...等等 <br/><br/>----------------------------------------------------------------------------------------- <br/><br/>IE和FIREFOX在解析CSS方面的区别 <br/><br/>1. 对高度的解析 <br/>IE：将根据内容的高度变化，包括未定义高度的图片内容，即使定义了高度，当内容超过高度时，将使用实际高度 <br/>Firefox：没有定义高度时，如果内容中包括了图片内容，Firefox的高度解析是根据印刷标准，这样就会造成和实际内容高度不符合的情况；当定义了高度，但是内容超过高度时，内容会超出定义的高度，但是区域使用的样式不会变化，造成样式错位。 <br/>结论：大家在可以确定内容高度的情况下最好定义高度，如果真的没有办法定义高度，最好不用使用边框样式，否则样式肯定会出现混乱！ <br/><br/><br/>3.布局问题 <br/>当你在写css的时候，特别是用float: left（或right）排列一窜图片时，会发现在firefox里面正常而IE里面有问题。无论你用margin:0,还是border: 0来约束，都无济于事。 <br/>其实这里还有另外一个问题，就是IE对于空格的处理，firefox是忽略的而IE对于块与块之间的空格是处理的。也就是说一个div结束后要紧接着一个div写，中间不要有回车或者空格。不然也许会有问题，比如3px的偏差，而且这个原因很难发现。 <br/>非常不走运的是我又碰到了这样的问题，多个img标签连着，然后定义的float: left，希望这些图片可以连起来。但是结果在firefox里面正常而IE里面显示的每个img都相隔了3px。我把标签之间的空格都删除都没有作用。 <br/>后来的解决方法是在img外面套li，并且对li定义margin: 0，这样就解决了IE和firefox的显示偏差。IE对于一些模型的解释会产生很多错误问题，只有多多尝试才能发现原因。 <br/>这只是一些简单的区别,在做布局和CSS设计时候可以综合考虑,但最为有效与简单的解决兼容问题还是用TABLE表格,表格在兼容性方面有着不错的表现. <br/><br/><br/>4.鼠标样式 <br/>firefox不支持hand，但ie支持pointer <br/>解决方法: 统一使用pointer <br/><br/>5. padding 问题 <br/>padding 5px 4px 3px 1px FireFox无法解释简写, <br/>必须改成 padding-top:5px; padding-right:4px; padding-bottom:3px; padding-left:1px; <br/><br/>6. 消除ul、ol等列表的缩进 <br/>消除ul、ol等列表的缩进样式应写成:list-style:none;margin:0px;padding:0px; <br/>其中margin属性对IE有效，padding属性对FireFox有效 <br/><br/>7. CSS透明 <br/>IE：filter:progid:DXImageTransform.Microsoft.Alpha(style=0,opacity=60)。 <br/>FF：opacity:0.6。 <br/><br/>8. CSS圆角 <br/>IE：不支持圆角。 <br/>FF： -moz-border-radius:4px，或者 <br/>-moz-border-radius-topleft:4px; <br/>-moz-border-radius-topright:4px; <br/>-moz-border-radius-bottomleft:4px; <br/>-moz-border-radius- bottomright:4px;。 <br/><br/>9. CSS双线凹凸边框 <br/>IE：border:2px outset;。 <br/>FF： <br/>-moz-border-top-colors: #d4d0c8 white; <br/>-moz-border-left-colors: #d4d0c8 white; <br/>-moz-border-right-colors:#404040 #808080; <br/>-moz-border-bottom-colors:#404040 #808080; <br/><br/>10. 滤镜 <br/>IE中支持使用滤镜,而Firefox中不支持. <br/><br/>11. 禁止选取网页内容： <br/>在IE中一般用js：obj.onselectstart=function()&#123;return false;&#125;; <br/>而firefox用CSS:-moz-user-select:none; <br/>----------------------------------------------------------------------------------------- <br/>由ham利用google收集整理.如果还有更好的相关资源,欢迎分享. <br/><br/>若还有其它IE与FF不同的地方,或者代码中有什么不正确的地方,欢迎指出,我会及时更正. <br/>Tags - <a href="http://zhoujin.com/tags/js/" rel="tag">js</a> , <a href="http://zhoujin.com/tags/css/" rel="tag">css</a> , <a href="http://zhoujin.com/tags/firefox/" rel="tag">firefox</a> , <a href="http://zhoujin.com/tags/xml/" rel="tag">xml</a> , <a href="http://zhoujin.com/tags/request/" rel="tag">request</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/87/</link>
<title><![CDATA[JSP内置对象(9个常用的内置对象) ]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[J2EE]]></category>
<pubDate>Fri, 02 May 2008 03:17:23 +0000</pubDate> 
<guid>http://zhoujin.com/post/87/</guid> 
<description>
<![CDATA[ 
	JSP内置对象(9个常用的内置对象) <br/><br/>1.request对象 <br/><br/>客户端的请求信息被封装在request对象中，通过它才能了解到客户的需求，然后做出响应。它是HttpServletRequest类的实例。 <br/><br/>序号 方 法 说 明 <br/><br/>1 object getAttribute(String name) 返回指定属性的属性值 <br/><br/>2 Enumeration getAttributeNames() 返回所有可用属性名的枚举 <br/><br/>3 String getCharacterEncoding() 返回字符编码方式 <br/><br/>4 int getContentLength() 返回请求体的长度（以字节数） <br/><br/>5 String getContentType() 得到请求体的MIME类型 <br/><br/>6 ServletInputStream getInputStream() 得到请求体中一行的二进制流 <br/><br/>7 String getParameter(String name) 返回name指定参数的参数值 <br/><br/>8 Enumeration getParameterNames() 返回可用参数名的枚举 <br/><br/>9 String[] getParameterValues(String name) 返回包含参数name的所有值的数组 <br/><br/>10 String getProtocol() 返回请求用的协议类型及版本号 <br/><br/>11 String getScheme() 返回请求用的计划名,如:http.https及ftp等 <br/><br/>12 String getServerName() 返回接受请求的服务器主机名 <br/><br/>13 int getServerPort() 返回服务器接受此请求所用的端口号 <br/><br/>14 BufferedReader getReader() 返回解码过了的请求体 <br/><br/>15 String getRemoteAddr() 返回发送此请求的客户端IP地址 <br/><br/>16 String getRemoteHost() 返回发送此请求的客户端主机名 <br/><br/>17 void setAttribute(String key,Object obj) 设置属性的属性值 <br/><br/>18 String getRealPath(String path) 返回一虚拟路径的真实路径 <br/><br/>2.response对象 <br/><br/>response对象包含了响应客户请求的有关信息，但在JSP中很少直接用到它。它是HttpServletResponse类的实例。 <br/><br/>序号 方 法 说 明 <br/><br/>1 String getCharacterEncoding() 返回响应用的是何种字符编码 <br/><br/>2 ServletOutputStream getOutputStream() 返回响应的一个二进制输出流 <br/><br/>3 PrintWriter getWriter() 返回可以向客户端输出字符的一个对象 <br/><br/>4 void setContentLength(int len) 设置响应头长度 <br/><br/>5 void setContentType(String type) 设置响应的MIME类型 <br/><br/>6 sendRedirect(java.lang.String location) 重新定向客户端的请求 <br/><br/>　 <br/>3.session对象 <br/><br/>session对象指的是客户端与服务器的一次会话，从客户连到服务器的一个WebApplication开始，直到客户端与服务器断开连接为止。它是HttpSession类的实例. <br/><br/>序号 方 法 说 明 <br/><br/>1 long getCreationTime() 返回SESSION创建时间 <br/><br/>2 public String getId() 返回SESSION创建时JSP引擎为它设的惟一ID号 <br/><br/>3 long getLastAccessedTime() 返回此SESSION里客户端最近一次请求时间 <br/><br/>4 int getMaxInactiveInterval() 返回两次请求间隔多长时间此SESSION被取消(ms) <br/><br/>5 String[] getValueNames() 返回一个包含此SESSION中所有可用属性的数组 <br/><br/>6 void invalidate() 取消SESSION，使SESSION不可用 <br/><br/>7 boolean isNew() 返回服务器创建的一个SESSION,客户端是否已经加入 <br/><br/>8 void removeValue(String name) 删除SESSION中指定的属性 <br/><br/>9 void setMaxInactiveInterval() 设置两次请求间隔多长时间此SESSION被取消(ms) <br/><br/>4.out对象 <br/><br/>out对象是JspWriter类的实例,是向客户端输出内容常用的对象 <br/><br/>序号 方 法 说 明 <br/><br/>1 void clear() 清除缓冲区的内容 <br/><br/>2 void clearBuffer() 清除缓冲区的当前内容 <br/><br/>3 void flush() 清空流 <br/><br/>4 int getBufferSize() 返回缓冲区以字节数的大小，如不设缓冲区则为0 <br/><br/>5 int getRemaining() 返回缓冲区还剩余多少可用 <br/><br/>6 boolean isAutoFlush() 返回缓冲区满时，是自动清空还是抛出异常 <br/><br/>7 void close() 关闭输出流 <br/><br/>5.page对象 <br/><br/>page对象就是指向当前JSP页面本身，有点象类中的this指针，它是java.lang.Object类的实例 <br/><br/>序号 方 法 说 明 <br/><br/>1 class getClass 返回此Object的类 <br/><br/>2 int hashCode() 返回此Object的hash码 <br/><br/>3 boolean equals(Object obj) 判断此Object是否与指定的Object对象相等 <br/><br/>4 void copy(Object obj) 把此Object拷贝到指定的Object对象中 <br/><br/>5 Object clone() 克隆此Object对象 <br/><br/>6 String toString() 把此Object对象转换成String类的对象 <br/><br/>7 void notify() 唤醒一个等待的线程 <br/><br/>8 void notifyAll() 唤醒所有等待的线程 <br/><br/>9 void wait(int timeout) 使一个线程处于等待直到timeout结束或被唤醒 <br/><br/>10 void wait() 使一个线程处于等待直到被唤醒 <br/><br/>11 void enterMonitor() 对Object加锁 <br/><br/>12 void exitMonitor() 对Object开锁 <br/><br/><br/><br/>6.application对象 <br/><br/><br/>application对象实现了用户间数据的共享，可存放全局变量。它开始于服务器的启动，直到服务器的关闭，在此期间，此对象将一直存在；这样在用户的前后连接或不同用户之间的连接中，可以对此对象的同一属性进行操作；在任何地方对此对象属性的操作，都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。 <br/><br/><br/>序号 方 法 说 明 <br/><br/>1 Object getAttribute(String name) 返回给定名的属性值 <br/><br/>2 Enumeration getAttributeNames() 返回所有可用属性名的枚举 <br/><br/>3 void setAttribute(String name,Object obj) 设定属性的属性值 <br/><br/>4 void removeAttribute(String name) 删除一属性及其属性值 <br/><br/>5 String getServerInfo() 返回JSP(SERVLET)引擎名及版本号 <br/><br/>6 String getRealPath(String path) 返回一虚拟路径的真实路径 <br/><br/>7 ServletContext getContext(String uripath) 返回指定WebApplication的application对象 <br/><br/>8 int getMajorVersion() 返回服务器支持的Servlet API的最大版本号 <br/><br/>9 int getMinorVersion() 返回服务器支持的Servlet API的最大版本号 <br/><br/>10 String getMimeType(String file) 返回指定文件的MIME类型 <br/><br/>11 URL getResource(String path) 返回指定资源(文件及目录)的URL路径 <br/><br/>12 InputStream getResourceAsStream(String path) 返回指定资源的输入流 <br/><br/>13 RequestDispatcher getRequestDispatcher(String uripath) 返回指定资源的RequestDispatcher对象 <br/><br/>14 Servlet getServlet(String name) 返回指定名的Servlet <br/><br/>15 Enumeration getServlets() 返回所有Servlet的枚举 <br/><br/>16 Enumeration getServletNames() 返回所有Servlet名的枚举 <br/><br/>17 void log(String msg) 把指定消息写入Servlet的日志文件 <br/><br/>18 void log(Exception exception,String msg) 把指定异常的栈轨迹及错误消息写入Servlet的日志文件 <br/><br/>19 void log(String msg,Throwable throwable) 把栈轨迹及给出的Throwable异常的说明信息 写入Servlet的日志文件 <br/><br/>7.exception对象 <br/><br/><br/>exception对象是一个例外对象，当一个页面在运行过程中发生了例外，就产生这个对象。如果一个JSP页面要应用此对象，就必须把isErrorPage设为true，否则无法编译。他实际上是java.lang.Throwable的对象 <br/><br/><br/>序号 方 法 说 明 <br/><br/>1 String getMessage() 返回描述异常的消息 <br/><br/>2 String toString() 返回关于异常的简短描述消息 <br/><br/>3 void printStackTrace() 显示异常及其栈轨迹 <br/><br/>4 Throwable FillInStackTrace() 重写异常的执行栈轨迹 <br/><br/><br/><br/>8.pageContext对象 <br/><br/><br/>pageContext对象提供了对JSP页面内所有的对象及名字空间的访问，也就是说他可以访问到本页所在的SESSION，也可以取本页面所在的application的某一属性值，他相当于页面中所有功能的集大成者，它的本类名也叫pageContext。 <br/><br/><br/>序号 方 法 说 明 <br/><br/>1 JspWriter getOut() 返回当前客户端响应被使用的JspWriter流(out) <br/><br/>2 HttpSession getSession() 返回当前页中的HttpSession对象(session) <br/><br/>3 Object getPage() 返回当前页的Object对象(page) <br/><br/>4 ServletRequest getRequest() 返回当前页的ServletRequest对象(request) <br/><br/>5 ServletResponse getResponse() 返回当前页的ServletResponse对象(response) <br/><br/>6 Exception getException() 返回当前页的Exception对象(exception) <br/><br/>7 ServletConfig getServletConfig() 返回当前页的ServletConfig对象(config) <br/><br/>8 ServletContext getServletContext() 返回当前页的ServletContext对象(application) <br/><br/>9 void setAttribute(String name,Object attribute) 设置属性及属性值 <br/><br/>10 void setAttribute(String name,Object obj,int scope) 在指定范围内设置属性及属性值 <br/><br/>11 public Object getAttribute(String name) 取属性的值 <br/><br/>12 Object getAttribute(String name,int scope) 在指定范围内取属性的值 <br/><br/>13 public Object findAttribute(String name) 寻找一属性,返回起属性值或NULL <br/><br/>14 void removeAttribute(String name) 删除某属性 <br/><br/>15 void removeAttribute(String name,int scope) 在指定范围删除某属性 <br/><br/>16 int getAttributeScope(String name) 返回某属性的作用范围 <br/><br/>17 Enumeration getAttributeNamesInScope(int scope) 返回指定范围内可用的属性名枚举 <br/><br/>18 void release() 释放pageContext所占用的资源 <br/><br/>19 void forward(String relativeUrlPath) 使当前页面重导到另一页面 <br/><br/>20 void include(String relativeUrlPath) 在当前位置包含另一文件 <br/><br/><br/>9.config对象 <br/><br/><br/>config对象是在一个Servlet初始化时，JSP引擎向它传递信息用的，此信息包括Servlet初始化时所要用到的参数（通过属性名和属性值构成）以及服务器的有关信息（通过传递一个ServletContext对象） <br/><br/><br/>序号 方 法 说 明 <br/><br/>1 ServletContext getServletContext() 返回含有服务器相关信息的ServletContext对象 <br/><br/>2 String getInitParameter(String name) 返回初始化参数的值 <br/><br/>3 Enumeration getInitParameterNames() 返回Servlet初始化所需所有参数的枚举<br/>Tags - <a href="http://zhoujin.com/tags/jsp/" rel="tag">jsp</a> , <a href="http://zhoujin.com/tags/%25E5%2586%2585%25E7%25BD%25AE%25E5%25AF%25B9%25E8%25B1%25A1/" rel="tag">内置对象</a> , <a href="http://zhoujin.com/tags/request/" rel="tag">request</a> , <a href="http://zhoujin.com/tags/response/" rel="tag">response</a> , <a href="http://zhoujin.com/tags/application/" rel="tag">application</a> , <a href="http://zhoujin.com/tags/session/" rel="tag">session</a> , <a href="http://zhoujin.com/tags/out/" rel="tag">out</a> , <a href="http://zhoujin.com/tags/page/" rel="tag">page</a> , <a href="http://zhoujin.com/tags/pagecontext/" rel="tag">pagecontext</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/86/</link>
<title><![CDATA[JSP动作指令(6个常用的动作指令)]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[J2EE]]></category>
<pubDate>Thu, 01 May 2008 03:16:18 +0000</pubDate> 
<guid>http://zhoujin.com/post/86/</guid> 
<description>
<![CDATA[ 
	<p>一、Include指令<br />&lt;jsp:include&gt;标签表示包含一个静态的或者动态的文件。 <br />语法： <br />&lt;jsp:include page=&quot;path&quot; flush=&quot;true&quot; /&gt;<br />or<br />&lt;jsp:include page=&quot;path&quot; flush=&quot;true&quot;&gt;&lt;jsp:param name=&quot;paramName&quot; value=&quot;paramValue&quot; /&gt;&lt;/jsp:include&gt;<br />注： <br />1、page=&quot;path&quot; 为相对路径，或者代表相对路径的表达式。 <br />2、flush=&quot;true&quot; 必须使用flush为true，它默认值是false。 <br />3、&lt;jsp:param&gt;子句能让你传递一个或多个参数给动态文件，也可在一个页面中使用多个&lt;jsp:param&gt;来传递多个参数给动态文件。 <br /><br />二、Forward指令 <br />&lt;jsp:forward&gt;标签表示重定向一个静态html/jsp的文件，或者是一个程序段。<br />语法： <br />&lt;jsp:forward page=&quot;path&quot;/&gt;<br />or <br />&lt;jsp:forward page=&quot;path&quot;&gt;<br />&nbsp;&nbsp; &lt;jsp:param name=&quot;paramName&quot; value=&quot;paramValue&quot; /&gt;<br />&nbsp;&nbsp; &hellip;.<br />&lt;/jsp:forward&gt;<br />注： <br />1、page=&quot;path&quot; 为一个表达式，或者一个字符串。 <br />2、&lt;jsp:param&gt; name 指定参数名，value指定参数值。参数被发送到一个动态文件，参数可以是一个或多个值，而这个文件却必须是动态文件。要传递多个参数，则可以在一个JSP文件中使用多个&lt;jsp:param&gt;将多个参数发送到一个动态文件中。 </p><p>三、UseBean指令 <br />&lt;jsp:useBean&gt;标签表示用来在JSP页面中创建一个BEAN实例并指定它的名字以及作用范围。<br />语法： <br />&lt;jsp:useBean id=&quot;name&quot; scope=&quot;page &#124; request &#124; session &#124; application&quot; typeSpec /&gt;<br />其中typeSpec有以下几种可能的情况:<br />class=&quot;className&quot; &#124; class=&quot;className&quot; type=&quot;typeName&quot; &#124;beanName=&quot;beanName&quot; type=&quot;typeName&quot; &#124;type=&quot;typeName&quot; &#124;<br />注： 你必须使用class或type，而不能同时使用class和beanName。beanName表示Bean的名字，其形式为&ldquo;a.b.c&rdquo;。 </p><p>四、GetProperty指令 <br />&lt;jsp:getProperty&gt;标签表示获取BEAN的属性的值并将之转化为一个字符串，然后将其插入到输出的页面中。 <br />语法： <br />&lt;jsp:getProperty name=&quot;name&quot; property=&quot;propertyName&quot; /&gt;<br />注： <br />1、在使用&lt;jsp:getProperty&gt;之前，必须用&lt;jsp:useBean&gt;来创建它。 <br />2、不能使用&lt;jsp:getProperty&gt;来检索一个已经被索引了的属性。 <br />3、能够和JavaBeans组件一起使用&lt;jsp:getProperty&gt;，但是不能与Enterprise Java Bean一起使用。 </p><p>五、SetProperty指令<br />&lt;jsp:setProperty&gt;标签表示用来设置Bean中的属性值。<br />语法： <br />&lt;jsp:setProperty name=&quot;beanName&quot; prop_expr /&gt;<br />其中prop_expr有以下几种可能的情形： <br />property=&quot;*&quot; &#124; property=&quot;propertyName&quot; &#124; property=&quot;propertyName&quot; param=&quot;parameterName&quot; &#124;property=&quot;propertyName&quot; value=&quot;propertyValue&quot;<br />注： 使用 jsp:setProperty 来为一个Bean的属性赋值；可以使用两种方式来实现。 <br />1、在jsp:useBean后使用jsp:setProperty： <br />&lt;jsp:useBean id=&quot;myUser&quot; &hellip; /&gt;<br />&hellip;<br />&lt;jsp:setProperty name=&quot;user&quot; property=&quot;user&quot; &hellip; /&gt;<br />在这种方式中，jsp:setProperty将被执行。 <br />2、jsp:setProperty出现在jsp:useBean标签内： <br />&lt;jsp:useBean id=&quot;myUser&quot; &hellip; &gt;<br />&nbsp;&hellip;<br />&nbsp;&lt;jsp:setProperty name=&quot;user&quot; property=&quot;user&quot; &hellip; /&gt;<br />&lt;/jsp:useBean&gt;<br />在这种方式中，jsp:setProperty只会在新的对象被实例化时才将被执行。 <br />* 在&lt;jsp:setProperty&gt;中的name值应当和&lt;jsp:useBean&gt;中的id值相同。 </p><p>六、Plugin指令 <br />&lt;jsp:plugin&gt;标签表示执行一个applet或Bean，有可能的话还要下载一个Java插件用于执行它。 <br />语法： <br />&lt;jsp:plugin <br />type=&quot;bean &#124; applet&quot; <br />code=&quot;classFileName&quot; <br />codebase=&quot;classFileDirectoryName&quot; <br />[ name=&quot;instanceName&quot; ] <br />[ archive=&quot;URIToArchive, ...&quot; ] <br />[ align=&quot;bottom &#124; top &#124; middle &#124; left &#124; right&quot; ] <br />[ height=&quot;displayPixels&quot; ] <br />[ width=&quot;displayPixels&quot; ] <br />[ hspace=&quot;leftRightPixels&quot; ] <br />[ vspace=&quot;topBottomPixels&quot; ] <br />[ jreversion=&quot;JREVersionNumber &#124; 1.1&quot; ] <br />[ nspluginurl=&quot;URLToPlugin&quot; ] <br />[ iepluginurl=&quot;URLToPlugin&quot; ] &gt; <br />[ &lt;jsp:params&gt; <br />[ &lt;jsp:param name=&quot;parameterName&quot; value=&quot;&#123;parameterValue &#124; &lt;%= expression %&gt;&#125;&quot; /&gt; ]+ <br />&lt;/jsp:params&gt; ] <br />[ &lt;jsp:fallback&gt; text message for user &lt;/jsp:fallback&gt; ] <br />&lt;/jsp:plugin&gt; <br />注： <br />&lt;jsp:plugin&gt;元素用于在浏览器中播放或显示一个对象（典型的就是applet和Bean),而这种显示需要在浏览器的java插件。 <br />当Jsp文件被编译，送往浏览器时，&lt;jsp:plugin&gt;元素将会根据浏览器的版本替换成&lt;object&gt;或者&lt;embed&gt;元素。注意，&lt;object&gt;用于HTML 4.0 ，&lt;embed&gt;用于HTML 3.2。 <br />一般来说，&lt;jsp:plugin&gt;元素会指定对象是Applet还是Bean,同样也会指定class的名字，还有位置，另外还会指定将从哪里下载这个Java插件。</p><br/>Tags - <a href="http://zhoujin.com/tags/jsp/" rel="tag">jsp</a> , <a href="http://zhoujin.com/tags/%25E6%258C%2587%25E4%25BB%25A4/" rel="tag">指令</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/74/</link>
<title><![CDATA[Birt 2.2与struts 1.3.9整合]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Sat, 05 Apr 2008 11:33:10 +0000</pubDate> 
<guid>http://zhoujin.com/post/74/</guid> 
<description>
<![CDATA[ 
	此整合参考了ServletExample和SpringSide(春天的旁边1m03)中实现的例子!<br/>1.去<a href="http://www.eclipse.org/birt/" target="_blank">www.eclipse.org/birt/</a>上下载birt-runtime-2_2_0.zip<br/><br/>2.在%WEB_APP%/WEB-INF/下新建一文件夹"platform""<br/><br/>3.把刚下载的birt-runtime-2_2_0.zip包中的ReportEngine目录下的"configuration"和"plugins"复制到%WEB_APP%/WEB-INF/platform/下<br/><br/>4.把ReportEngine目录下的"lib"里面的jar文件复制到%WEB_APP%/WEB-INF/lib/下面<br/><br/>5.对ActionServlet进行扩展<br/><div class="code"><br/>/**<br/>* 对Struts进行扩展，实现Hibernate的初始化以及参数编码的自动处理<br/>* <br/>* @author &#91;email&#93;chirs@zhoujin.com&#91;/email&#93;<br/>*/<br/>public class FreeOCS_ActionServlet extends ActionServlet &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;private static final long serialVersionUID = 1L;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String encoding;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void init() throws ServletException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletContext context = getServletContext();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (Globals.WEBAPP_PATH == null) Globals.WEBAPP_PATH = context.getRealPath(&quot;&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 初始化系统安全控制<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;KukeSecurityManager.init(context);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; catch (IOException e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new ServletException(e);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 执行Struts的初始化过程<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.init();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BirtEngine.initBirtConfig();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoding = getInitParameter(&quot;encoding&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (encoding == null) encoding = Globals.ENC_UTF_8;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 实现对编码的自动转码处理<br/>&nbsp;&nbsp;&nbsp;&nbsp; * <br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param req<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param res<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @throws ServletException<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @throws IOException<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @see org.apache.struts.action.ActionServlet#process(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected void process(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest request;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (RequestUtils.isMultipart(req)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 文件表单的编码处理<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request = req;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setCharacterEncoding(encoding);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 自动编码处理<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String enc = req.getCharacterEncoding();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (req instanceof RequestProxy) request = req;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (encoding.equalsIgnoreCase(enc)) request = req;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else request = new RequestProxy(req, encoding);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.process(request, res);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public void destroy() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 释放Struts<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.destroy();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BirtEngine.destroyBirtEngine();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/></div><br/>6.BirtEngine.java<br/><div class="code">public class BirtEngine &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private static IReportEngine birtEngine = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private static Properties configProps = new Properties();<br/>&nbsp;&nbsp;&nbsp;&nbsp;private final static String configFile = &quot;ReportConfig.properties&quot;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public static synchronized void initBirtConfig() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadEngineProps();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public static synchronized IReportEngine getBirtEngine(ServletContext sc) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (birtEngine == null) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EngineConfig config = new EngineConfig();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (configProps != null) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String logLevel = configProps.getProperty(&quot;logLevel&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Level level = Level.OFF;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (&quot;SEVERE&quot;.equalsIgnoreCase(logLevel)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level = Level.SEVERE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if (&quot;WARNING&quot;.equalsIgnoreCase(logLevel)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level = Level.WARNING;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if (&quot;INFO&quot;.equalsIgnoreCase(logLevel)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level = Level.INFO;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if (&quot;CONFIG&quot;.equalsIgnoreCase(logLevel)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level = Level.CONFIG;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if (&quot;FINE&quot;.equalsIgnoreCase(logLevel)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level = Level.FINE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if (&quot;FINER&quot;.equalsIgnoreCase(logLevel)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level = Level.FINER;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if (&quot;FINEST&quot;.equalsIgnoreCase(logLevel)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level = Level.FINEST;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if (&quot;OFF&quot;.equalsIgnoreCase(logLevel)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;level = Level.OFF;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config.setLogConfig(configProps.getProperty(&quot;logDirectory&quot;), level);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config.setEngineHome(&quot;&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IPlatformContext context = new PlatformServletContext(sc);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;config.setPlatformContext(context);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Platform.startup(config);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; catch (BirtException e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IReportEngineFactory factory = (IReportEngineFactory) Platform.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;birtEngine = factory.createReportEngine(config);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return birtEngine;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public static synchronized void destroyBirtEngine() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (birtEngine == null) &#123; return; &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;birtEngine.destroy();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Platform.shutdown();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;birtEngine = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public Object clone() throws CloneNotSupportedException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new CloneNotSupportedException();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;private static void loadEngineProps() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Config File must be in classpath<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ClassLoader cl = Thread.currentThread().getContextClassLoader();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream in = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in = cl.getResourceAsStream(configFile);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;configProps.load(in);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; catch (IOException e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/></div><br/>7.ActionBase.java<br/><div class="code">/**<br/>* * <br/>* @author &#91;email&#93;chirs@zhoujin.com&#91;/email&#93;<br/>*/<br/>public abstract class ActionBase extends Action &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;final static String ISO8859_1 = &quot;8859_1&quot;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;protected static String FORWARD_LIST = &quot;list&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected static String FORWARD_CREATE = &quot;create&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected static String FORWARD_EDIT = &quot;edit&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected static String FORWARD_UPDATE = &quot;update&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected static String FORWARD_ERROR = &quot;error&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected static String FORWARD_HTMLERROR = &quot;htmlError&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public final static String METHOD_IDENT_PARAM = &quot;__method&quot;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;protected final Log log = LogFactory.getLog(this.getClass().getName());<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;private IReportEngine birtReportEngine = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 查询结果列表<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;private List resultList;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 设计文件的在web应用中的相对路径,不含context path. eg. /reports/sale_report.rptdesign<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String designFile = null;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 图片生成目录在web应用中的相对路径,,不含context path eg. &quot;/plugins-demo/birt/sale_report.rptdesign/birt/images<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String imageDirectory = null;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;private String scriptableJOName = &quot;dsFactory&quot;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 在页面上显示的图片链接,是与请求url的相对路径<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String baseImageUrl = &quot;images&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 输出格式参数<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String format = &quot;pdf&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 打开报表设计文件(.rptdesign)<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void openReportDesign(String file) throws IOException, EngineException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;designFile = file;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 设置图片目录<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setImageDirectory(String imageDirectory) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.imageDirectory = imageDirectory;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 设置图片地址<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setBaseImageUrl(String baseImageUrl) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.baseImageUrl = baseImageUrl;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 设置报表输出格式<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setFormat(String format) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.format = format;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setScriptableJOName(String scriptableJOName) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.scriptableJOName = scriptableJOName;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 放入查询结果数据<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void putModel(List list) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultList = list;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;protected ServletContext context() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return servlet.getServletContext();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;protected ServletConfig config() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return servlet.getServletConfig();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * birt 运行<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings(&quot;deprecation&quot;)<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected void outputReport(HttpServletRequest request, HttpServletResponse response) throws IOException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (format == null &#124;&#124; format.equalsIgnoreCase(&quot;html&quot;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(&quot;text/html&quot;);// 用HTML方式显示<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(&quot;application/pdf&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// response.setHeader(&quot;Content-Disposition&quot;, &quot;inline; filename=test.pdf&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader(&quot;Content-Disposition&quot;, &quot;attachment; filename=test.pdf&quot;);// 下载<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServletContext sc = request.getSession().getServletContext();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;birtReportEngine = BirtEngine.getBirtEngine(sc);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IReportRunnable design;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Open report design<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;design = birtReportEngine.openReportDesign(sc.getRealPath(&quot;/reports&quot;) + &quot;/&quot; + designFile);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// create task to run and render report<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IRunAndRenderTask task = birtReportEngine.createRunAndRenderTask(design);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BirtDataSourceObject birtDataSourceObject = new BirtDataSourceObject();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 设置输出选项<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTMLRenderOption options = new HTMLRenderOption();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;birtDataSourceObject.setResultList(resultList);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.setBaseImageURL(request.getContextPath() + imageDirectory);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.setImageDirectory(sc.getRealPath(baseImageUrl));<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (format == null &#124;&#124; format.equalsIgnoreCase(&quot;html&quot;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(&quot;text/html&quot;);// 用HTML方式显示<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_HTML);// HTML<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.setOutputFormat(HTMLRenderOption.OUTPUT_FORMAT_PDF);// PDF<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;options.setOutputStream(response.getOutputStream());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task.setRenderOption(options);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task.addScriptableJavaObject(scriptableJOName, birtDataSourceObject);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// run report<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task.run();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;task.close();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; catch (Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;</div><br/>8.BirtDataSourceObject.java<br/><div class="code">/**<br/>* <br/>* @author &#91;email&#93;chirs@zhoujin.com&#91;/email&#93;<br/>*/<br/>public class BirtDataSourceObject &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private List resultList = new ArrayList();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public List getResultList() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return resultList;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setResultList(List resultList) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.resultList = resultList;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;</div><br/><br/><br/>测试：<br/>1.BaseTestListAction.java<br/><div class="code">public class BaseTestListAction extends ActionBase &#123;<br/>public ActionForward doExecute(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.setFormat(&quot;pdf&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.openReportDesign(&quot;test.rptdesign&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;ViewListBean&gt; list=new ArrayList&lt;ViewListBean&gt;();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ViewListBean oa=new ViewListBean();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oa.setAnnexa(&quot;测试1&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oa.setAnnexb(&quot;测试2&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oa.setAnnexc(&quot;测试3&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(oa);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ViewListBean ob=new ViewListBean();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ob.setAnnexa(&quot;测试4&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ob.setAnnexb(&quot;测试5&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ob.setAnnexc(&quot;测试6&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(ob);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ViewListBean oc=new ViewListBean();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oc.setAnnexa(&quot;测试7&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oc.setAnnexb(&quot;测试8&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;oa.setAnnexc(&quot;测试9&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(oc);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.putModel(list);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outputReport(request,response);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;</div><br/>2.在open中输入<br/><div class="code">rtn = dsFactory.getResultList();<br/>totalrows = rtn.size();<br/>currentrow=0;</div><br/>3.在fetch中输入<br/><div class="code">if(currentrow &gt;= totalrows)&#123;<br/>return false;<br/>&#125;<br/>row&#91;&quot;annexa&quot;&#93; = rtn.get(currentrow).getAnnexa();<br/>row&#91;&quot;annexb&quot;&#93; = rtn.get(currentrow).getAnnexb();<br/>row&#91;&quot;annexc&quot;&#93; = rtn.get(currentrow).getAnnexb();<br/>currentrow++;<br/>return true;</div><br/>4.在close中输入<br/><div class="code">rtn = null;</div><br/>Tags - <a href="http://zhoujin.com/tags/birt/" rel="tag">birt</a> , <a href="http://zhoujin.com/tags/struts/" rel="tag">struts</a> , <a href="http://zhoujin.com/tags/action/" rel="tag">action</a> , <a href="http://zhoujin.com/tags/%25E6%2595%25B4%25E5%2590%2588/" rel="tag">整合</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/72/</link>
<title><![CDATA[简简单单的感觉]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Sat, 15 Mar 2008 10:39:26 +0000</pubDate> 
<guid>http://zhoujin.com/post/72/</guid> 
<description>
<![CDATA[ 
	不喜欢被人拿去作比较!更不喜欢看到别人整天无所事事比来比去！ <br/><br/>因为比较得到的,或是骄傲自豪,或是黯然伤神,更根本的不好点是:很容易让人迷失了自我,忘记了自己真正想要的东西!!! <br/><br/>但是,人就是在这种比较中长大成熟,找到自己真正想要的东西的!!因为人,就是生活在环境中的!!!! <br/><br/>很高兴换来的是别人的嫉妒,JIAOJIAO的骄傲感觉!哈哈 被幸福包围的感觉,飘飘欲仙的感觉,还被幸福冲昏的头脑~~~~~~~~ <br/><br/>其实很简单,简简单单的感觉,真实而平华..<br/>Tags - <a href="http://zhoujin.com/tags/%25E7%25AE%2580%25E5%258D%2595/" rel="tag">简单</a> , <a href="http://zhoujin.com/tags/%25E6%2584%259F%25E8%25A7%2589/" rel="tag">感觉</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/75/</link>
<title><![CDATA[有关Servlet Example在2.2版本中使用]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Wed, 05 Mar 2008 02:31:36 +0000</pubDate> 
<guid>http://zhoujin.com/post/75/</guid> 
<description>
<![CDATA[ 
	在2.2版本中<br/><div class="code">//setup image directory<br/>HTMLRenderContext renderContext = new HTMLRenderContext();<br/>renderContext.setBaseImageURL(req.getContextPath()+&quot;/images&quot;);<br/>renderContext.setImageDirectory(sc.getRealPath(&quot;/images&quot;));<br/><br/>logger.log( Level.FINE, &quot;image directory &quot; + sc.getRealPath(&quot;/images&quot;));&nbsp;&nbsp;<br/>System.out.println(&quot;stdout image directory &quot; + sc.getRealPath(&quot;/images&quot;));<br/><br/>HashMap&lt;String, HTMLRenderContext&gt; contextMap = new HashMap&lt;String, HTMLRenderContext&gt;();<br/>contextMap.put( EngineConstants.APPCONTEXT_HTML_RENDER_CONTEXT, renderContext );</div><br/><div class="code">task.setAppContext( contextMap );</div><br/>会提示不建议使用的类和方法之类，建议的用法是<br/><div class="code">//setup image directory<br/>options.setBaseImageURL(req.getContextPath() + &quot;/images&quot;);<br/>options.setImageDirectory(sc.getRealPath(&quot;/images&quot;));</div><br/>原来的方法全部去掉<br/><br/>另外我遇到一个还没有找到解决的办法<br/><div class="code">task.addScriptableJavaObject(...);</div><br/>Tags - <a href="http://zhoujin.com/tags/birt/" rel="tag">birt</a> , <a href="http://zhoujin.com/tags/servlet/" rel="tag">servlet</a> , <a href="http://zhoujin.com/tags/example/" rel="tag">example</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/71/</link>
<title><![CDATA[拂过]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Thu, 14 Feb 2008 10:38:04 +0000</pubDate> 
<guid>http://zhoujin.com/post/71/</guid> 
<description>
<![CDATA[ 
	<p>打开窗，一丝一缕，然后是阵阵轻舞的风，风拂过，记忆会如蓓蕾慢慢绽开。 <br />于是，我会站立在风中，顺着风的方向遥望已逝的韶光，回忆过去的点点滴滴。这一年又从指间溜走了，如黄沙，流水般，我，拥有了什么？ </p><p>我已学会告诉自己：有时失去是一种拥有，有时跌倒是一份财富。宁静致远，洗却浮躁与不安。既不忘乎所以又能泰然处之；既不囿于寂寞忧郁又能望眼欲穿。 <br />夹着寒意的风啊，轻柔地拂过我的心，如拂尘般拂去我心中一年的灰尘&hellip;&hellip;风的尽头是什么？</p><br/>Tags - <a href="http://zhoujin.com/tags/%25E5%25BF%2583/" rel="tag">心</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/70/</link>
<title><![CDATA[随想]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Fri, 25 Jan 2008 10:35:52 +0000</pubDate> 
<guid>http://zhoujin.com/post/70/</guid> 
<description>
<![CDATA[ 
	<div>每个人在内心里可能都曾经有过一段刻骨铭心的爱恋纠缠，爱有多重伤就有多痛。也许只有经过岁月的洗礼，过往的伤痛才会痊愈结痂，变成我们胸口的一粒朱砂，心头的一块烙印，记忆里的一枚印章，那么我们只能审视自己，正视过去，过去的伤痛才永远不能阻隔你的将来！</div><div>我们会与很多人遇见，但只有少数人能拨动我们的心弦，有些人会在特定的时间出现，有些人会在一定的时间消失，结局谁也无法预测，但我们至少可以把握现在. <br />&nbsp;<br />试去尘埃，让过去的一切变成一盏灯，让它照亮我们幸福的将来，或许，属于你我的那枚爱情果就在不远的将来，它会忠于幸福。。。。。。。。。。</div><br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259A%258F%25E6%2583%25B3/" rel="tag">随想</a> , <a href="http://zhoujin.com/tags/%25E6%2588%2591%25E4%25BB%25AC/" rel="tag">我们</a> , <a href="http://zhoujin.com/tags/%25E7%2588%25B1%25E6%2583%2585/" rel="tag">爱情</a> , <a href="http://zhoujin.com/tags/%25E5%25B9%25B8%25E7%25A6%258F/" rel="tag">幸福</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/69/</link>
<title><![CDATA[2007年这一年]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Mon, 31 Dec 2007 15:59:59 +0000</pubDate> 
<guid>http://zhoujin.com/post/69/</guid> 
<description>
<![CDATA[ 
	<p>2007年的最后一小时，看样子不会再有什么奇迹在我身上发生，就此作罢，粗略盘点一下： </p><p>这一年，工作一年，简直就成了一个空中飞人了，不停的出差； </p><p>这一年，认识了一些人，结交了几个新朋友，虽然老朋友们中尚未出现弃我而去的现象，但对于世事无常和人情冷暖的感慨却一再涌上心头； </p><p>这一年，依然怀着周游世界的梦想，但实际上只到过一次黄果树； </p><p>这一年，曾经列了阅读的计划，庞杂的书目反映了对知识的狂热渴求，但执行的不力又充分说明这狂热会迅速退烧； </p><p>这一年，购置了一处豪宅，日后的幸福生活有了全新的屋檐，但也为之高筑债台，估计银行会不停追讨超过30年； </p><p>这一年，重新变回了网虫，主要的原因是在很长一段时间里我都在学习当中； </p><p>这一年，第一个属于自己的技术框架基本上上完成了;</p><p>这一年，对于自己有一个很明确的技术目标！</p><p>这一年，被自己重新认识，惊讶地发现居然还存在着坚强与乐观的品格，但也失望地看到许多不足无力弥补，最大一个就是无论怎么进补也改变不了身材的瘦削； </p><p>这一年，缺席了一个同学会，但重新联系上的同学预计会很不少； </p><p>这一年，很多的想法破灭，又有很多想法发生，这些还没来得及破灭的想法只有留待来年&hellip;&hellip; </p><br/>Tags - <a href="http://zhoujin.com/tags/2007/" rel="tag">2007</a> , <a href="http://zhoujin.com/tags/%25E7%2594%259F%25E6%25B4%25BB/" rel="tag">生活</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/76/</link>
<title><![CDATA[谢谢你]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Tue, 30 Oct 2007 07:08:25 +0000</pubDate> 
<guid>http://zhoujin.com/post/76/</guid> 
<description>
<![CDATA[ 
	--其实我也知道，你所说的谢谢你，是谢谢我离开了你的世界。让你可以像今天这样再也没有负担地生活。<br/>--我虽然会因为听到这样的话而感受到心痛。可是看见你现在幸福的样子，我也真的觉得很幸福。<br/>--以前我每次听到都会不悄的歌曲，那天也让我流泪了。那首歌叫《很爱很爱你》。
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/68/</link>
<title><![CDATA[话说技术含量？]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Tue, 23 Oct 2007 14:07:13 +0000</pubDate> 
<guid>http://zhoujin.com/post/68/</guid> 
<description>
<![CDATA[ 
	<p>　　前天在吃午饭时，跟同事突然说起弹吉他的事情，不知怎么说到谈得不好的人就跟弹棉花一样。我却不大乐意，反问一句：你见过弹棉花没？他摇头。我就跟他解释如何弹棉花，解释弹棉花的韵律和美感。他依然一头雾水，却最终同意弹棉花也并非意味着毫无技术含量。</p><p>　　记得小时候，在一个比被子稍大的房间，任何一个弹花匠都可以踩着四四拍，三下闷音一下长音或者两短一长一短，几小时内弹出一床厚厚的棉被来。</p><br/>Tags - <a href="http://zhoujin.com/tags/%25E5%25BC%25B9%25E6%25A3%2589%25E8%258A%25B1/" rel="tag">弹棉花</a> , <a href="http://zhoujin.com/tags/%25E6%258A%2580%25E6%259C%25AF/" rel="tag">技术</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/80/</link>
<title><![CDATA[如何自定义事件]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[BUFFALO]]></category>
<pubDate>Fri, 03 Aug 2007 07:41:06 +0000</pubDate> 
<guid>http://zhoujin.com/post/80/</guid> 
<description>
<![CDATA[ 
	　　在buffalo推出session的支持后，许多人开始在服务中调用<br/><div class="code">RequestContext.getContext().getSession()</div><br/>　　等操作来获取服务器状态信息，最常见的就是在很多OA应用中，绝大部分操作都需要用户登录才能使用。这种场景的常见处理办法是先判断用户是否登录，然后再调用某­些方法。例如，一个列出用户所有的文档： <br/><div class="code">buffalo.remoteCall(&quot;userService.isLogin&quot;, &#91;&#93;, function(reply) &#123; <br/>　if (reply.getResult()) &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　buffalo.remoteCall(&quot;bookService.listAllBooks&quot;, &#91;&#93;, function(reply)&#123; ... &#125;) <br/>&nbsp;&nbsp;　&#125; else &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;　　alert(&quot;请先登录&quot;) <br/>&nbsp;&nbsp;　&#125; <br/>&#125;) </div><br/>　　如果只有一两个这样的案例还好，如果多起来的话，会显得相当麻烦。实际上buffalo已经支持了自定义事件。在spring的拦截器的帮助下，可以实现编程的­简化，以及一致性的错误控制。 <br/>　　实现方式：<br/>　　１.编写一个spring 拦截器，将其配置到需要进行拦截的服务中，其中代码片段如下： <br/><br/><div class="code">public class RequiredLoginInterceptor implements MehtodInterceptor &#123; <br/>　　public Object invoke(MethodInvocation invoke) ...&#123; <br/>&nbsp;&nbsp; 　　　String username = RequestContext.getSession().get(&quot;username&quot;); <br/>&nbsp;&nbsp; 　　　 　if (username == null) &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;　　　　throw new RequiredLoginException(&quot;Please login first!&quot;); <br/>&nbsp;&nbsp; 　　　 　&#125; <br/>&nbsp;&nbsp;&nbsp;&nbsp;　　　　return invoke.proceed(); <br/> 　　　 　&#125; <br/>&#125; </div><br/>　　２.在客户端需要调用的地方，重写onException方法： <br/><br/><div class="code">var buffalo = new ... <br/>buffalo.events&#91;&quot;onException&quot;&#93; = function(fault) &#123; <br/>　　if (fault.code == &quot;your.domain.RequiredLoginException&quot;) &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;　　alert(&quot;请先登录！&quot;); <br/>&nbsp;&nbsp;&nbsp;&nbsp;　　//或者其他处理 <br/> 　　 &#125; <br/>&#125; </div><br/><br/>　　这样写完之后，所有出现exception的地方都会被这个方法来调用。因此本文开头的案例可以直接写为： <br/><br/><div class="code">buffalo.remoteCall(&quot;bookService.listAllBooks&quot;, &#91;&#93;, function(reply)&#123; ... &#125;) </div><br/><br/>　　当需要集中处理某一类的异常的时候，这是一种相当简单的做法。buffalo已经提供了这个支持。<br/>补spring配置方式:<br/><br/><div class="code">&lt;bean id=&quot;requiredLogin&quot; class=&quot;your.domain.RequiredLoginInterceptor&quot;/&gt;<br/>&nbsp;&nbsp;&lt;bean class=&quot;org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name=&quot;beanNames&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;!-- 在这里可以声明多个需要拦截的bean　--&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;...&lt;/value&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;property name=&quot;interceptorNames&quot;&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;list&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;value&gt;requiredLogin&lt;/value&gt;&nbsp;&nbsp;&lt;!-- 同样，在这里可以声明多个拦截器，注意次序前后　--&gt;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/list&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&lt;/property&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&lt;/bean&gt;</div><br/>Tags - <a href="http://zhoujin.com/tags/buffalo/" rel="tag">buffalo</a> , <a href="http://zhoujin.com/tags/ajax/" rel="tag">ajax</a> , <a href="http://zhoujin.com/tags/%25E4%25BA%258B%25E4%25BB%25B6/" rel="tag">事件</a> , <a href="http://zhoujin.com/tags/%25E5%25AE%259A%25E4%25B9%2589/" rel="tag">定义</a> , <a href="http://zhoujin.com/tags/exception/" rel="tag">exception</a> , <a href="http://zhoujin.com/tags/spring/" rel="tag">spring</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/79/</link>
<title><![CDATA[API 参考]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[BUFFALO]]></category>
<pubDate>Tue, 03 Jul 2007 07:38:39 +0000</pubDate> 
<guid>http://zhoujin.com/post/79/</guid> 
<description>
<![CDATA[ 
	<h3><a name="JavaScriptAPI-%E7%B1%BBBuffalo" title="JavaScriptAPI-%E7%B1%BBBuffalo"></a>类Buffalo </h3><p>在一般的情况下，Buffalo类可以解决大多数的问题</p><p><strong>Buffalo(gateway, async, events, options)</strong> </p><table border="0" class="confluenceTable"><tbody><tr><th class="confluenceTh">参数名称</th><th class="confluenceTh">参数类型</th><th class="confluenceTh">参数说明</th><th class="confluenceTh">是否必须</th><th class="confluenceTh">默认值</th></tr><tr><td class="confluenceTd">gateway </td><td class="confluenceTd">string </td><td class="confluenceTd">Bufapp Servlet的地址 </td><td class="confluenceTd">true </td><td class="confluenceTd">N/A</td></tr><tr><td class="confluenceTd">async </td><td class="confluenceTd">boolean </td><td class="confluenceTd">是否异步请求 </td><td class="confluenceTd">false </td><td class="confluenceTd">true</td></tr><tr><td class="confluenceTd">events </td><td class="confluenceTd">object </td><td class="confluenceTd">待响应的事件 </td><td class="confluenceTd">false </td><td class="confluenceTd">参见 <a href="read.php?80" title="自定义事件 on 如何...">如何自定义事件</a> </td></tr><tr><td class="confluenceTd">options </td><td class="confluenceTd">object </td><td class="confluenceTd">其他选项 </td><td class="confluenceTd">false </td><td class="confluenceTd">timeout=10000</td></tr></tbody></table><p><br />Buffalo类的构造方法示例：</p><div class="code"><div class="codeContent"><pre class="code-java"><span class="code-keyword">var</span> buffalo = <span class="code-keyword">new</span> Buffalo(<span class="code-quote">&quot;/bfapp/buffalo&quot;</span>);</pre></div></div><p>发送一个异步请求: </p><div class="code"><div class="codeContent"><pre class="code-java"><span class="code-keyword">var</span> buffalo = <span class="code-keyword">new</span> Buffalo(<span class="code-quote">&quot;/bfapp/buffalo&quot;</span>, <span class="code-keyword">false</span>);</pre></div></div><p><br /><strong>remoteCall(service, params, callback)</strong></p><p>remoteCall 会封装所有指定的参数来远程调用指定的服务，并且用回调方法处理结果</p><table border="0" class="confluenceTable"><tbody><tr><th class="confluenceTh">参数名称</th><th class="confluenceTh">参数类型</th><th class="confluenceTh">参数说明</th><th class="confluenceTh">是否必须</th><th class="confluenceTh">默认值</th></tr><tr><td class="confluenceTd">service </td><td class="confluenceTd">string </td><td class="confluenceTd">服务的类名和方法名, 格式为 &quot;serviceName.methodName&quot; </td><td class="confluenceTd">true </td><td class="confluenceTd">N/A</td></tr><tr><td class="confluenceTd">params </td><td class="confluenceTd">Array </td><td class="confluenceTd">远程调用的参数 </td><td class="confluenceTd">true </td><td class="confluenceTd">N/A</td></tr><tr><td class="confluenceTd">callback </td><td class="confluenceTd">function </td><td class="confluenceTd">回调方法, 会将 Buffalo.Reply 作为此方法的参数 </td><td class="confluenceTd">true </td><td class="confluenceTd">N/A</td></tr></tbody></table><p>示例：</p><div class="code"><div class="codeContent"><pre class="code-java">buffalo.remoteCall(<span class="code-quote">&quot;helloService.hello&quot;</span>, ['Michael'], function(reply) &#123;&nbsp;&nbsp;&nbsp;&nbsp; alert(reply.getResult()); &#125;)</pre></div></div><p>reply.getResult() 方法会返回几乎和原始定义的Java对象一样的javascript对象</p><p>或者: </p><div class="code"><div class="codeContent"><pre class="code-java">buffalo.remoteCall(<span class="code-quote">&quot;helloService.hello&quot;</span>, ['Michael'], myfunc); function myfunc(reply) &#123;&nbsp;&nbsp; alert(reply.getResult()); &#125;</pre></div></div><ul><li>setEvents(events) </li></ul><p>setEvents 会为buffalo实例指定自定义的事件响应方法</p><table border="0" class="confluenceTable"><tbody><tr><th class="confluenceTh">参数名称</th><th class="confluenceTh">参数类型</th><th class="confluenceTh">参数说明</th><th class="confluenceTh">是否必须</th><th class="confluenceTh">默认值</th></tr><tr><td class="confluenceTd">events </td><td class="confluenceTd">object </td><td class="confluenceTd">事件响应 </td><td class="confluenceTd">true </td><td class="confluenceTd">N/A</td></tr></tbody></table><div class="code"><div class="codeContent"><pre class="code-java">buffalo.setEvents(&#123;onLoading:myloading&#125;&#125;) function myloading(state) &#123;&nbsp;&nbsp; <span class="code-keyword">if</span> (state) &#123;window.status = <span class="code-quote">&quot;loading...&quot;</span>; &#125;&nbsp;&nbsp;&nbsp;&nbsp;<span class="code-keyword">else</span> &#123;window.status = <span class="code-quote">&quot;load completed.&quot;</span>; &#125; &#125;</pre></div></div><p>或者可以直接这样做: </p><div class="code"><div class="codeContent"><pre class="code-java">buffalo.events[<span class="code-quote">&quot;onLoading&quot;</span>] = myloading;</pre></div></div><p><strong>bindReply(service, params, elementId)</strong></p><p>bindReply 会发送一个远程调用并且把返回的结果绑定指定的HTML元素</p><table border="0" class="confluenceTable"><tbody><tr><th class="confluenceTh">参数名称</th><th class="confluenceTh">参数类型</th><th class="confluenceTh">参数说明</th><th class="confluenceTh">是否必须</th><th class="confluenceTh">默认值</th></tr><tr><td class="confluenceTd">service </td><td class="confluenceTd">string </td><td class="confluenceTd">服务的类名和方法名, 格式为 &quot;serviceName.methodName&quot; </td><td class="confluenceTd">true </td><td class="confluenceTd">N/A</td></tr><tr><td class="confluenceTd">params </td><td class="confluenceTd">Array </td><td class="confluenceTd">远程调用的参数 </td><td class="confluenceTd">true </td><td class="confluenceTd">N/A</td></tr><tr><td class="confluenceTd">elementId </td><td class="confluenceTd">string </td><td class="confluenceTd">要绑定的html元素id </td><td class="confluenceTd">true </td><td class="confluenceTd">N/A</td></tr></tbody></table><p>举个简单例子：调用 simpleService.provincesNames 方法然后把返回的所有&quot;省&quot;绑定在 id=select_provinde的html元素上.<br />你可以阅读 <a href="read.php?78" title="绑定">绑定</a> 获得更多信息. </p><div class="code"><div class="codeContent"><pre class="code-java">buffalo.bindReply(<span class="code-quote">&quot;simpleService.provincesNames&quot;</span>,[],<span class="code-quote">&quot;select_province&quot;</span>);</pre></div></div><p><strong>switchView(viewName)</strong></p><p>switchView 会请求指定的 &lt;视图名称&gt; 然后把所有的内容加载到 id=body 的 div 元素中，并且会把此次操作记录在浏览器的历史记录中。从而可以方便地使用浏览器的前进&#92;后退功能</p><table border="0" class="confluenceTable"><tbody><tr><th class="confluenceTh">参数名称</th><th class="confluenceTh">参数类型</th><th class="confluenceTh">参数说明</th><th class="confluenceTh">是否必须</th><th class="confluenceTh">默认值</th></tr><tr><td class="confluenceTd">viewName </td><td class="confluenceTd">string </td><td class="confluenceTd">视图的url </td><td class="confluenceTd">true </td><td class="confluenceTd">N/A</td></tr></tbody></table><div class="code"><div class="codeContent"><pre class="code-java">buffalo.switchView(<span class="code-quote">&quot;help.html&quot;</span>);</pre></div></div><p><strong>switchPart(viewName, partId, addToHistory)</strong></p><p>switchPart 会请求指定的 &lt;视图名称&gt; 然后把所有的内容加载到 id=&lt;指定元素的id&gt; 的元素中，并且可以通过指定 &lt;addToHistory&gt;的参数来决定是否把此次操作记录在浏览器的历史记录中。</p><table border="0" class="confluenceTable"><tbody><tr><th class="confluenceTh">参数名称</th><th class="confluenceTh">参数类型</th><th class="confluenceTh">参数说明</th><th class="confluenceTh">是否必须</th><th class="confluenceTh">默认值</th></tr><tr><td class="confluenceTd">viewName </td><td class="confluenceTd">string </td><td class="confluenceTd">视图的url </td><td class="confluenceTd">true </td><td class="confluenceTd">N/A</td></tr><tr><td class="confluenceTd">partId </td><td class="confluenceTd">string </td><td class="confluenceTd">要替换的div元素的id </td><td class="confluenceTd">true </td><td class="confluenceTd">N/A</td></tr><tr><td class="confluenceTd">addToHistory </td><td class="confluenceTd">boolean </td><td class="confluenceTd">此操作是否加入浏览器历史 </td><td class="confluenceTd">true </td><td class="confluenceTd">N/A</td></tr></tbody></table><!-- <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:dc="http://purl.org/dc/elements/1.1/"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"> <rdf:Description&nbsp;&nbsp;&nbsp;&nbsp; rdf:about="http://confluence.redsaga.com/display/BUFFALO/JavaScript+API"&nbsp;&nbsp;&nbsp;&nbsp; dc:identifier="http://confluence.redsaga.com/display/BUFFALO/JavaScript+API"&nbsp;&nbsp;&nbsp;&nbsp; dc:title="JavaScript API"&nbsp;&nbsp;&nbsp;&nbsp; trackback:ping="http://confluence.redsaga.com/rpc/trackback/1649"/> </rdf:RDF> --><!--&nbsp;&nbsp;&nbsp;&nbsp; Root decorator: all decisions about how a page is to be decorated via the&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inline decoration begins here. --><!--&nbsp;&nbsp;&nbsp;&nbsp; Switch based upon the context. However, for now, just delegate to a decorator&nbsp;&nbsp;&nbsp;&nbsp; identified directly by the context. --><br/>Tags - <a href="http://zhoujin.com/tags/buffalo/" rel="tag">buffalo</a> , <a href="http://zhoujin.com/tags/ajax/" rel="tag">ajax</a> , <a href="http://zhoujin.com/tags/api/" rel="tag">api</a> , <a href="http://zhoujin.com/tags/%25E5%258F%2582%25E8%2580%2583/" rel="tag">参考</a> , <a href="http://zhoujin.com/tags/options/" rel="tag">options</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/78/</link>
<title><![CDATA[绑定]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[BUFFALO]]></category>
<pubDate>Sun, 03 Jun 2007 07:17:11 +0000</pubDate> 
<guid>http://zhoujin.com/post/78/</guid> 
<description>
<![CDATA[ 
	　　Buffalo支持将对象值绑定到DOM成员上，包括form成员（text, password, hidden, radio, checkbox,select, textarea），table, form, div/span，它也能转换form到具体java类型的对象。它只提供了一种能绑定所有类型值到不同form成员的便捷方法。<br/><br/>　　你可以如此轻松地使用绑定： <br/><div class="code">buffalo.bindReply(&quot;yourService.method&quot;, &#91;parameters&#93;, &quot;elementId&quot;)</div><br/>　　上面的代码片断尝试把"parameters"作为参数调用"yourService.method"，然后绑定调用结果给"elementId"。<br/><br/>　　如果你并不想作远程调用，也可以按下面的方式使用绑定： <br/><div class="code">Buffalo.Bind.bind(elementId, bindValue)</div><br/>　　它将绑定"bindValue"到"elementId" 。<br/><br/>　　<span style="color: #FF0000;">[注意]</span>：这里无需在意form成员的不同类型。buffalo将检查类型并完成正确的绑定行为。<br/><br/>　　<span style="font-size: 12px;">绑定form成员</span>：<br/>　　１.绑定text, hidden, password, textarea <br/>　　　　１.被绑定值的类型:原始类型如：String, int, long, float... <br/>　　　　２.行为:element.value=bindValue <br/>　　２.绑定checkbox, radio <br/>　　　　１.被绑定值的类型: 需要检查值是否为("true"&#124;"yes"&#124;"1"&#124;true&#124;1) <br/>　　　　２.行为: element.checked=bindValue==("true"&#124;"yes"&#124;"1"&#124;true&#124;1) <br/>　　３.绑定select <br/>　　　　１.被绑定值的类型:对象数组（Array of objects） <br/>　　　　２.行为:数组中每个成员（对象）增加一个option，select应用额外的<jtext>和<jvalue>属性来告诉绑定：对象的字段（field）如何绑定到text/value上。 <br/>　　　　３.特殊的必要条件:<jtext>和<jvalue>属性应该添加到select成员中，来告知select成员对象的字段（field）如何绑定。<br/><div class="code"><br/>&lt;select id=&quot;provinces&quot; jtext=&quot;name&quot; jvalue=&quot;value&quot;&gt;&lt;/select&gt;<br/><br/>/* Data */<br/>var data = &#91;&#123;name: &quot;Hu Bei&quot;, value:&quot;HB&quot;&#125; ,&#123;name: &quot;Shan Xi&quot;, value:&quot;SX&quot;&#125;&#93;<br/><br/>/* Binding */<br/>Buffalo.Bind.bind(&quot;provinces&quot;, data);<br/></div><br/> 当上面的例子执行时，select将增加两个option，option的text为data["name"]，value为data["value"]。<br/>　　<span style="font-size: 12px;">绑定表格</span><br/>　　绑定表格有一些复杂。有3种绑定表格的方式。你需要提供<table>的<jheight>属性和<td>的<jtext>属性。<br/>　　<jheight>属性告诉buffalo如何复制样式（style），<jtext>则告诉buffalo绑定值的哪个字段用于显示。<br/><br/>　　１.被绑定值的类型:对象数组（Array of objects） <br/>　　２.行为:因<jheight>属性值而不同 <br/>　　　　１.<jheight>=0时，它将删除表格的所有行，增加显示对象所有字段的行。 <br/>　　　　２.<jheight>=1时，它将表格的第一行视为表头，删除其余的所有行，增加显示对象[<jtext>]的行。 <br/>　　　　３.<jheight>=2时，它将表格的第一行视为表头、将第二行视为样式，删除其余的所有行，增加显示对象[<jtext>]的行。 <br/>　　　　４.<jheight>=3时，它将表格的第一行视为表头、将第二行视为奇数行样式、将第三行视为偶数行样式，删除其余的所有行，增加显示对象[<jtext>]的行。 <br/>　　３.特殊的必要条件:<table>的<jheight>属性和<td>的<jtext>属性。 <br/>　　例子:<br/><div class="code">&lt;table id=&quot;table&quot; jheight=&quot;0&quot;&gt;&lt;/table&gt;</div><br/>　　jheight=0, 表格上将显示出所有的绑定值。<br/><div class="code"><br/>&lt;table id=&quot;locales&quot; jheight=&quot;1&quot;&gt;<br/><br/>&lt;tr bgcolor=&quot;#FFCC00&quot;&gt;<br/><br/>&lt;td jtext=&quot;language&quot;&gt;Language&lt;/td&gt;<br/><br/>&lt;td width=&quot;300&quot; bgcolor=&quot;#FFCC00&quot; jtext=&quot;country&quot;&gt;Country&lt;/td&gt;<br/><br/>&lt;td jtext=&quot;variant&quot;&gt;variant&lt;/td&gt;<br/><br/>&lt;td jtext=&quot;hashcode&quot;&gt;Hashcode&lt;/td&gt;<br/><br/>&lt;/tr&gt;<br/><br/>&lt;/table&gt;<br/></div><br/>　　jheight=1, buffalo将使用第一行作为表头，显示所有的定义在<jtext>中的绑定值。<br/><div class="code"><br/>&lt;table id=&quot;locales&quot; jheight=&quot;2&quot;&gt;<br/><br/>&lt;tr bgcolor=&quot;#FFCC00&quot;&gt;<br/><br/>&lt;td jtext=&quot;language&quot;&gt;Language&lt;/td&gt;<br/><br/>&lt;td width=&quot;300&quot; bgcolor=&quot;#FFCC00&quot; jtext=&quot;country&quot;&gt;Country&lt;/td&gt;<br/><br/>&lt;td jtext=&quot;variant&quot;&gt;variant&lt;/td&gt;<br/><br/>&lt;td jtext=&quot;hashcode&quot;&gt;Hashcode&lt;/td&gt;<br/><br/>&lt;/tr&gt;<br/><br/>&lt;tr bgcolor=&quot;#ffff66&quot;&gt;<br/><br/>&lt;td&gt;a&lt;/td&gt;<br/><br/>&lt;td width=&quot;300&quot;&gt;d&lt;/td&gt;<br/><br/>&lt;td&gt;c&lt;/td&gt;<br/><br/>&lt;td&gt;d&lt;/td&gt;<br/><br/>&lt;/tr&gt;<br/><br/>&lt;/table&gt;<br/></div><br/>　　jheight=2, buffalo将使用第一行作为表头，第二行作为样式，显示所有的定义在<jtext>中的绑定值。<br/><div class="code"><br/>&lt;table id=&quot;locales&quot; jheight=&quot;3&quot;&gt;<br/><br/>&lt;tr bgcolor=&quot;#FFCC00&quot;&gt;<br/><br/>&lt;td jtext=&quot;language&quot;&gt;Language&lt;/td&gt;<br/><br/>&lt;td width=&quot;300&quot; bgcolor=&quot;#FFCC00&quot; jtext=&quot;country&quot;&gt;Country&lt;/td&gt;<br/><br/>&lt;td jtext=&quot;variant&quot;&gt;variant&lt;/td&gt;<br/><br/>&lt;td jtext=&quot;hashcode&quot;&gt;Hashcode&lt;/td&gt;<br/><br/>&lt;/tr&gt;<br/><br/>&lt;tr bgcolor=&quot;#ffff66&quot;&gt;<br/><br/>&lt;td&gt;a&lt;/td&gt;<br/><br/>&lt;td width=&quot;300&quot;&gt;d&lt;/td&gt;<br/><br/>&lt;td&gt;c&lt;/td&gt;<br/><br/>&lt;td&gt;d&lt;/td&gt;<br/><br/>&lt;/tr&gt;<br/><br/>&lt;tr bgcolor=&quot;#66ff66&quot;&gt;<br/><br/>&lt;td&gt;a&lt;/td&gt;<br/><br/>&lt;td width=&quot;300&quot;&gt;d&lt;/td&gt;<br/><br/>&lt;td&gt;c&lt;/td&gt;<br/><br/>&lt;td&gt;d&lt;/td&gt;<br/><br/>&lt;/tr&gt;<br/><br/>&lt;/table&gt;<br/></div><br/>　　jheight=3, buffalo将使用第一行作为表头，第二行作为奇数行样式，第三行作为偶数行样式，显示所有的定义在<jtext>中的绑定值。<br/>　　<span style="font-size: 12px;">绑定form</span><br/>　　Buffalo能直接绑定对象值到form中。<br/>　　１.被绑定值的类型:对象 <br/>　　２.行为:当同样的form成员名称存在于对象时，对象的相应值会被绑定到这个form成员上。对于checkbox/多项选择的select，使用数组类型的值去尝试check或select所有的checkbox或所有option。<br/>　　 示例:<br/><div class="code"><br/>/* Data */<br/><br/>var data = &#123;<br/><br/>username: &quot;Michael&quot;,<br/><br/>password: &quot;newpass&quot;,<br/><br/>gendor: &quot;boy&quot;,<br/><br/>interest: &#91;&quot;B&quot;,&quot;C&quot;&#93;,<br/><br/>option1: &#91;&quot;1&quot;,&quot;3&quot;&#93;,<br/><br/>option2: &quot;3&quot;<br/><br/>&#125;<br/><br/>&lt;!-- HTML --&gt;<br/><br/>&lt;form id=&quot;form3&quot; name=&quot;form3&quot;&gt;<br/><br/> &lt;label&gt;Username&lt;/label&gt;<br/><br/> &lt;input type=&quot;text&quot; name=&quot;username&quot; id=&quot;username&quot;&gt;<br/><br/> &lt;br&gt;<br/><br/> &lt;label&gt;Password&lt;/label&gt;<br/><br/>&lt;input type=&quot;text&quot; name=&quot;password&quot; id=&quot;label&quot;&gt;<br/><br/>&lt;br&gt;<br/><br/>Gendor:<br/><br/>&lt;input type=&quot;radio&quot; name=&quot;gendor&quot; value=&quot;boy&quot; id=&quot;radiobutton&quot;&gt;<br/><br/>&lt;label&gt;Boy&lt;/label&gt;<br/><br/>&lt;input type=&quot;radio&quot; name=&quot;gendor&quot; value=&quot;girl&quot; id=&quot;radio&quot;&gt;<br/><br/>&lt;label&gt;Girl&lt;/label&gt;<br/><br/>&lt;br&gt;<br/><br/>Interest:<br/><br/>&lt;input type=&quot;checkbox&quot; name=&quot;interest&quot; value=&quot;A&quot; id=&quot;interest&quot;&gt;<br/><br/>&lt;label&gt;A&lt;/label&gt;<br/><br/>&lt;input type=&quot;checkbox&quot; name=&quot;interest&quot; value=&quot;B&quot; id=&quot;interest&quot;&gt;<br/><br/>&lt;label&gt;B&lt;/label&gt;<br/><br/>&lt;input type=&quot;checkbox&quot; name=&quot;interest&quot; value=&quot;C&quot; id=&quot;interest&quot;&gt;<br/><br/>&lt;label&gt;C&lt;/label&gt;<br/><br/>&lt;br&gt;<br/><br/>&lt;label&gt;Option&lt;/label&gt;<br/><br/>&lt;select name=&quot;option1&quot; size=&quot;3&quot; multiple=&quot;true&quot;&gt;<br/><br/> &lt;option value=&quot;1&quot; selected&gt;Option1&lt;/option&gt;<br/><br/> &lt;option value=&quot;2&quot; selected&gt;Option2&lt;/option&gt;<br/><br/> &lt;option value=&quot;3&quot;&gt;Option3&lt;/option&gt;<br/><br/>&lt;/select&gt;<br/><br/>&lt;select name=&quot;option2&quot;&gt;<br/><br/> &lt;option value=&quot;1&quot;&gt;Option1&lt;/option&gt;<br/><br/> &lt;option value=&quot;2&quot; selected=true&gt;Option2&lt;/option&gt;<br/><br/> &lt;option value=&quot;3&quot;&gt;Option3&lt;/option&gt;<br/><br/>&lt;/select&gt;<br/><br/>&lt;label&gt;&lt;/label&gt;<br/><br/>&lt;input type=&quot;submit&quot; name=&quot;submit&quot; value=&quot;submit&quot; id=&quot;Submit&quot;&gt;<br/><br/>&lt;/form&gt;<br/><br/>/* Binding */<br/><br/>Buffalo.Bind.bind(&quot;form3&quot;, data);<br/><br/>或Buffalo.Form.bindForm(&quot;form3&quot;, data);<br/></div><br/>　　绑定结果: 见图中form3<br/><a href="http://zhoujin.com/attachment.php?fid=1" target="_blank"><img src="http://zhoujin.com/attachment.php?fid=1" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>　　<br/>　　<span style="font-size: 12px;">转换form为bean</span><br/><br/>　　一些用户恨透了在进行一次远程调用时从form中构造参数。Buffalo.Form.formToBean会使这一切变得简单。<br/><div class="code">Buffalo.Form.formToBean(form, buffaloObjectClass, ignoreButton)</div><br/>上面的代码片断将转换form为buffaloObjectClass类型的bean。<br/><br/>　　参数说明:<br/>　　１.form:form id或是form对象，这是必需的参数。 <br/>　　２.buffaloObjectClass:你要转换为的类，不是必备参数。如果没有提供，buffalo默认为是java.util.HashMap类。 <br/>　　３.ignoreButton:转换过程中是否忽略掉form中的button。不是必备参数，默认为true。 <br/><br/>　　转换风格:<br/>　　１.所有的值都是字符串或者字符串的列表。 <br/>　　２.单个字符串值将被转换为字符串，多个字符串值将被转换为字符串的列表。服务器端将使用java.util.List类来存放字符串的列表。 <br/><br/>Tags - <a href="http://zhoujin.com/tags/buffalo/" rel="tag">buffalo</a> , <a href="http://zhoujin.com/tags/%25E7%25BB%2591%25E5%25AE%259A/" rel="tag">绑定</a> , <a href="http://zhoujin.com/tags/ajax/" rel="tag">ajax</a> , <a href="http://zhoujin.com/tags/form/" rel="tag">form</a> , <a href="http://zhoujin.com/tags/bind/" rel="tag">bind</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/67/</link>
<title><![CDATA[Wine 0.9.35]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Mon, 16 Apr 2007 02:40:49 +0000</pubDate> 
<guid>http://zhoujin.com/post/67/</guid> 
<description>
<![CDATA[ 
	<p><a href="http://www.winehq.com/"><span style="color: #bb5500">Wine</span></a> 在昨天推出了一个新的版本 0.9.35，该版本包括一些新的改进，同时，也修正了之前版本中所存在的许多 bug。目前仅有此版本的源码包可用，适用于各发行版的二进制包还尚需时日。<a id="more-896"></a></p><p><img src="attachment/winehq.png" border="0" alt="Wine" width="209" height="99" /></p><p>Wine 0.9.35 的主要更改情况如下：</p><ul><li>损坏的 aRts 声音驱动程序已被移除； </li><li>修正了 Quartz DLL 声音支持的问题； </li><li>改善了文件的 I/O 性能； </li><li>针对 Direct3D 的修订。 </li></ul><p>Download <a href="http://ibiblio.org/pub/linux/system/emulators/wine/wine-0.9.35.tar.bz2"><span style="color: #bb5500">Wine 0.9.35</span></a> </p><br/>Tags - <a href="http://zhoujin.com/tags/wine/" rel="tag">wine</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/65/</link>
<title><![CDATA[不到50MB的全功能发行版──Damn Small Linux ]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Fri, 30 Mar 2007 07:09:42 +0000</pubDate> 
<guid>http://zhoujin.com/post/65/</guid> 
<description>
<![CDATA[ 
	<a href="attachment/damnsmall.png" target="_blank"><img style="width: 104px; height: 106px" class="insertimage" src="attachment/damnsmall.png" border="0" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" width="104" height="106" align="left" /></a> Linux的众多发行版真是各具特色啊！<br />上次介绍过一个能构成Linux集群的LiveCD版──ParallelKnoppix，详见：<a href="read.php/66.htm" target="_blank"><a href="http://www.zhoujin.com/read.php/66.htm" target="_blank">http://www.zhoujin.com/read.php/66.htm</a></a>，今天我再来介绍一个不到50MB的功能丰富的发行版──Damn Small Linux。<br />来看看其主要介绍：<br /><div class="quote"><div class="quote-title">引用</div><div class="quote-content">Damn Small Linux是一套基于业务卡（50M字节）可启动光盘的Linux发行。尽管它的个头如此之小，它努力成为一份可用并且易用的桌面。Damn Small Linux的桌面几乎是完整的一套，包括xmms（支持mp3和mpeg）、FTP客户端、基于links的web浏览器、电子制表软件、电子邮件程序、英语拼写检查、字处理器、三个编辑器（nedit、nvi及类似emacs的zile）、xpdf阅读器、worker文件管理器、naim（支持 AIM、ICQ和IRC）、VNCviewer、SSH/SCP服务器和客户端、DHCP客户端、PPP及PPPoE、web服务器、计算器、 Fluxbox窗口管理器、系统监视软件、USB支持，并且它很快就将拥有PCMCIA支持。如果你喜欢Damn Small Linux，你可以安装到你的硬盘上。由于所有的软件都是小巧型的，所以它对老旧的硬件会是一个很好的选择。</div></div><br />根据DistroWatch上的消息，今天这个Linux刚刚发布了3.3Rc3版，我想既然这么小，我也下载来体验一下。<br />详情请见：<a href="http://distrowatch.com/?newsid=04121" target="_blank"><a href="http://distrowatch.com/?newsid=04121" target="_blank">http://distrowatch.com/?newsid=04121</a></a>，才49.6MB的ISO&hellip;&hellip;<img src="images/emot/shuai.gif" border="0" width="20" height="20" /><!-- Added by RelatedTopic, plugin for Bo-Blog 2.0.0 --><br/>Tags - <a href="http://zhoujin.com/tags/linux/" rel="tag">linux</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/64/</link>
<title><![CDATA[Ubuntu Feisty Beta版发布了]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Fri, 30 Mar 2007 06:55:27 +0000</pubDate> 
<guid>http://zhoujin.com/post/64/</guid> 
<description>
<![CDATA[ 
	<a href="attachment/ubuntu.png" target="_blank"><img style="width: 120px; height: 31px" class="insertimage" src="attachment/ubuntu.png" border="0" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" width="120" height="31" align="left" /></a><span style="color: #4169e1"> 在结束了五个Herd测试版后，Ubuntu Feisty将迎来Beta版了。不过出现了一点点意外，Ubuntu Feisty Beta版的发布要延迟一天。（哈哈~才一天，只要最终版不跳票就行了）</span><br /><hr /><br />最新最流行的Linux操作系统──Ubuntu Feisty的Beta版，因为内核更新的关系延迟发布一天。<br />今天早上Tollef Fog Heen给Ubuntu开发者列表的邮件中写到：&ldquo;因为内核引起的启动问题，Ubunt Feisty的Beta版将在周五发布。&rdquo;<br />&ldquo;一个新的内核将上传并编译，同样的还有新的debian安装器。当我在写这封邮件时时，新的ISO镜像正在制作和发布。&rdquo;<br />&quot;DVDs will be re-rolled tomorrow morning since they need new livefs-es built and due to the order we build the ISOs in, they aren't yet.&quot;<img src="images/emot/question.gif" border="0" alt="question" width="20" height="20" />不会翻译&hellip;&hellip;<br />Heen说ISO镜像将在周六完成最终测试，并且在周五会发布Beta版。<br /><br />原文：<a href="http://www.tectonic.co.za/view.php?src=rss&amp;id=1418" target="_blank"><span style="color: #0066cc"><a href="http://www.tectonic.co.za/view.php?src=rss&amp;id=1418" target="_blank">http://www.tectonic.co.za/view.php?src=rss&amp;id=1418</a></span></a><br /><span style="color: #ff1493">Beta版将发布了，离正式版越来越近了~真期待！</span><br/>Tags - <a href="http://zhoujin.com/tags/linux/" rel="tag">linux</a> , <a href="http://zhoujin.com/tags/ubuntu/" rel="tag">ubuntu</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/63/</link>
<title><![CDATA[对web.xml 的几点配置心得]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[J2EE]]></category>
<pubDate>Wed, 21 Mar 2007 09:19:35 +0000</pubDate> 
<guid>http://zhoujin.com/post/63/</guid> 
<description>
<![CDATA[ 
	<span style="color: #FF0000;">参考</span><br/><a href="http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html" target="_blank">http://gceclub.sun.com.cn/staticcontent/html/sunone/app7/app7-dg-webapp/ch6/ch6-4.html</a><br/>1.指定了自己的javaEncoding<div class="code">&lt;servlet&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-name&gt;jsp&lt;/servlet-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;servlet-class&gt;org.apache.jasper.servlet.JspServlet&lt;/servlet-class&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;fork&lt;/param-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;false&lt;/param-value&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;javaEncoding&lt;/param-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;GB18030&lt;/param-value&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;xpoweredBy&lt;/param-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-value&gt;true&lt;/param-value&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/init-param&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;load-on-startup&gt;3&lt;/load-on-startup&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/servlet&gt;<br/></div><br/>2.添加rar,iso等的mime-type映射 <br/>避免在浏览器里直接打开。<div class="code">&lt;mime-mapping&gt;<br/>&lt;extension&gt;mht&lt;/extension&gt;<br/>&lt;mime-type&gt;text/x-mht&lt;/mime-type&gt;<br/>&lt;/mime-mapping&gt;<br/>&lt;mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;extension&gt;rar&lt;/extension&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;extension&gt;iso&lt;/extension&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;extension&gt;ape&lt;/extension&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;extension&gt;rmvb&lt;/extension&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-type&gt;application/octet-stream&lt;/mime-type&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;extension&gt;ico&lt;/extension&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;mime-type&gt;image/x-icon&lt;/mime-type&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/mime-mapping&gt;<br/><br/>&nbsp;&nbsp; &lt;mime-mapping&gt;<br/>&nbsp;&nbsp; &lt;extension&gt;doc&lt;/extension&gt;&nbsp;&nbsp;<br/>&lt;mime-type&gt;application/msword&lt;/mime-type&gt;&nbsp;&nbsp;<br/>&lt;/mime-mapping&gt;&nbsp;&nbsp;<br/>&lt;mime-mapping&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; &lt;extension&gt;xls&lt;/extension&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; &lt;mime-type&gt;application/vnd.ms-excel&lt;/mime-type&gt;&nbsp;&nbsp;<br/>&lt;/mime-mapping&gt;&nbsp;&nbsp;<br/>&lt;mime-mapping&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; &lt;extension&gt;ppt&lt;/extension&gt;&nbsp;&nbsp;<br/>&nbsp;&nbsp; &lt;mime-type&gt;application/vnd.ms-powerpoint&lt;/mime-type&gt;&nbsp;&nbsp;<br/>&lt;/mime-mapping&gt;<br/></div><br/>3.对html静态页面设置编码<div class="code">&lt;!--&nbsp;&nbsp;修改下面两行以支持静态超文本的自动编码 --&gt; <br/> &lt;mime-mapping&gt;<br/>&nbsp;&nbsp;&lt;extension&gt;htm&lt;/extension&gt; <br/>&nbsp;&nbsp;&lt;mime-type&gt;text/html;charset=gb2312&lt;/mime-type&gt; <br/>&nbsp;&nbsp;&lt;/mime-mapping&gt;<br/> &lt;mime-mapping&gt;<br/>&nbsp;&nbsp;&lt;extension&gt;html&lt;/extension&gt; <br/>&nbsp;&nbsp;&lt;mime-type&gt;text/html;charset=gb2312&lt;/mime-type&gt; <br/>&nbsp;&nbsp;&lt;/mime-mapping&gt;<br/>&nbsp;&nbsp;&lt;/web-app&gt;<br/></div><br/>Tags - <a href="http://zhoujin.com/tags/web/" rel="tag">web</a> , <a href="http://zhoujin.com/tags/xml/" rel="tag">xml</a> , <a href="http://zhoujin.com/tags/mime/" rel="tag">mime</a> , <a href="http://zhoujin.com/tags/mapping/" rel="tag">mapping</a> , <a href="http://zhoujin.com/tags/jasper/" rel="tag">jasper</a> , <a href="http://zhoujin.com/tags/encoding/" rel="tag">encoding</a> , <a href="http://zhoujin.com/tags/%25E8%25BF%2587%25E6%25BB%25A4/" rel="tag">过滤</a> , <a href="http://zhoujin.com/tags/java/" rel="tag">java</a> , <a href="http://zhoujin.com/tags/jsp/" rel="tag">jsp</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/62/</link>
<title><![CDATA[竟然这么想你~~~]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Sat, 17 Feb 2007 08:05:46 +0000</pubDate> 
<guid>http://zhoujin.com/post/62/</guid> 
<description>
<![CDATA[ 
	竟然这么想你, <br />竟然这么想你, <br />忘了你不在这里,<br />透过信息开始思念你,<br />不知不觉我又在想你.<br />扰乱我的收听, <br />都是你的声音, <br />害我的耳朵不安静~! <br />竟然这么想你,<br />竟然这么想你,<br />相信我别怀疑, <br />任时光点滴流逝, <br />可不知不觉我竟又在想你~! <br />扰乱我的视线, <br />都是你的身影, <br />害我的凝视不安静, <br />扰乱我的心情, <br />害我的脚步不安静, <br />扰乱我的思绪, <br />都是你的声音, <br />害我的沉默不安静~! <br />纵是月色迷离, <br />思念风儿为我传递, <br />我却听见了, <br />你轻声的叹息, <br />谁能遮得住思念在呼吸???<br/>Tags - <a href="http://zhoujin.com/tags/%25E6%2583%25B3%25E4%25BD%25A0/" rel="tag">想你</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/60/</link>
<title><![CDATA[Web下的整体测试]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[歪布天地]]></category>
<pubDate>Tue, 13 Feb 2007 03:47:14 +0000</pubDate> 
<guid>http://zhoujin.com/post/60/</guid> 
<description>
<![CDATA[ 
	摘要:<br/> &nbsp; &nbsp; &nbsp;B/S下的功能测试比较简单，关键是如何做好性能测试。目前大多数的测试人员认为只要跑一些测试工具证明我的产品是可以达到性能的就ok了，为了证明而去测试是没有任何价值的，关键是要发现产品性能上的缺陷，定位问题，解决问题，这才是测试要做的。<br/><br/> &nbsp; &nbsp;随着Internet的日益普及，现在基于B/S结构的大型应用越来越多，可如何对这些应用进行测试成为日益迫切的问题。有许多测试人员来信问我B/S的测试如何做，由于工作较繁忙，对大家提出的问题也是头痛医头脚痛医脚，没有对WEB的测试过程做一个整体的概述。希望通过本篇能够让大家了解大型Web应用是如何来进行测试的。 <br/> &nbsp; &nbsp;B/S下的功能测试比较简单，关键是如何做好性能测试。目前大多数的测试人员认为只要跑一些测试工具证明我的产品是可以达到性能的就ok了，为了证明而去测试是没有任何价值的，关键是要发现产品性能上的缺陷，定位问题，解决问题，这才是测试要做的。 <br/> &nbsp; &nbsp;首先我们从两个方面分析如何进行WEB测试，从技术实现上来讲一般的B/S结构，无论是.NET还是J2EE,都是多层构架，有界面层，业务逻辑层，数据层。而从测试的流程上来说，首先是发现问题，分析问题，定位问题，再由开发人员解决问题。那么B/S的结构的测试如何来做？ <br/> &nbsp; &nbsp;如何发现问题是我首先要介绍的，在做WEB测试之前你需要一些资料，比如产品功能说明书，性能需求说明书，不一定很完善，但一定要有，明确测试目标，这是基本的常识，可是我往往看到的是已经开始动手测了，但还不知自己的系统要达到的性能指标是什么。这里我简单讲一下测试的性能指标： <br/>1、通用指标（指Web应用服务器、数据库服务器必需测试项）: <br/>* ProcessorTime: 指服务器CPU占用率，一般 平均达到70%时，服务就接近饱和； <br/>* Memory Available Mbyte : 可用内存数，如果测试时发现内存有变化情况也要注意，如果是内存泄露则比较严重； <br/>* Physicsdisk Time : 物理磁盘读写时间情况； <br/>2、Web服务器指标： <br/>* Avg Rps: 平均每秒钟响应次数＝总请求时间 / 秒数； <br/>* Avg time to last byte per terstion （mstes）:平均每秒业务角本的迭代次数 ,有人会把这两者混淆； <br/>* Successful Rounds：成功的请求； <br/>* Failed Rounds ：失败的请求； <br/>* Successful Hits ：成功的点击次数； <br/>* Failed Hits ：失败的点击次数； <br/>* Hits Per Second ：每秒点击次数； <br/>* Successful Hits Per Second ：每秒成功的点击次数； <br/>* Failed Hits Per Second ：每秒失败的点击次数； <br/>* Attempted Connections ：尝试链接数； <br/>3、数据库服务器指标： <br/>* User 0 Connections ：用户连接数，也就是数据库的连接数量； &nbsp;<br/>* Number of deadlocks：数据库死锁； &nbsp;<br/>* Butter Cache hit ：数据库Cache的命中情况； &nbsp;<br/> &nbsp; &nbsp;上面的指标只是一些通用的指标,起到抛砖引玉的作用，对于不同的应用你还必需作相应的调整，比如程序使用的是.NET技术的，则必需加入一些针对性的测试指标。对于这些指标的详细了解，你可以参考Windows 下面的 SystemMonitor的帮助与LoadRunner、ACT的帮助。对于发现问题，指标的设置非常重要，它会帮你定性的发现一些错误。对于定性的压力测试我就不做过多的分析，工具很多，流行的主要有LoadRunner,ACT,WAS,WebLoad,各个工具有它的使用范围，其中我各个认为LoadRunner 最全面，它提供了多种协议的支持，对复杂的压力测试都可以胜任，WAS与ACT则对微软的技术支持的比较好，其中WAS支持分布式机群测试,ACT则是 <br/>与.NET集成比较好，支持ViewState （.NET 下控件缓存的支持） 的测试，当时我用时，其它测试工具还不支持，现在应该支持了吧，呵呵。在这一阶段测试你要不断的跟据系数的测试目标进行变化，一开始由于系统过于庞大，所以我们要分成若干个子系统，各个子系统的性能目标必需明确，主要是并发指标定一个阈值，同时设定一些与系统相关的测试参数，应用服务器，数据库服务器都要有，对达不到阈值的与一些通用参数有问题的子系统进行深入分析。比如它的并发达不到你的要求，证明子系统性能有问题，或是数据库用户连接过高，程序没有释放用户连接等等。这个我们要对子系统进行详细测试，由于B/S 结构下,图片的请求对性能的影响较大，所以我们对子系统测试时要分两个部分进行，一、非程序部分，即图片等等；二、应用程序本身。通过事务或函数的分离，可以把这两块实现单独的测试，具体做法参考各个工具的手册，我这里就不做说明。对子系统的测试参数的设置要求则更高，它有助你后面精确的定位问题，比如对异常，死锁，网络流量等等前面没有注意到的情况的增加，同时你要注意增加测试参数的收集对系统的性能影响比较大，所以一般不要超过10个，刚刚介绍的整体的性能 <br/>测试指标也不要增加很多，这样影响会小一点。最后在这一阶段要说明的是数据库的数据量会很大程度的影响性能，所以要根据前面的性能需求说明书向数据库中模拟相应的数据量，来进行测试，这样才有更高的可信度。 <br/> &nbsp; &nbsp;上面所说的是对问题的发现，下面就是分析问题原因，这一步的要求比较高，一般由测试人员与程序员配合完成，当然如果你有相当的开发经验，再做这方面的测试，就更为难得。下面我们说说如何精确定位问题，出现问题的可能性可能有很多种，大致分以下几种，一、性能达不到目标；二、性能达到目标，但有一些其它的问题，比如异常，死锁，缓存命中过低，网络流量较大；三、服务器稳定性的问题，比如内存泄漏……。要发现这些问题起马的要求要有一款使用的比较称心的性能分析与优化工具，比如微软的.NET下就有自己开发的工具，对Borland的Java开发工具中也有类似的工具，但我个人认为更好的工具是Rose下的Purify与Quantify,主要是他对.net 与java ,C++都有支持，而且分析效果特别专业，我们先了解一下 <br/>Rational Purify, Rational Purify 能自动找出Visual C/C++ 和Java 代码中与内存有关的 <br/>错误，确保整个应用程序的质量和可靠性。在查找典型的Visual C/C++ 程序中的传统内存访问错误，以及Java，C# 代码中与垃圾内存收集相关的错误方面；Rational Quantity 则是一款针对函数级的性能分析利器，使用它你可以从图形化的界面中得到函数调用的时间，百分比与次数，以及子函数所占时间，使你可以更快的定位性能瓶颈。 <br/> &nbsp; &nbsp;我们先说性能优化与异常的处理，性能优化有一个原则，即用时间比例最大的进行优化，效果才最明显，比如有个函数它的执行时间为30秒，如果你优化了一百倍则执行时间为0.3秒,提升了29.7秒，而如果它的执行时间为0.3秒，优化后为0.003秒，实际提升了0.297秒，提升的效果并不明显，而且写过程序的人都知道，后者性能优化的代价更大。在性能优化的过程中，一般是先数据库，后程序，因为数据库的优化不需要修改程序，修改的风险很小。但如何才能确定是数据库的问题，这就需要技巧，在使用Quantity时，你一路分析下去，大多数最终会发现，是数据库查询函数占用时间比较大，比如什么，SqlCmd.ExecuteNoQuery等等数据库执行函数,这时你就需要分析数据库，呵呵。数据库的分析原则是先索引，后存储过程，最后表结构视图的优化，索引的优化是最简单也是通常最有效的方法，如果合理的使用会带来意想不到不到的效果。在这里我要给大家简单的介绍一下我的最爱，SQLProfile,SQL查询分析器，Precise,SQLProfile是一个SQL语句跟踪器，可以跟踪程序流程使用的SQL语句与存储过程，结合查询分析器对SQL的分析，可以对索引的优化做出很好的判断，但索引也不是万能的，在增删改较多的表，索引过多会引起这些操作的性能下降，所以判断还是需要一定的经验。同时针对用户使用频度最高的SQL进行优化也是最行之有效的，这时我则需要Precise，它可以观测某一个较长时间内的SQL语句的执行情况。数据库优化的潜能挖光后，如果还是达不到性能要求或是还有问题，则要从程序来进行优化，这是程序员做的事，测试人员要做的，就是告诉他们，哪个函数执行过多引起了性能下降，比如异常过多，某个循环过多，或是DCOM调用过多等等，但说服程序员也是一件不容易的事，你要在这一阶段做的出色一定要有几年的编程经验，并且要让程序员感到听你的性能会有提升，这是一件很不容易的事情哦。 <br/> &nbsp; &nbsp;内存的分析，一般是一个长期分析的过程，要做好不容易，首先要有长期奋战的准备，其次内存泄漏的分析最好是放在单元测试之中同步进行，而不是要等到最后再去发现问题，当然出了问题也只好面对，一般这类问题都是在服务器运行了很久才暴露出来，一旦发现问题后，则需要定位问题，分析的原则采用子系统相互独立运行，找到最小问题的系统集,或是借助内存分析工具观察内存对象情况，初步定位问题，再用Purify进行运行时分析，通常C++ 内存问题比较多，Java与.NET比较少，一般由GC不合理引起。C++的内存错误就比较多了，主要常见的有: &nbsp;<br/>1、 Array Bounds Read (ABR) ：数组越界读 &nbsp;<br/>2、 Array Bounds Write (ABW)：数组越界写 &nbsp;<br/>3、 Beyond stack Read (BSR)：堆栈越界读 &nbsp;<br/>4、 Free Memory Read(FMR)：空闲内存读 &nbsp;<br/>5、 Invalid pointer Read(IPR)：非法指针阅读 &nbsp;<br/>6、 Null Pointer Read(NPR)： 空指针阅读 &nbsp;<br/>7、 Uninitialized Memory Read(UMR)：未初始化内存读写 &nbsp;<br/>8、 Memory Leak：内存泄漏 &nbsp;<br/>注：如果需要更多的信息，可以参见Purify的帮助信息。 &nbsp;<br/> &nbsp; &nbsp;顺便提一句，为什么我要说单元测试时做这个比较好，由于单元测试针对的是单一功能，这时结合单元测试案例做内存分析会更快的定位问题，同时由于问题较早的发现，则后期的风险则会减少，当然如果结合代码覆盖工具PureCoverage 来做就更完美了。 <br/> &nbsp; &nbsp;注：本篇只是对B/S应用的测试过程作一个整体的描述，对某一个阶段使用的工具只是作 <br/>大概的介绍,你也可使用你比较熟悉的工具达到相同的目标。 <br/>Tags - <a href="http://zhoujin.com/tags/web/" rel="tag">web</a> , <a href="http://zhoujin.com/tags/%25E6%25B5%258B%25E8%25AF%2595/" rel="tag">测试</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/59/</link>
<title><![CDATA[驰名世界的奢侈品牌史话：巴宝莉(Burberry) ]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Mon, 12 Feb 2007 11:46:32 +0000</pubDate> 
<guid>http://zhoujin.com/post/59/</guid> 
<description>
<![CDATA[ 
	　　1856年，21岁的托马斯·巴伯利在英格兰汉普郡的贝辛斯托克开了一家叫“巴宝莉(Burberry)”的户外服饰店。由于经营有方，这家店的生意越来越兴旺。到了1870年，巴宝莉已经成为当地生产户外服饰的知名商家，甚至当时一些著名的运动员也是它的常客。<br/><br/>　　曾经给布料商当学徒的托马斯·巴伯利精明过人，他在1880年利用新的织造方法，发明了一种防水、透气、耐磨的斜纹布，并在1888年获得了专利。1891年，巴伯利在伦敦Haymarket开了在英国首都的第一家店，现在那里仍是巴宝莉公司的总部所在地。<br/><br/>　　19世纪末，巴宝莉为军官设计了一种叫“Tielocken”的风衣，它也是今天著名的巴宝莉风衣的雏形。1901年，巴宝莉正式受英国军方委托，为英国军官设计新的制服。此时，巴宝莉著名的“马背骑士”标识面世，巴宝莉公司将它注册为商标。20世纪最初的10年里，巴宝莉开始扩张自己的市场，并跨出英国国门，在巴黎和纽约建立起自己的专卖店。 <br/><br/>　　1911年发生了一件轰动全球的事情，“巴宝莉”这个品牌也因此而扬名。这一年，挪威探险家罗阿尔·阿蒙森上校率领一只5人的小分队，成功地成为了世界上最早抵达南极点的人，而他装备的就是巴宝莉品牌的户外用品和服饰。他在南极点留下了一个巴宝莉的斜纹布帐篷，以向后来者证明他完成了这次探险。在阿蒙森到达南极后，爱尔兰人欧内斯特·沙克尔顿决定首先横穿南极大陆，而他的探险队使用的也是由巴宝莉生产的户外产品。<br/><br/>　　第一次世界大战期间，巴宝莉继续为英国军队设计军服。1924年，巴宝莉注册了它的另一个著名标志：格子图案。这种由红、白、黑、浅棕四色组成的格子图案，当时被巴宝莉用在了风衣内衬上，后来几乎成为了巴宝莉的同义词。1930年，巴宝莉还参与了飞行员服饰的设计。<br/><br/>　　凭着传统、精谨的设计风格和产品制作，1955年，巴宝莉获得了由伊丽莎白女王授予的“皇家御用保证(Royal Warrant)”徽章。后来在1989年，巴宝莉又获得了威尔士亲王授予的“皇家御用保证”徽章。1967年，巴宝莉开始把它著名的格子图案用在了雨伞、箱包和围巾上，愈加彰显了巴宝莉产品的特征。<br/><br/>　　1970年，巴宝莉在纽约东57街上的旗舰店开张。1980年，巴宝莉在美国不断扩大零售业务，除纽约外，旧金山、芝加哥、波士顿、费城、华盛顿等地都可以见到它的连锁店。1997年，罗斯·玛丽·布拉沃担任巴宝莉公司的首席执行官，一支新的管理团队给巴宝莉带来了新的面貌。新的精品设计、新的产品序列以及与众不同的广告宣传，使巴宝莉这个老品牌获得新生。<br/><br/>　　1999年，布拉沃请来了英国最著名的时装模特凯特·莫斯为巴宝莉拍摄了一组广告片和海报。在一幅直到今天仍被奉为经典的海报上，凯特·莫斯身着格子婚纱，与身穿格子燕尾服的新郎举行了一场“英伦格子婚礼”，婚礼上的所有嘉宾都穿着带有巴宝莉格子的服饰，婚礼上的所有用具也都用巴宝莉格子作为装饰。这些海报在各地好评如潮，它不但使巴宝莉再度成为了热门的时尚品牌，而且让这个品牌迅速受到各年龄段消费者的青睐。<br/><br/>　　新世纪来临之际，巴宝莉已经以其不朽的风尚，成为了一种生活品质的象征。2000年和2001年，巴宝莉获得了英国时装理事会古典和现代两个设计系列的大奖。进入21世纪，巴宝莉加快了其在全球的扩张步伐。2000年9月，它的全球旗舰店在伦敦新邦德街开张。2001年10月，巴宝莉把在洛杉矶的旗舰店开到了好莱坞明星云集的贝弗利山。此后，巴宝莉在德国、西班牙、意大利、俄罗斯、日本的一些重要城市建起了更多独具风格的专卖店。<br/><br/>　　今天，巴宝莉经典的格子图案、独特的布料功能和大方优雅的剪裁，已经成为了英伦气派的代名词。在一些字典里，“Burberry”的意思即是：风衣。<br/>Tags - <a href="http://zhoujin.com/tags/burberry/" rel="tag">burberry</a> , <a href="http://zhoujin.com/tags/%25E5%25B7%25B4%25E5%25AE%259D%25E8%258E%2589/" rel="tag">巴宝莉</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/57/</link>
<title><![CDATA[JSF 这一年]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Tue, 06 Feb 2007 01:02:45 +0000</pubDate> 
<guid>http://zhoujin.com/post/57/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 新的一年开始，按理说要对去年的什么东西做一番总结了，当然总结很多了，这次先总结一下 JSF 了，毕竟这对我来说是今年最主要的技术方向，对它也算是比较熟悉了，虽然没有非常深入的去研究它，但从一年多的使用和理解来说，还是有不少自己的心得的，在新的一年到来之际，把这些东西记录下来，重新记起这个让我欢喜让我忧的 JSF。静观这一年 JSF 的发展，没有太多的兴奋，也没有太多的欢喜，更多的是平静，与同一时间大红大紫的 Ajax 和 RoR 相比，JSF 带给我们的更多是平静，静的让人心里发慌，上半年可以说还是稍有一些波涛了，而随着月份的数字越来越大，波涛是越来越小了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以说各大厂商在互相妥协让步的基础之上，把 JSF 实用化的实现版本的重任交到了 Apache Myfaces 项目上，而 Oracle 也将其 ADF Faces 的实现捐给了 Apache，而现在我们可以见到的 JSF 实现也主要就是 Myfaces 了，当然 Sun 自己也有一套实现，当然这只是一种不够健壮，并且功能有限的实现版本，一般不会拿来做正式的项目的。刚过完年 Myfaces 1.1.2 和 Tomahawk 1.1.2 正式发布，这是过去 Myfaces 1.1.1 的一个 bug 修复版本，离上一个版本已经有半年左右的时间了，而项目组的同事们也在与 Myfaces 1.1.1 的 bug 斗争了半年才用到这个新的版本。随后的 Myfaces Core 1.1.3 / 1.1.4 则在几乎一个月内发布，而 1.1.5 和 Tomahawk 1.1.4 则至今没有动静，虽然由 Myfaces 每次发布带给我们的 new feature 已经不是那么的多了，但是还是期盼新的版本能够给我们带来新的惊喜<br/>。<br/>&nbsp;&nbsp;&nbsp;&nbsp; 五月份的时候 JavaEE 5 最终标准发布了，JSF 1.2 终于被正式提上了日程，这是一个对过去标准的一个修复版本，修正了上一个标准中的诸多问题，比如 JSTL 兼容性问题，还有一些细节性的改动，都是过去在 JSF 1.1 标准中非常折磨人的问题，但新的 1.2 标准依赖于 JDK 1.5，依赖于一系列新的 JavaEE 5 的 API，比如 Servlet 2.5, JSTL 1.2 而这些新的 API 也是在紧锣密鼓的开发中，所以 Myfaces 1.2 的开发进程也一直很慢，因为其中出现的问题不光是 Myfaces 自己的问题，或许还有 Tomcat 6 的问题，或是其他的问题。而另一方面 Sun 也发布了一个 JSF 1.2 的实现版本，是由 JSF 1.2 的标准的主笔领导开发的，按照我对于 Sun JSF 上个版本的表现，我对于这个新的实现也不抱有太多的希望，或许它更多的只是一种象征了，象征着 JSF 1.2 的正式推出。<br/>&nbsp;&nbsp;&nbsp;&nbsp; 开源领域的 JSF 相关的项目发展缓慢。Myfaces 在一年内没有给我们带来太多的惊喜。曾经做为黑马出现的 JSF 扩展框架 Shale 至今还没有给大家带来一个满意的答复，一直以 develop 版本发布出来给大家尝鲜用，虽然慢慢的在前进，但是却很难带给大家什么惊喜，或许会被人逐渐的淡忘。而去年年底由 Oracle 捐给 Apache 的 ADF Faces 也是至今没有太大的动静，同样作为兄弟项目的 Struts 2 从提出到现在也有一年了，还没有能提供一个正式的版本给我们用，作为 Apache 的项目，这样的发布速度，确实很让人不能满意，而作为另一个大型的开源组织 Eclipse，则在一个个 Milestone 下有条不紊的向前推进，不断蚕食着别人所占据的地盘。<br/>&nbsp;&nbsp;&nbsp;&nbsp; 作为 JSF 整体应用平台一个重要的部分，第三方组件库的发展有不小的突破，但是真正的应用度似乎不是很高，这一年内出现了很多优秀的商业，开源的组件库，除去上面我们提到的 Myfaces Tomahawk, Oracle ADF 之外，还出现了 ICEFaces， BackBase，WebGalileo Faces，另外在 .Net 领域的组件提供商 Infragistics 也通过收购发布了 NetAdvantage for JSF 2006 这样的组件库。另外一直在 JSF IDE 上有所作为的 Exadel 公司也在 JSF 组件上插上一手，一方面发布了其开源的 JSF 框架 Ajax4JSF 另一方面在其基础上提供了一个商业的 JSF 组件库 VCP，这样的方式确实有一套，可以同时抓住两方面的市场。另一方面国内也出现了像金碟这样基于自己 Apusic Application Server 的开源 JSF 组件库，是一件值得我们国人骄傲的事情，不过由于其只能够运行于 Apusic 上，使其应用面受到了不小的限制。<br/>&nbsp;&nbsp;&nbsp;&nbsp; 让我们再来看看这一年 JSF 相关 IDE 在今年的作为了，在 06 年春节期间，一些支持 JSF 的 IDE 像赶集一样不断的推出来，先后有 MyEclipse 4.1 GA，Sun Java Studio Creator 2， Oracle JDeveloper， BEA Workshop Studio 3.0，在这一段时间推出。MyEclipse 和 BEA Workshop 是 Eclipse 的插件，而 JDeveloper 和 Creator 是基于 Swing 的，不过随着时间的推移，大家真正在用的 JSF 开发工具也主要就是 MyEclipse 和 Workshop，不过 MyEclipse 在 JSF 上想和 Workshop 拼，还需要一些时日了，另外在九月份正式发布的 IntelliJ IDEA 6.0 也开始支持 JSF 了，当然是用其独特的方式去支持，虽然不提供图形化的所见即所得的开发方式，但由于其 IDE 内部各个部分间完美的组合，使得其在写代码的感觉上要远远超过的其他竞争者，这也正是独立 IDE 和插件 IDE 一个重要的功能区别。<br/>&nbsp;&nbsp;&nbsp;&nbsp; 纵观 06 年的 JSF 的发展历程，我还是对 07 年的 JSF 的发展很期待，希望 Myfaces 基于 JSF 1.2 的实现能够尽快的推出，也能够有更多更好的开源组件库的出现。 <br/>Tags - <a href="http://zhoujin.com/tags/jsf/" rel="tag">jsf</a> , <a href="http://zhoujin.com/tags/myfaces/" rel="tag">myfaces</a> , <a href="http://zhoujin.com/tags/java/" rel="tag">java</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/56/</link>
<title><![CDATA[台湾报纸关于［中国工农红军长征］的阐述 ]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Wed, 17 Jan 2007 04:46:38 +0000</pubDate> 
<guid>http://zhoujin.com/post/56/</guid> 
<description>
<![CDATA[ 
	引言：<br/><br/>［长征］：是指上个世纪30年代，中共领导的、由一群目七拼八凑的、没有工作的工人和没有土地的农民所组成的、反叛国民政府的武装叛军——［红军］在强大的国军五次精心组织的围剿下，从盘据的江西山区有组织的狼狈逃窜过程。[ 转自铁血社区 <a href="http://bbs.tiexue.net/" target="_blank">http://bbs.tiexue.net/</a> ]<br/><br/>内文：<br/><br/>从1934 年10月开始，英勇强大的国军对溃逃的［红军］进行了致命的追击，通过［湘江歼灭战］、［四堵赤水逼迫战］、［乌江拦截战］、［铁索桥以少胜多之战］、［追敌入草地之策略战］、［赶匪上雪山之巧计战］、［六盘山阻击战］等大小战役，范围包括江西、湖南、贵州、四川等众多省份，国军转战征程将近两万五千里，历时两年，直至1936年10月将共党［红军］从江西赶到陕西境地。［红军］死伤惨重，大部被歼，一路病死、饿死、被捕者人众。最终，号称三十万人之众［红军］被消灭至仅剩数万老弱残兵。<br/><br/>续言：<br/><br/>国军并未因［红军］仅余不堪一击的数万残部而作罢，继续对其进行剿灭。数百万精良装备的国军对用小米加步枪武装的剩余［红军］（后称之为：“共军”）组织了大大小小无数次精彩围歼战役。经过了近13年（包括[八年抗战]的被迫合作期）的成功奋斗，国军围剿共军从大陆一路追杀至台湾，最终将共军困在大陆将近六十年之久。<br/><br/>终言：<br/><br/>围剿尚未成功，国军还需努力。我们一定要为实现将共军赶入台湾岛的最终目标而奋斗！<br/>Tags - <a href="http://zhoujin.com/tags/%25E5%258F%25B0%25E6%25B9%25BE%25E6%258A%25A5%25E7%25BA%25B8/" rel="tag">台湾报纸</a> , <a href="http://zhoujin.com/tags/%25E4%25B8%25AD%25E5%259B%25BD%25E5%25B7%25A5%25E5%2586%259C%25E7%25BA%25A2%25E5%2586%259B/" rel="tag">中国工农红军</a> , <a href="http://zhoujin.com/tags/%25E9%2595%25BF%25E5%25BE%2581/" rel="tag">长征</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/55/</link>
<title><![CDATA[XSL模板的学习笔记]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[歪布天地]]></category>
<pubDate>Wed, 17 Jan 2007 03:00:03 +0000</pubDate> 
<guid>http://zhoujin.com/post/55/</guid> 
<description>
<![CDATA[ 
	让xsl在FF下能够正常显示<br/><div class="code">&lt;xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot; xmlns=&quot;http://www.w3.org/TR/xhtml1/strict&quot;&gt;</div><br/>xsl格式后，用下面解决页面title在FF下被打印出来。<br/><div class="code">&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;eng&quot;&gt;</div><br/>xsl输入W3C文件头<br/><div class="code">&lt;xsl:output method=&quot;html&quot; encoding=&quot;gb2312&quot; doctype-public=&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; <br/> doctype-system=&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;/&gt;</div><br/><br/>让xsl显示HTML&nbsp;&nbsp;<br/><div class="code">disable-output-escaping=&quot;yes&quot;<br/>&nbsp;&nbsp;如： &lt;xsl:value-of select=&quot;Root&quot; disable-output-escaping=&quot;yes&quot;/&gt;</div><br/>判断是否为空值用<div class="code">normalize-space</div><br/><br/>判断节点是否存在<br/><div class="code">　&lt;xsl:if test=&quot;not(节点)&quot;&gt;</div><br/>在xsl中title属性如何实现换行？<br/>　用<br/><div class="code">：&amp;#13;&amp;#10;</div><br/>xsl取xml中的序列号<br/>　　类似于db的自动编号　<br/><div class="code">position()</div><br/>XSL运算符：<br/><br/><div class="code">　　除 　　　　　　　　155 div 100<br/>　　求余　　　　　　　　155 mod 100<br/>　　求和　　　　　　　　sum()　　　　　　　　　&lt;xsl:value-of select=&quot;sum(//price)&quot;/&gt;<br/>　　统计　　　　　　　　count()　　　　　　　　&lt;xsl:value-of select=&quot;count(PERSON&#91;name=tom&#93;)&quot;/&gt;</div><br/>　　字符函数<br/><div class="code">　　　....长度　　　　　　string-length(str) <br/>　　　....查找　　　　　　substring<br/>　　　....查找　　　　　　substring-after<br/><br/>　　转换为数值　　　　　number()　　　　　　　　&lt;xsl:value-of select=&quot;number(book/price)&quot;/&gt; 如果非数值，返回空。</div><br/><br/>XSL使用自定义函数<br/><br/>声明：<br/><div class="code">&lt;xsl:stylesheet version=&quot;1.0&quot; xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot; xmlns=&quot;http://www.w3.org/TR/xhtml1/strict&quot; xmlns:msxsl=&quot;urn:schemas-microsoft-com:xslt&quot; xmlns:Missde=&quot;MissdeVBS&quot; xmlns:MissdeJS=&quot;MissdeJS&quot;&gt;</div><br/>函数：<br/><br/><div class="code">&lt;msxsl:script language=&quot;VBScript&quot; implements-prefix=&quot;Missde&quot;&gt;<br/>&lt;!&#91;CDATA&#91;<br/>　　　这里写VBS<br/>&#93;&#93;&gt;<br/>&lt;/msxsl:script&gt;<br/>&lt;msxsl:script language=&quot;javaScript&quot; implements-prefix=&quot;MissdeJS&quot;&gt;<br/>&lt;!&#91;CDATA&#91;<br/>　　　这里写JS<br/>&#93;&#93;&gt;</div><br/><br/>调用：<br/><div class="code">&lt;xsl:value-of select=&quot;Missde:函数名()&quot;/&gt;<br/>&lt;xsl:value-of select=&quot;MissdeJS:函数名()&quot;/&gt;</div><br/><br/>XSL使用自定义函数时的特殊情况<br/>1.参数即可以是元素值、又可以是字符串<br/>　解决办法：使用自定义函数函数。<br/>　因为刚学xsl,xml，对相关属性不甚明了，所以所用方法应该有待完善。<br/>　a)用VBS判断：<br/><div class="code">　　　　　function getnode(node)<br/>　　　　　 dim str<br/>　　　　　　if IsObject(node) then<br/>　　　　　 　if(Node.Length&gt;0)then<br/>　　　　　 　　str=node.item(0).TEXT<br/>　　　　　　else<br/>　　　　　　 　str=&quot;&quot;<br/>　　　　　　 　end if<br/>　　　　　　else<br/>　　　　　　　str=node<br/>　　　　　　end if<br/>　　　　　　getnode=str<br/>　　　　　End function</div>　b)用JS判断<br/><br/><div class="code">　　　　function node(str)&#123;<br/>　　　　　return str&#91;0&#93;?str&#91;0&#93;.text:str;<br/>　　　　&#125;</div><br/><br/>2.使用自定义函数，简化XSL代码<br/>　这里说的是特殊情况。比如说，需要在xsl引用一个动态地址，如js文件、img、url等<br/>　以引用script为例：<br/><div class="code">　function script(name,a,b,c,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s)&#123;<br/>　　name=name.toLowerCase==&quot;js&quot;?&quot;javascript&quot;:&quot;vbscript&quot;;<br/>　　var url=&quot;&quot;;<br/>　　var str=new Array(a,b,c,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s);<br/>　　for(var i=0;i&lt;str.length;i++)&#123;<br/>　　　　if(str&#91;i&#93;!=undefined)&#123;<br/>　　　　　　url+=node(str&#91;i&#93;);<br/>　　　　&#125;<br/>　　&#125;<br/>　　return &quot;&lt;script language=&#039;&quot;+name+&quot;&#039; type=&#039;text/&quot;+name+&quot;&#039; src=&#039;&quot;+url+&quot;&#039;&gt;&lt;/script&gt;&quot;;<br/>　｝</div><br/><br/>XSL排序<br/><div class="code">　　&lt;xsl:for-each select=&quot;student&quot;&gt; <br/>　　　　&lt;xsl:sort select=&quot;id&quot; order=&#039;ascending&#039;/&gt;　　　　以id顺序排列<br/>　　　　&lt;xsl:sort select=&quot;name&quot; order=&#039;descending&#039;/&gt;　　以name倒序排列<br/>　　&lt;/xsl:for-each&gt;</div><br/><br/>xsl条件查询<br/>　　进行大小于比较的时候，先进行编码。如>写成&lt;<br/><br/>xsl模板合并<br/>　　方法一（二个）<br/>　　　　用它引用<xsl:import href=""/><br/>　　　　用它打印<xsl:apply-imports/><br/>　　方法二（多个）<br/>　　　　主.xsl　调用<br/><br/><div class="code">　　　　&lt;xsl:import href=&quot;head.xsl&quot;/&gt;<br/>　　　　&lt;xsl:import href=&quot;foot.xsl&quot;/&gt;<br/>　　　　&lt;xsl:template match=&quot;html&quot;&gt;<br/>　　　　&lt;xsl:call-template name=&quot;head&quot;/&gt;<br/>　　　　　　本页主内容<br/>　　　　&lt;xsl:import href=&quot;foot.xsl&quot;/&gt;<br/>　　　　&lt;/xsl:template&gt;<br/><br/>　　　　子.xsl<br/>　　　　&lt;xsl:template name=&quot;head&quot;&gt;<br/>　　　　aaa<br/>　　　　&lt;/xsl:template&gt;</div><br/><br/>xsl模板合并时，主模板控制子模板head中的title<br/><br/>　　（暂用下面办法）<br/>　　a).建全局变量title<br/>　　b).head.xsl 引用自定义函数 showtitle()<br/>　　c). main.xsl 引入head.xsl之前为全局变量title赋值。<br/><br/>　　　JS：<br/><br/><div class="code">　　var title=&quot;&quot;;<br/>　　function gettitle(a,b,c,e,f,g,h)&#123;<br/>　　　　var str=new Array(a,b,c,e,f,g,h)<br/>　　　　for(var i=0;i&lt;str.length;i++)&#123;<br/>　　　　　　if(str&#91;i&#93;!=undefined)&#123;<br/>　　　　　　　　title+=node(str&#91;i&#93;)+ &quot; - &quot;;<br/>　　　　　　&#125;<br/>　　　　&#125;<br/>　　　　return &quot;&quot;;<br/>　　&#125;<br/>　　function showtitle()&#123;<br/>　　　　return title;<br/>　　&#125;</div><br/>Tags - <a href="http://zhoujin.com/tags/xsl/" rel="tag">xsl</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/54/</link>
<title><![CDATA[任何一个生命来到这个世界上都有它生存的权利]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Sun, 14 Jan 2007 05:56:24 +0000</pubDate> 
<guid>http://zhoujin.com/post/54/</guid> 
<description>
<![CDATA[ 
	-刘烨之《像天真的女孩投降》精彩对白！！！<br/>“过去的事就改了个名就不存在了吗？不光是改了名，还不能见以前的人，不能聊以前的事，甚至还得当以前根本就没存在过，对吗？让我想想，真的，丁伯，得让我想想。” 王谦说他去见姚兰和爱不爱没有关系，该承担的总躲不了。 &nbsp; <br/>“我必须这么做，我躲不了，我也不想躲了，我不愿意就这样跟你待在一起，我受不了。” &nbsp; <br/>“我在外面躲了两年，我不能因为珍惜自己的命，就不管别人的命，这是应该还的。” &nbsp; <br/><br/>“任何一个生命来到这个世界上都有它生存的权利 &nbsp; <br/>都应该享受生命带给他的自由 &nbsp; <br/>主宰自己肉体和精神的快乐和痛苦 &nbsp; <br/>这是任何人都不能剥夺的 &nbsp; <br/>一个生命无论多么渺小都是平等的 &nbsp; <br/>我结束了一个人的生命 &nbsp; &nbsp;<br/>我痛恨我自己” &nbsp; &nbsp;<br/><br/>就是他的这份敢担当的勇气让我感动。这种勇气现在有多少人有。爱情上，爱过了受了打击就选择逃避、自暴自弃，不愿见自己爱过的人，尤其是一些男孩，怎么就没有想办法让自己所爱的人更加幸福呢？平时遇到什么事就躲，不愿去解决，该自己承担的总没勇气去承担。 &nbsp; <br/><br/><br/>“这一重负几乎重如一个世界，我却担起了。原以为能一直担着走到头，而我承担是根据我的心愿，而不是凭力量；是根据我的意志，而不是凭能力。可是刚刚要到中途，就不得不放下。十四年的绝望和十年的希望把我变成了主宰命运的人。现在我又得听天由命了。人世间无所谓幸福与不幸，只有一种境况与另一种境况相比较，仅此而已。只有经受了极度不幸的人才能感受到极度幸福；渴求过死亡的人，才能领悟到活在世上有多美好。你们生活吧，幸福吧，我心爱的孩子们。永远也不要忘记，在上帝肯向人类揭示未来之日到来之前，这两个词就含括了人类的全部智慧——等待和希望。” &nbsp; <br/><br/>这是《基督山伯爵》结束的一段话。可是这又何尝不是王谦的感悟呢！从被姚军追杀，到白石镇被陷害，到拯救小宝，哪一次在逆境中他放弃过，正是他心里的正义和爱使他从没放弃过。被姚军追杀，姚母所逼，最后不得不离开姚兰。是因为他太爱姚兰了，所以自卑，不想给姚兰带来任何不幸，所以选择离开。白石镇奋不顾身救刘新朋，不管自己情况怎么糟糕，后果会怎样，在他的心里只有正义和救人这两个词。现实生活中有这么仗义的吗？在大部分人眼里只有钱和命！救小宝，就是再艰难也一定要回去，他只知道他要救人。这是一种怎样的爱啊！所有的这些承担，有谁能说他不是根据自己的心愿和意志呢！所以我喜欢他，真的喜欢他！ &nbsp; <br/><br/>不管发生什么事，自己兄弟最重要！身负重伤去警告伤害自己兄弟的人。心地是如此善良。 &nbsp; <br/>在白石镇杨大婶给了他几个包子，就一定要报答别人。后来为他治伤，就拼死保护刘新朋，刘新亮。他知道哪怕受别人一点恩惠，也要报答。滴水之恩当涌泉相报！ &nbsp; <br/>看书时他能安安静静的坐在那儿一整天，把《基督山伯爵》里的那段话牢记在心里。 &nbsp; <br/>他就是这么简单，安静、诚恳。现代人的脑袋太复杂了！ &nbsp; <br/><br/>“生命和金钱不是对等的，生命是无价的，钱是能数得出来的。我做了件蠢事，把无价的东西变成有价的，也就是把自己贬低了。这世上还是好人多。” &nbsp; &nbsp;<br/> 可是现实中有多少人在拿可贵的生命去换取那数得出的钱呢！有谁是根据自己的心愿和意志去做自己喜欢的事呢！ &nbsp; <br/><br/>“人的生命是那么的脆弱，逝去了就再也没有救赎的可能。我终于明白，生命的意义不只在于结果，还在于过程。我必须要去面对曾经所做的一切，这也是我生命的一种意义，该我承担的我就不该逃避了。” &nbsp; <br/>他知道生命的珍贵，可是我们又有多少人在践踏自己的生命！ &nbsp; <br/><br/>能和这样的人在一起就没有什么是不可能的，是一种精神上的爱，聚少离多又怎么样，就是辛苦也是幸福的。因为他不是柔柔软软的爱，不是为爱情而爱。他们有支撑下去的力量！就是心愿和意志！王谦值得姚兰为他付出生命！ &nbsp;<br/>我真的自从看了这片子使我想起了很多很多,以前的,将来的,好的,坏的 ,我第1次感受到了人的生命是多么可贵同时又是多么地脆弱,生活中遇到点儿事儿就逃,活着就是得过且过,上网啊,找女朋友啊,都是干这些,这样的生命有意义吗?是,是你不想学习,耐不住寂寞,所以你就选择逃避,一次又一次,难道你就这样过吗?人生活是要有信念的,是要有追求的,解决问题的最好方法就是直接坦然面对!!再一个我觉得吧,人是感情动物,活得应该尽情尽义,真实一点,干嘛那么虚啊,只有一个人有了渴望活着的信念,才能知道生命是多么可贵!我想明白了,自己就是这么回事儿! &nbsp; <br/>Tags - <a href="http://zhoujin.com/tags/%25E5%2588%2598%25E7%2583%25A8/" rel="tag">刘烨</a> , <a href="http://zhoujin.com/tags/%25E5%2583%258F%25E5%25A4%25A9%25E7%259C%259F%25E7%259A%2584%25E5%25A5%25B3%25E5%25AD%25A9%25E6%258A%2595%25E9%2599%258D/" rel="tag">像天真的女孩投降</a> , <a href="http://zhoujin.com/tags/%25E7%2594%259F%25E5%25AD%2598%25E7%259A%2584%25E6%259D%2583%25E5%2588%25A9/" rel="tag">生存的权利</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/58/</link>
<title><![CDATA[BEA Workshop Studio 3.3 released]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Sat, 06 Jan 2007 01:03:20 +0000</pubDate> 
<guid>http://zhoujin.com/post/58/</guid> 
<description>
<![CDATA[ 
	BEA has released BEA Workshop Studio 3.3 . In this release, Web Folder Mapping allows you to assemble your source files in a folder organization that matches the needs of your development team, not in a structure required by the server or the IDE. All Workshop Studio features then work transparently with the mapped files (eg. AppXRay, WYSIWYG rendering, Wizards, Validation, Navigation, etc). When using WebLogic Server’s split development directory, users can deploy non-standard structures directly to the server from the IDE, bypassing complicated ANT workarounds outside the IDE. In WebLogic Server, this feature is known as split development directory . <br/><br/>In addition, Workshop Studio 3.3 includes the following minor feature upgrades: <br/>Upgraded from Web Tools Platform (WTP) 1.5.1 to 1.5.2 -- this is a bug fix release <br/>Upgraded from Kodo 4.0 to 4.1 <br/>Support for Spring 2.0 <br/>Support for Hibernate and Hibernate Entity Manager 3.2 <br/>Support for opening .tld and .tag files located in JAR files <br/>Minor bug fixes and general improvements <br/>Workshop 一直是我比较关注的 Plugin，可以说在 JSF 的支持上目前是无出其右，这次在原有的基础上又做出了一些改进，主要是支持 Spring 2.0, Hibernate 3.2, WTP 1.5.2，喜欢 JSF 的朋友可以尝试去申请一个试用版。 <br/>Tags - <a href="http://zhoujin.com/tags/workshop/" rel="tag">workshop</a> , <a href="http://zhoujin.com/tags/jsp/" rel="tag">jsp</a> , <a href="http://zhoujin.com/tags/spring/" rel="tag">spring</a> , <a href="http://zhoujin.com/tags/wtp/" rel="tag">wtp</a> , <a href="http://zhoujin.com/tags/hibernate/" rel="tag">hibernate</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/53/</link>
<title><![CDATA[转：我和老婆已经为孩子到底姓什么争论很长时间了]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Tue, 26 Dec 2006 09:55:03 +0000</pubDate> 
<guid>http://zhoujin.com/post/53/</guid> 
<description>
<![CDATA[ 
	孩子已经一岁多了，但还没有名字，大家看怎么办，我是没辙了!<br/><br/>我姓吕，老婆姓王，孩子本应该姓吕，无可厚非的，可老婆和她家人都认为吕是个小姓，随老婆姓王成为百姓之王才更吉利，能让孩子长命百岁。可我和我家人都很传统，孩子姓父姓那是天经地义，而且我爷爷就我这么一个孙子，哎。<br/><br/>眼看孩子就1岁多了，男孩，平时我只管他叫宝宝，乖乖，什么的，没个正式名字。老婆已经管他叫王宏力，叫了半年多了，因为她特崇拜那唱歌的，王力宏，所以起这名字，这也是她一定要孩子姓王的一个原因。<br/><br/>关键问题是，我家和她家已经为孩子到底姓什么弄得都红脸了，关系很紧张。大家说我该怎么办，<br/>下面是回帖的啊 暴笑：<a href="http://community.csdn.net/Expert/topic/5243/5243794.xml" target="_blank">点此查看</a><br/>Tags - <a href="http://zhoujin.com/tags/%25E5%2590%258D%25E5%25AD%2597/" rel="tag">名字</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/51/</link>
<title><![CDATA[Java开源项目Hibernate包作用详解]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[HIBERNATE]]></category>
<pubDate>Tue, 19 Dec 2006 02:13:28 +0000</pubDate> 
<guid>http://zhoujin.com/post/51/</guid> 
<description>
<![CDATA[ 
	　　Hibernate一共包括了23个jar包，令人眼花缭乱。本文将详细讲解Hibernate每个jar包的作用，便于你在应用中根据自己的需要进行取舍。<br/>　　<br/>　　下载Hibernate，例如2.0.3稳定版本，解压缩，可以看到一个hibernate2.jar和lib目录下有22个jar包：<br/>　　<br/>　　hibernate2.jar:<br/>　　Hibernate的库，没有什么可说的，必须使用的jar包<br/>　　<br/>　　cglib-asm.jar:<br/>　　CGLIB库，Hibernate用它来实现PO字节码的动态生成，非常核心的库，必须使用的jar包<br/>　　<br/>　　dom4j.jar:<br/>　　dom4j是一个Java的XML&nbsp;&nbsp;API，类似于jdom，用来读写XML文件的。dom4j是一个非常非常优秀的Java&nbsp;&nbsp;XML&nbsp;&nbsp;API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件，可以在SourceForge上找到它。在IBM&nbsp;&nbsp;developerWorks上面可以找到一篇文章，对主流的Java&nbsp;&nbsp;XML&nbsp;&nbsp;API进行的性能、功能和易用性的评测，dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使用dom4j，直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML，特别值得一提的是连Sun的JAXM也在用dom4j。这是必须使用的jar包，Hibernate用它来读写配置文件。<br/>　　<br/>　　odmg.jar:<br/>　　ODMG是一个ORM的规范，Hibernate实现了ODMG规范，这是一个核心的库，必须使用的jar包。<br/>　　<br/>　　commons-collections.jar：<br/>　　Apache&nbsp;&nbsp;Commons包中的一个，包含了一些Apache开发的集合类，功能比java.util.*强大。必须使用的jar包。<br/>　　<br/>　　commons-beanutils.jar：<br/>　　Apache&nbsp;&nbsp;Commons包中的一个，包含了一些Bean工具类类。必须使用的jar包。<br/>　　<br/>　　commons-lang.jar:<br/>　　Apache&nbsp;&nbsp;Commons包中的一个，包含了一些数据类型工具类，是java.lang.*的扩展。必须使用的jar包。<br/>　　<br/>　　commons-logging.jar:<br/>　　Apache&nbsp;&nbsp;Commons包中的一个，包含了日志功能，必须使用的jar包。这个包本身包含了一个Simple&nbsp;&nbsp;Logger，但是功能很弱。在运行的时候它会先在CLASSPATH找log4j，如果有，就使用log4j，如果没有，就找JDK1.4带的java.util.logging，如果也找不到就用Simple&nbsp;&nbsp;Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾，当初Apache极力游说Sun把log4j加入JDK1.4，然而JDK1.4项目小组已经接近发布JDK1.4产品的时间了，因此拒绝了Apache的要求，使用自己的java.util.logging，这个包的功能比log4j差的很远，性能也一般。<br/>　　<br/>　　后来Apache就开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的log程序，底层的Logger是可以切换的，你可以选择log4j，java.util.logging或者它自带的Simple&nbsp;&nbsp;Logger。不过我仍然强烈建议使用log4j，因为log4j性能很高，log输出信息时间几乎等于System.out，而处理一条log平均只需要5us。你可以在Hibernate的src目录下找到Hibernate已经为你准备好了的log4j的配置文件，你只需要到Apache&nbsp;&nbsp;网站去下载log4j就可以了。commons-logging.jar也是必须的jar包。<br/>　　<br/>　　使用Hibernate必须的jar包就是以上的这几个，剩下的都是可选的。<br/>　　<br/>　　ant.jar:<br/>　　Ant编译工具的jar包，用来编译Hibernate源代码的。如果你不准备修改和编译Hibernate源代码，那么就没有什么用，可选的jar包<br/>　　<br/>　　optional.jar：<br/>　　Ant的一个辅助包。<br/>　　<br/>　　c3p0.jar：<br/>　　C3PO是一个数据库连接池，Hibernate可以配置为使用C3PO连接池。如果你准备用这个连接池，就需要这个jar包。<br/>　　<br/>　　proxool.jar：<br/>　　也是一个连接池，同上。<br/>　　<br/>　　commons-pool.jar,&nbsp;&nbsp;commons-dbcp.jar:<br/>　　DBCP数据库连接池，Apache的Jakarta组织开发的，Tomcat4的连接池也是DBCP。<br/>　　<br/>　　实际上Hibernate自己也实现了一个非常非常简单的数据库连接池，加上上面3个，你实际上可以在Hibernate上选择4种不同的数据库连接池，选择哪一个看个人的偏好，不过DBCP可能更通用一些。另外强调一点，如果在EJB中使用Hibernate，一定要用App&nbsp;&nbsp;Server的连接池，不要用以上4种连接池，否则容器管理事务不起作用。<br/>　　<br/>　　connector.jar:<br/>　　JCA&nbsp;&nbsp;规范，如果你在App&nbsp;&nbsp;Server上把Hibernate配置为Connector的话，就需要这个jar。不过实际上一般App&nbsp;&nbsp;Server肯定会带上这个包，所以实际上是多余的包。<br/>　　<br/>　　jaas.jar:<br/>　　JAAS是用来进行权限验证的，已经包含在JDK1.4里面了。所以实际上是多余的包。<br/>　　<br/>　　jcs.jar：<br/>　　如果你准备在Hibernate中使用JCS的话，那么必须包括它，否则就不用。<br/>　　<br/>　　jdbc2_0-stdext.jar:<br/>　　JDBC2.0的扩展包，一般来说数据库连接池会用上它。不过App&nbsp;&nbsp;Server都会带上，所以也是多余的。<br/>　　<br/>　　jta.jar：<br/>　　JTA规范，当Hibernate使用JTA的时候需要，不过App&nbsp;&nbsp;Server都会带上，所以也是多余的。<br/>　　<br/>　　junit.jar:<br/>　　Junit包，当你运行Hibernate自带的测试代码的时候需要，否则就不用。<br/>　　<br/>　　xalan.jar,&nbsp;&nbsp;xerces.jar,&nbsp;&nbsp;xml-apis.jar:<br/>　　Xerces是XML解析器，Xalan是格式化器，xml-apis实际上是JAXP。一般App&nbsp;&nbsp;Server都会带上，JDK1.4也包含了解析器，不过不是Xerces，是Crimson，效率比较差，不过Hibernate用XML只不过是读取配置文件，性能没什么紧要的，所以也是多余的。<br/>Tags - <a href="http://zhoujin.com/tags/hibernate/" rel="tag">hibernate</a> , <a href="http://zhoujin.com/tags/dom4j/" rel="tag">dom4j</a> , <a href="http://zhoujin.com/tags/odmg/" rel="tag">odmg</a> , <a href="http://zhoujin.com/tags/apache/" rel="tag">apache</a> , <a href="http://zhoujin.com/tags/java/" rel="tag">java</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/50/</link>
<title><![CDATA[勿忘12.13-]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Tue, 12 Dec 2006 16:00:00 +0000</pubDate> 
<guid>http://zhoujin.com/post/50/</guid> 
<description>
<![CDATA[ 
	12.13，尖锐的警报骤然响起，此时的你在做什么？在工作还是在家中，在上学还是在路上？<br/><br/>12.13，一个让人想起就要落泪的日子；<br/><br/>12.13，是这个城市最深的痛，是市民心中难平的疤痕；<br/><br/>12.13，我们更深地体会到落后之辱。<br/><br/>12.13，警报响起，我们不忘死难同胞的屈辱，但请不要停下行进的脚步；<br/><br/>12.13，最深的痛埋在心底，最努力的现在把握最美好的未来。<br/><br/>半个多世纪过去了，浩浩荡荡的长江水仍然向前流着，无止无息。然而，时光可以流逝，而历史却无法忘却，也不应该被忘却，作为历史的回顾，不能只有四大发明，开元盛世，丝路花雨，也应该有日军的残暴罪行，南京30万同胞的遇难..... <br/>记住着惨灭人寰的灾难吧，记住这中华民族的奇耻大辱吧，它会让我们更加明确，今后的路该怎么走......<br/><br/>－－历史上的今天－－－<br/>2002年12月13日 火车登陆海南岛<br/>2001年12月13日 美国宣布退出《反导条约》<br/>2001年12月13日 北京奥运会组委会成立<br/>1996年12月13日 联合国秘书长候选人产生　科菲·安南出任<br/>1996年12月13日 中国现代话剧奠基人曹禺逝世<br/>1993年12月13日 福州一台资企业发生特大火灾　死伤68人<br/>1992年12月13日 大邱庄发生非法拘禁、殴打职工致死案<br/>1979年12月13日 美国试验成功三叉戟Ⅰ式导弹<br/>1978年12月13日 邓小平的讲话成为党十一届三中全会的主题报告<br/>1971年12月13日 美、法总统发表联合公报宣布美元贬值<br/>1937年12月13日 南京大屠杀<br/>1937年12月13日 肖山令中将殉国<br/>1932年12月13日 许德珩等被当局秘密逮捕<br/>1924年12月13日 《现代评论》创刊<br/>1797年12月13日 德国诗人海涅诞辰<br/><br/>Tags - <a href="http://zhoujin.com/tags/%25E5%258E%2586%25E5%258F%25B2/" rel="tag">历史</a> , <a href="http://zhoujin.com/tags/%25E4%25BB%258A%25E5%25A4%25A9/" rel="tag">今天</a> , <a href="http://zhoujin.com/tags/12.13/" rel="tag">12.13</a> , <a href="http://zhoujin.com/tags/%25E5%258D%2597%25E4%25BA%25AC%25E5%25A4%25A7%25E5%25B1%25A0%25E6%259D%2580/" rel="tag">南京大屠杀</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/49/</link>
<title><![CDATA[Javascript 插入UBB标签到表单、文本域、函数]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[JAVASCRIPT]]></category>
<pubDate>Mon, 11 Dec 2006 01:47:52 +0000</pubDate> 
<guid>http://zhoujin.com/post/49/</guid> 
<description>
<![CDATA[ 
	摘要:<br/> 本文演示了使用 JS函数 动态插入 UBB 标签到 表单文本域的操作.<br/>本文并没有演示进行 UBB 标签转换为 HTML 标签的操作<br/>说明:<br/>HTML编辑器需要ActiveX支持, 并不是所有浏览器都支持, 比如Opera. <br/><br/>因此对于HTML编辑器和UBB编辑器, 两者我选择 UBB, 因为鄙人习惯使用 OPERA 浏览器, 写的东西当然也得适用于Opera.<br/>话外音: 使用Opera会上瘾, 定力不足者不可乱试:)<br/><br/>目录:<br/>1. Javascript 插入 UBB标签 到表单 文本域 函数<br/><div class="code"><br/>&lt;script type=&quot;text/javascript&quot;&gt;<br/>//&lt;!&#91;CDATA&#91;Subject:Javascript 插入 UBB标签 到表单 文本域 函数 及演示<br/>//表单 必须有 ID, 文件域 name 必须为 content<br/>//------------------------------------start 例子<br/>//&lt;form action=&quot;&quot; method=&quot;post&quot; name=&quot;ubbForm&quot; id=&quot;ubbForm&quot;&gt;<br/>//&lt;input type=&quot;button&quot; value=&quot;code&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;code&#93;&#039;)&quot; /&gt;&lt;br/&gt;<br/>//&lt;textarea name=&quot;content&quot; cols=&quot;80&quot; rows=&quot;10&quot;&gt;aaaaaaaaaa&lt;/textarea&gt;&lt;br/&gt;<br/>//&lt;input type=&quot;submit&quot; name=&quot;Submit&quot; value=&quot;Submit&quot; /&gt;<br/>//&lt;input type=&quot;reset&quot; name=&quot;Reset&quot; value=&quot;Reset&quot; /&gt;<br/>//&lt;/form&gt;<br/>//-------------------------------------end 例子<br/>function ubbTag(fId, str)&#123;<br/>&nbsp;&nbsp;document.getElementById(fId).content.focus();<br/>&nbsp;&nbsp;var strEnd=str.replace(/&#92;&#91;/ig,&#039;&#91;/&#039;);<br/>&nbsp;&nbsp;if (strEnd.indexOf(&#039;=&#039;)&gt;-1)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;strEnd=strEnd.replace(/(.*?)&#92;=.*?(&#92;&#93;)/,&#039;$1$2&#039;);<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;if((document.selection)&amp;&amp;(document.selection.type== &quot;Text&quot;))&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;var oStr=document.selection.createRange();<br/>&nbsp;&nbsp;&nbsp;&nbsp;oStr.text=str+oStr.text+strEnd<br/>&nbsp;&nbsp;&#125;else&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById(fId).content.value+=str+strEnd<br/>&nbsp;&nbsp;&#125;<br/>&#125;<br/>//&#93;&#93;&gt;<br/>&lt;/script&gt;<br/>&lt;form action=&quot;&quot; method=&quot;post&quot; name=&quot;ubbForm&quot; id=&quot;ubbForm&quot;&gt;<br/>&nbsp;&nbsp;&lt;select onchange=&quot;ubbTag(this.form.id,&#039;&#91;&#039;+this.value+&#039;&#93;&#039;)&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;h6&quot;&gt;h6&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;h5&quot;&gt;h5&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;h4&quot;&gt;h4&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;h3&quot;&gt;h3&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;h2&quot;&gt;h2&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;h1&quot;&gt;h1&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;h1&quot; selected=&quot;selected&quot;&gt;font size&lt;/option&gt;<br/>&nbsp;&nbsp;&lt;/select&gt;<br/>&nbsp;&nbsp;&lt;select onchange=&quot;ubbTag(this.form.id,&#039;&#91;color=&#039;+this.value+&#039;&#93;&#039;)&quot;&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;black&quot;&gt;color&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;black&quot; style=&quot;background-color:black; color:#FFFFFF;&quot;&gt;black&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;blue&quot; style=&quot;background-color:blue; color:#FFFFFF;&quot;&gt;blue&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;fuchsia&quot; style=&quot;background-color:fuchsia; color:#FFFFFF;&quot;&gt;fuchsia&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;gray&quot; style=&quot;background-color:gray; color:#FFFFFF;&quot;&gt;gray&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;green&quot; style=&quot;background-color:green; color:#FFFFFF;&quot;&gt;green&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;lime&quot; style=&quot;background-color:lime;&quot;&gt;lime&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;maroon&quot; style=&quot;background-color:maroon; color:#FFFFFF;&quot;&gt;maroon&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;navy&quot; style=&quot;background-color:navy; color:#FFFFFF;&quot;&gt;navy&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;olive&quot; style=&quot;background-color:olive; color:#FFFFFF;&quot;&gt;olive&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;orange&quot; style=&quot;background-color:orange; color:#FFFFFF;&quot;&gt;orange&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;purple&quot; style=&quot;background-color:purple; color:#FFFFFF;&quot;&gt;purple&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;red&quot; style=&quot;background-color:red; color:#FFFFFF;&quot;&gt;red&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;silver&quot; style=&quot;background-color:silver; color:#FFFFFF;&quot;&gt;silver&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;teal&quot; style=&quot;background-color:teal; color:#FFFFFF;&quot;&gt;teal&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;white&quot; style=&quot;background-color:white;&quot;&gt;white&lt;/option&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;option value=&quot;yellow&quot;style=&quot;background-color:yellow;&quot;&gt;yellow&lt;/option&gt;<br/>&nbsp;&nbsp;&lt;/select&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;url&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;url&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;img&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;img&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;email&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;email&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;code&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;code&#93;&#039;)&quot; /&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;quote&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;quote&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;cite&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;cite&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;linenum&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;linenum&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;b&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;b&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;left&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;align=left&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;center&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;align=center&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;right&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;align=right&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;textarea&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;textarea&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;pre&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;pre&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;sub&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;sub&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;sup&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;sup&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;abbr&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;abbr&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;address&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;address&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;dl&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;dl&#93;&#91;dd&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;dt&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;dt&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;dd&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;dd&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;nl&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;nl&#93;&#91;li&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;ol&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;ol&#93;&#91;li&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;ul&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;ul&#93;&#91;li&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;li&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;li&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;floatleft&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;float=left&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;floatright&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;float=right&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;tagLink&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;taglink&#93;&#039;)&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;button&quot; value=&quot;glLink&quot; onclick=&quot;ubbTag(this.form.id,&#039;&#91;gllink&#93;&#039;)&quot;/&gt;&lt;br/&gt;<br/>&nbsp;&nbsp;&lt;textarea name=&quot;content&quot; cols=&quot;80&quot; rows=&quot;10&quot;&gt;aaaaaaaaaa&lt;/textarea&gt;&lt;br/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;submit&quot; name=&quot;Submit&quot; value=&quot;Submit&quot;/&gt;<br/>&nbsp;&nbsp;&lt;input type=&quot;reset&quot; name=&quot;Reset&quot; value=&quot;Reset&quot;/&gt;<br/>&lt;/form&gt;<br/></div><br/>Tags - <a href="http://zhoujin.com/tags/javascript/" rel="tag">javascript</a> , <a href="http://zhoujin.com/tags/%25E6%258F%2592%25E5%2585%25A5/" rel="tag">插入</a> , <a href="http://zhoujin.com/tags/ubb%25E6%25A0%2587%25E7%25AD%25BE/" rel="tag">ubb标签</a> , <a href="http://zhoujin.com/tags/%25E5%2588%25B0%25E8%25A1%25A8%25E5%258D%2595/" rel="tag">到表单</a> , <a href="http://zhoujin.com/tags/%25E6%2596%2587%25E6%259C%25AC%25E5%259F%259F/" rel="tag">文本域</a> , <a href="http://zhoujin.com/tags/%25E5%2587%25BD%25E6%2595%25B0/" rel="tag">函数</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/48/</link>
<title><![CDATA[一直邮件发送的程序！很强的]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Thu, 23 Nov 2006 01:58:41 +0000</pubDate> 
<guid>http://zhoujin.com/post/48/</guid> 
<description>
<![CDATA[ 
	邮件发送组件,具体的使用方法参照该类的main方法<br/><br/><div class="code">/**<br/> * 邮件发送组件,具体的使用方法参照该类的main方法<br/> * &lt;code&gt;<br/> * <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String mailHost = &quot;smtp.163.com&quot;;&nbsp;&nbsp;//发送邮件服务器地址<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String mailUser = &quot;user1&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送邮件服务器的用户帐号<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String mailPassword = &quot;password1&quot;;&nbsp;&nbsp;//发送邮件服务器的用户密码<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&#91;&#93; toAddress = &#123;&quot;user1@163.com&quot;&#125;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使用超文本格式发送邮件<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MailSender sendmail = MailSender.getHtmlMailSender(mailHost, mailUser,mailPassword);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使用纯文本格式发送邮件<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//MailSender sendmail = MailSender.getTextMailSender(mailHost, mailUser,mailPassword);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail.setSubject(&quot;邮件发送测试&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail.setSendDate(new Date());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String content = &quot;&lt;H1&gt;你好,中国&lt;/H1&gt;&lt;img src=&#92;&quot;http://www.javayou.com/images/logo.gif&#92;&quot;&gt;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//请注意如果是本地图片比如使用斜杠作为目录分隔符,如下所示<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;content+=&quot;&lt;img src=&#92;&quot;D:/EclipseM7/workspace/JDlog/dlog/images/rss200.png&#92;&quot;/&gt;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail.setMailContent(content); //<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail.setAttachments(&quot;E:&#92;&#92;TOOLS&#92;&#92;pm_sn.txt&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail.setMailFrom(&quot;user1@163.com&quot;,&quot;发送者&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail.setMailTo(toAddress, &quot;to&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//sendmail.setMailTo(toAddress, &quot;cc&quot;);//设置抄送给...<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始发送邮件<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;正在发送邮件，请稍候.......&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail.sendMail();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;恭喜你，邮件已经成功发送!&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; catch (Exception ex) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/> * &lt;/code&gt;<br/> * @author Liudong<br/> */<br/>public abstract class MailSender extends Authenticator &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;private String username = null;&nbsp;&nbsp;&nbsp;&nbsp;//邮件发送帐号用户名<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String userpasswd = null;&nbsp;&nbsp;//邮件发送帐号用户口令<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected BodyPart messageBodyPart = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected Multipart multipart = new MimeMultipart(&quot;related&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected MimeMessage mailMessage = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected Session mailSession = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected InternetAddress mailToAddress = null;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 构造函数<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param smtpHost<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param username<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param password<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected MailSender(String smtpHost, String username, String password) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this(smtpHost,25,username,password);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 构造函数<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param smtpHost<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param smtpPort<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param username<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param password<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected MailSender(String smtpHost, int smtpPort, String username, String password) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.username = username;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.userpasswd = password;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties mailProperties = System.getProperties();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(smtpHost!=null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailProperties.put(&quot;mail.smtp.host&quot;, smtpHost);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(smtpPort&gt;0 &amp;&amp; smtpPort!=25)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailProperties.put(&quot;mail.smtp.port&quot;, String.valueOf(smtpPort));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailProperties.put(&quot;mail.smtp.auth&quot;, &quot;true&quot;); //设置smtp认证，很关键的一句<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailSession = Session.getDefaultInstance(mailProperties, this);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailMessage = new MimeMessage(mailSession);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart = new MimeBodyPart();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 构造一个纯文本邮件发送实例<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @see getTextMailSender(String smtpHost, int smtpPort, String username, String password)<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param smtpHost<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param username<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param password<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @return<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public static MailSender getTextMailSender(String smtpHost, String username, String password) &#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return getTextMailSender(smtpHost,25,username,password);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 构造一个纯文本邮件发送实例<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param smtpHost&nbsp;&nbsp;SMTP服务器地址<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param smtpPort&nbsp;&nbsp;SMTP服务器端口<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param username&nbsp;&nbsp;SMTP邮件发送帐号<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param password&nbsp;&nbsp;SMTP邮件发送帐号对应的密码<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @return<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public static MailSender getTextMailSender(String smtpHost, int smtpPort, String username, String password) &#123;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new MailSender(smtpHost,smtpPort,username,password) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void setMailContent(String mailContent) throws MessagingException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart.setText(mailContent);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multipart.addBodyPart(messageBodyPart);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 构造一个超文本邮件发送实例<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @see getHtmlMailSender(String smtpHost, int smtpPort, String username, String password)<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param smtpHost<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param username<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param password<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @return<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public static MailSender getHtmlMailSender(String smtpHost, String username, String password) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return getHtmlMailSender(smtpHost,25,username,password);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 构造一个超文本邮件发送实例<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param smtpHost&nbsp;&nbsp;SMTP服务器地址<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param smtpPort&nbsp;&nbsp;SMTP服务器端口<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param username&nbsp;&nbsp;SMTP邮件发送帐号<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param password&nbsp;&nbsp;SMTP邮件发送帐号对应的密码<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @return<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public static MailSender getHtmlMailSender(String smtpHost, int smtpPort, String username, String password) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new MailSender(smtpHost,smtpPort,username,password) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private ArrayList&lt;String&gt; arrayList1 = new ArrayList&lt;String&gt;();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private ArrayList&lt;String&gt; arrayList2 = new ArrayList&lt;String&gt;();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void setMailContent(String mailContent) throws MessagingException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String htmlContent = getContent(mailContent);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart.setContent(htmlContent, CONTENT_TYPE);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multipart.addBodyPart(messageBodyPart);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//调用处理html文件中的图片方法<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;processHtmlImage(mailContent);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//处理html页面上的图片方法如下：<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void processHtmlImage(String mailContent) throws MessagingException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; arrayList1.size(); i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart = new MimeBodyPart();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSource source = new FileDataSource((String) arrayList1.get(i));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart.setDataHandler(new DataHandler(source));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String contentId = &quot;&lt;&quot; + (String) arrayList2.get(i) + &quot;&gt;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart.setHeader(&quot;Content-ID&quot;, contentId);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart.setFileName((String) arrayList1.get(i));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multipart.addBodyPart(messageBodyPart);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//处理要发送的html文件，主要是针对html文件中的图片<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private String getContent(String mailContent) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Parser parser = new Parser();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parser.setInputHTML(new String(mailContent.getBytes(), ISO8859_1));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Parser parser = Parser.createParser(new String(mailContent.getBytes(), ISO8859_1));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Node&#91;&#93; images = parser.extractAllNodesThatMatch(HtmlNodeFilters.imageFilter).toNodeArray();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;images.length;i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageTag imgTag = (ImageTag) images&#91;i&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!imgTag.getImageURL().toLowerCase().startsWith(&quot;http://&quot;))<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrayList1.add(imgTag.getImageURL());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; catch (UnsupportedEncodingException e1) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; catch (ParserException e) &#123;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String afterReplaceStr = mailContent;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在html文件中用&quot;cid:&quot;+Content-ID来替换原来的图片链接<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int m = 0; m &lt; arrayList1.size(); m++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arrayList2.add(createRandomStr());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String addString = &quot;cid:&quot; + (String) arrayList2.get(m);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;afterReplaceStr = mailContent.replaceAll(<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(String) arrayList1.get(m), addString);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return afterReplaceStr;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//产生一个随机字符串，为了给图片设定Content-ID值<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private String createRandomStr() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char&#91;&#93; randomChar = new char&#91;8&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; 8; i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;randomChar&#91;i&#93; = (char) (Math.random() * 26 + &#039;a&#039;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String replaceStr = new String(randomChar);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return replaceStr;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private final static String CONTENT_TYPE = &quot;text/html;charset=GB2312&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private final static String ISO8859_1 = &quot;8859_1&quot;;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 用于实现邮件发送用户验证<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @see javax.mail.Authenticator#getPasswordAuthentication<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;protected PasswordAuthentication getPasswordAuthentication() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return new PasswordAuthentication(username, userpasswd);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 设置邮件标题<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param mailSubject<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @throws MessagingException<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setSubject(String mailSubject) throws MessagingException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailMessage.setSubject(mailSubject);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 所有子类都需要实现的抽象方法，为了支持不同的邮件类型<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param mailContent<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @throws MessagingException<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public abstract void setMailContent(String mailContent) throws MessagingException;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 设置邮件发送日期<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param sendDate<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @throws MessagingException<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setSendDate(Date sendDate) throws MessagingException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailMessage.setSentDate(sendDate);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 设置邮件发送附件<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param attachmentName<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @throws MessagingException<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setAttachments(String attachmentName) throws MessagingException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart = new MimeBodyPart();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSource source = new FileDataSource(attachmentName);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart.setDataHandler(new DataHandler(source));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int index = attachmentName.lastIndexOf(File.separator);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String attachmentRealName = attachmentName.substring(index + 1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;messageBodyPart.setFileName(attachmentRealName);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multipart.addBodyPart(messageBodyPart);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 设置发件人地址<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param mailFrom<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @throws MessagingException<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @throws UnsupportedEncodingException<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setMailFrom(String mailFrom, String sender) throws UnsupportedEncodingException, MessagingException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(sender!=null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailMessage.setFrom(new InternetAddress(mailFrom, sender));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailMessage.setFrom(new InternetAddress(mailFrom));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 设置收件人地址，收件人类型为to,cc,bcc(大小写不限)<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param mailTo&nbsp;&nbsp; 邮件接收者地址<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param mailType 值为to,cc,bcc<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @author Liudong<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setMailTo(String&#91;&#93; mailTo, String mailType) throws Exception &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; mailTo.length; i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailToAddress = new InternetAddress(mailTo&#91;i&#93;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (mailType.equalsIgnoreCase(&quot;to&quot;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailMessage.addRecipient(Message.RecipientType.TO,mailToAddress);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if (mailType.equalsIgnoreCase(&quot;cc&quot;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailMessage.addRecipient(Message.RecipientType.CC,mailToAddress);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else if (mailType.equalsIgnoreCase(&quot;bcc&quot;)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailMessage.addRecipient(Message.RecipientType.BCC,mailToAddress);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new Exception(&quot;Unknown mailType: &quot; + mailType + &quot;!&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 开始发送邮件<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @throws MessagingException<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @throws SendFailedException<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public void sendMail() throws MessagingException, SendFailedException &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (mailToAddress == null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new MessagingException(&quot;The recipient is required.&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailMessage.setContent(multipart);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transport.send(mailMessage);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public MimeMessage getMimeMessage() throws MessagingException&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (mailToAddress == null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new MessagingException(&quot;The recipient is required.&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailMessage.setContent(multipart);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return mailMessage;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/**<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 邮件发送测试<br/>&nbsp;&nbsp;&nbsp;&nbsp; * @param args<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;public static void main(String args&#91;&#93;) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String mailHost = &quot;smtp.126.com&quot;;&nbsp;&nbsp;//发送邮件服务器地址<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String mailUser = &quot;88888&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//发送邮件服务器的用户帐号<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String mailPassword = &quot;8888&quot;;&nbsp;&nbsp;//发送邮件服务器的用户密码<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&#91;&#93; toAddress = &#123;&quot;8888&quot;,&quot;888888&quot;,&quot;88888&quot;&#125;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使用超文本格式发送邮件<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MailSender sendmail = MailSender.getHtmlMailSender(mailHost, mailUser,mailPassword);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//使用纯文本格式发送邮件<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//MailSender sendmail = MailSender.getTextMailSender(mailHost, mailUser,mailPassword);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail.setSubject(&quot;邮件发送测试&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail.setSendDate(new Date());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String content = &quot;&lt;H1&gt;你好,中国&lt;/H1&gt;&lt;img src=&#92;&quot;http://www.javayou.com/images/logo.gif&#92;&quot;&gt;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//请注意如果是本地图片比如使用斜杠作为目录分隔符,如下所示<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//content+=&quot;&lt;img src=&#92;&quot;D:/rss.png&#92;&quot;/&gt;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail.setMailContent(content); //<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//sendmail.setAttachments(&quot;D:&#92;&#92;pm_sn.txt&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail.setMailFrom(&quot;8888888&quot;,&quot;发送者&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail.setMailTo(toAddress, &quot;to&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//sendmail.setMailTo(toAddress, &quot;cc&quot;);//设置抄送给...<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开始发送邮件<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;正在发送邮件，请稍候.......&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sendmail.sendMail();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&quot;恭喜你，邮件已经成功发送!&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125; catch (Exception ex) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;</div><br/>Tags - <a href="http://zhoujin.com/tags/%25E9%2582%25AE%25E4%25BB%25B6/" rel="tag">邮件</a> , <a href="http://zhoujin.com/tags/%25E7%25BB%2584%25E4%25BB%25B6/" rel="tag">组件</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/47/</link>
<title><![CDATA[５秒钟内反应过来的就是高手 ]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Sun, 19 Nov 2006 14:56:44 +0000</pubDate> 
<guid>http://zhoujin.com/post/47/</guid> 
<description>
<![CDATA[ 
	你现在清醒吗？以下有三道题目，在看完题目后立即写在纸上，不准慢慢想！看下你是否真的清醒<br/>第一题:<br/>你正在参加赛跑，几惊辛苦， 你终于超过第二位的健儿，<br/>你现在是第几位？（请写在纸上）<br/><br/>第二题:（不可以用多过第一题的时间， 要快！）<br/>如果你跑呀跑， 超过最后一名， 而你现在是第几？（请写在纸上）<br/><br/>第三题:（开始觉得自己有点猪头了吧......）<br/>数学心算题题... 不准用笔，纸或计数器， 只可以心算......<br/>1000 加上40 ......得未... 再加1000 ... 再加30...<br/>再多1000... 又再加20... 现在再加多1000... 再加10...<br/>总和是多少？马上回答！（请写在纸上）<br/>点击下面“查看更多”看答案！<br/><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">第一题答案：<br/>如果你答第一，你就完全错啦！<br/>如果你超前原本第二的人，你便取代他的位置，即是第二，猪头！<br/><br/>第二题答案：<br/>如果你答尾二， 你又错啦！<br/>你又怎么可能超前最后人，他都是最尾咯？你怎么还会在他后面？呵呵~<br/><br/>第三题答案：<br/>5000？又错啦！<br/>自己拿个计算器算一下，是4100 冒失鬼！<br/>你真是超笨呀......</div></div>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/46/</link>
<title><![CDATA[纪念徐志摩逝世75周年！]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Sat, 18 Nov 2006 16:00:00 +0000</pubDate> 
<guid>http://zhoujin.com/post/46/</guid> 
<description>
<![CDATA[ 
	一直以来都比较喜欢徐志摩，11-19日是徐志摩逝世75周年的纪念日，在这里，向逝去的诗人鞠躬！<br/><a href="http://zhoujin.com/attachment/1163651195_0.jpg" target="_blank"><img src="http://zhoujin.com/attachment/1163651195_0.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">徐志摩生平介绍 <br/>　　徐志摩(1897-1931)，中国诗人、散文家。留学美国时改字志摩，小字又申。笔名有南湖、云中鹤等。浙江海宁人。1916年入北京大学法科。1918年赴美国学习银行学。<br/><br/>　　1921年，入伦敦剑桥大学当特别生，开始新诗创作。1922年回国，在报刊上发表诗文。1923年参与成立新月社，同时也加入了文学研究会。1924年，与胡适、陈西滢等创办《现代评论》周刊，并任北京大学教授。1925年 3-7月，历游苏、德、意、法诸国，同年出版第一本诗集《志摩的诗》。1925年10月-1926年10月，主编《晨报副刊》。这一年，写了诗集《翡冷翠的一夜》和散文集《巴黎的鳞爪》、《自剖》、《落叶》中的大部分作品，是他创作最多的一年。这以前的诗作，大多是对于黑暗封建势力的不满，带有激烈的燃烧性的热情，但也流露出享乐主义的生活哲学和庸俗的生活情趣。<br/><br/>　　1927年春，与胡适、邵洵美等筹办新月书店。秋后，任上海光华大学、东吴大学教授。稍后，又任上海大夏大学、南京中央大学教授，并兼任中华书局编辑。1928年3月，《新月》月刊创刊，一度担任该刊主编。同年9-11月，历游英国、美国、日本和印度。1930年到北京大学与北京女子大学任教。1931年，与陈梦家、方玮德创办《诗刊》季刊。这一时期的诗作，抹去了以前的火气，调子低沉，多是颓唐失望的叹息。<br/><br/>　　他的诗集除《志摩的诗》外，还有《翡冷翠的一夜》、《猛虎集》及身后陈梦家为之编辑的《云游》。小说集有《轮盘》、戏剧《卞昆冈》(与陆小曼合作)、日记《爱眉小札》。详情>>></div></div><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">月下待杜鹃不来<br/><br/>看一回凝静的桥影，<br/>数一数螺钿的波纹，<br/>我倚暖了石栏的青苔，<br/>青苔凉透了我的心坎；<br/><br/>月儿，你休学新娘羞，<br/>把锦被掩盖你光艳首，<br/>你昨宵也在此勾留，<br/>可听她允许今夜来否?<br/><br/>听远村寺塔的钟声，<br/>象梦里的轻涛吐复收，<br/>省心海念潮的涨歇，<br/>依稀漂泊踉跄的孤舟！<br/><br/>水粼粼，夜冥冥，思悠悠，<br/>何处是我恋的多情友，<br/>风飕飕，柳飘飘，榆钱斗斗，<br/>令人长忆伤春的歌喉。</div></div><br/><br/>Tags - <a href="http://zhoujin.com/tags/%25E5%25BE%2590%25E5%25BF%2597%25E6%2591%25A9/" rel="tag">徐志摩</a> , <a href="http://zhoujin.com/tags/%25E5%2591%25A8%25E5%25B9%25B4/" rel="tag">周年</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/61/</link>
<title><![CDATA[监狱问题?]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[歪布天地]]></category>
<pubDate>Fri, 17 Nov 2006 08:00:30 +0000</pubDate> 
<guid>http://zhoujin.com/post/61/</guid> 
<description>
<![CDATA[ 
	一个监狱长把所有囚徒招来，对他们说，<br/><br/>1。这次会议结束之后，你们将被隔离，互相之间再也不能交流任何信息，除了2。<br/>2。你们唯一可以交流信息的是我桌子上的一枚硬币。因为我会经常的随机的叫你们中的一个到我的办公桌来。被叫来的人可以决定硬币哪面朝上，然后离开。接着我会叫下一个。<br/>3。硬币的初始面由我来定。我也可以改变它在桌子上的位置。自从你们中的第一个人被叫进来，我便不会再翻硬币了。<br/>4。如果有一天你们中的一个声称所有人都曾经被单独叫到我的办公室。如果说对了，你们就都被释放，如果说错了，你们就都将被处决。<br/>5。现在给你们10分钟时间。<br/><br/>注意：除了硬币的正反面朝上，没有其他信息。也就是信息只有一位二进制。另外初始状态是不知道的。<br/><br/>请给出一个安全的策略，让这些囚犯有机会被全部释放，而被处决的可能为0。<br/>Tags - <a href="http://zhoujin.com/tags/%25E7%259B%2591%25E7%258B%25B1%25E9%2597%25AE%25E9%25A2%2598/" rel="tag">监狱问题</a> , <a href="http://zhoujin.com/tags/%25E4%25BA%258C%25E8%25BF%259B%25E5%2588%25B6/" rel="tag">二进制</a> , <a href="http://zhoujin.com/tags/%25E7%25A1%25AC%25E5%25B8%2581/" rel="tag">硬币</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/45/</link>
<title><![CDATA[从星际争霸看中美俄三国]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Thu, 16 Nov 2006 04:24:00 +0000</pubDate> 
<guid>http://zhoujin.com/post/45/</guid> 
<description>
<![CDATA[ 
	写得挺不错的一篇文章，通过星际这种游戏诙谐的解释各个国家的状况，看不上去似乎有点离谱，但想想却又不无道理，以下为引用Synow.CN日志中的一篇文章。<br/><br/>　　星际打多了，自然就会有一些感想，突然觉得星际很有点像现在的世界大局。美国好比Protoss（神族），科技先进，武器发达，各种花样也很多。但就是怕打仗，尤其是打大仗。因为打仗要死人，而P的繁殖力低下，打不起人海战术，于是就用种种稀奇古怪的武器远远地打。P的武器大家都知道，其贵无比，比如巡航导弹要几百万美刀一个，一百个就是好几亿啊，隐形飞机动不动就上亿，航母加上买飞机的钱要上百亿。所以美国人和P的习惯一样，喜欢外科手术式的打法，小规模、低强度的战斗可以一个人也不死，但常常买炸弹的钱比炸掉的东东还贵好多。 <br/><br/>　　俄罗斯很像Terran（人族），攻击力弱，但是防御力相当好，很少有人能突破攻城坦克组成的防线，因此俄罗斯自古以来不怕任何入侵。他们的武器简单实用，电子设备很少，绝大多数是机械加模拟。可是打仗不是打游戏，按钮太多也不好，真打起来我还是要AK-47这种东西。俄罗斯人吃苦耐劳，思想死板，服从教条，看上去有点傻，所以打游击不行，单个的俄国师团也缺乏威力；而当100个俄国装甲师集中起来，用宽正面大纵深的打法冲击的话，不用核弹炸恐怕没人能挡住。所以至今俄罗斯的超级大国地位，没有人敢否认。 <br/><br/>　　中国呢，就好比Zerg（虫族，就是狂吐唾末的），特点就是人多，力量大，繁殖快，东西便宜，而且很不怕死，故可以打人海战术，你美国人来一个师，我来十几个，并且后面还源源不断。你有M1A1，我有T59，M1A1造价要上千万美元，配三个大**，T59只要几十万RMB，四个农民兵就可以开，上面再爬上十几个农民兵，身上捆着炸药包，一见到敌人就拉了弦往前跑，就算炸不飞你的贫铀装甲，总能炸断一根炮管，半条履带吧，再不，也总能砸坏几个探测器吧。等59式和农民兵拚的差不多了，中国的90式再上。这就好像Zerg的狗海打法，小狗混着大狗一块冲。“当他们冲锋的时候，好像整座山都动了起来”，见过这种恐怖打法的韩战美国兵这样描述道。而且中国抢资源的能力也很强（见过永定门火车站要饭的吗？），要是动员起来，中国农民挖资源，工人造武器，航母之类的先进东西造不出来，造几亿杆枪是小菜一碟；再暂时取消计划生育，于是几个月就可以招募上亿民兵，合一万个师，几百个集团军，而一年之后，这点人又生出来了；这也不比Zerg差。 <br/>　　　　 <br/>　　　　Protoss的特点是尊重个人，认为每一个人都是独立的，自由的，这些权利是上天赋予，神圣不可侵犯的。所以不管本领大小，地位高低，每个人都很牛逼，而这种个人奋斗精神，确实是美国的立国之本，也造就了无数猛人。所以论科技、文化、个人的机会、社会的公平程度，P均达到了很理想的程度。但是P的这种精神，从另一个方面看，也导致了社会缺乏凝聚力，容易争论不休，形不成拳头，甚至发生内乱。在物质层面上，P的浪费现象极为严重，地球上的资源有一半是被P用掉的，而一旦资源发生危机，P的社会就可能出现问题。至于Z吗，这个，这个苦得很，我就不说了。 <br/><br/>　　但是问题就来了，现在假设你是一条小狗，因为善于咬人，被P看中了。P就跟你说了，你们那里有什麽好，一间房子住八个人，每个月只发25个矿，打起来就派你做炮灰，还是过来吧。你就想了，不错啊，四脚着地到处爬的味道是不好，还是溜去P那里做光刀武士开心，又威风又神气。于是你说自己肚子痛，偷偷躲着你的房子朝东狂爬了几天，抬头一看，房子带了几条龙在等你。你怕得瑟瑟发抖，哭喊求饶，房子说，别怕，你老板我也刚拿了黑暗圣堂的牌照，以后你还是跟我，不过将来不是大锅饭了，不许再捣浆糊啊。 <br/><br/>　　那么，这种事情一多，高手是不是就走光了呢？Z就不行了呢？我认为，不会的，第一，Zerg永远是Zerg，就算套了一层能量罩，挥着两把光刀，大叫“Yes, Sir“，P还是认为你是Zerg，你也知道自己是Zerg；第二，Zerg的立国之本，就不在乎个人，爱走不走，爱回来就回来，少一只狗地球就不转了吗？第三，这种高段小狗大量外流的形势，其实正是Z扩张领土，抢夺资源的手段之一，你去首都机场听听看，一个个都大叫“我们都有四条腿，不在中国吃干饭”然后跳跃几下，以示决心。 <br/><br/>　　我们东北面有一个岛，叫日本，原来也是Zerg，后来看P搞得好，于是一个叫明治的大房子就搞维新，要“脱Z入P”，结果大获成功，把周围的Z邻居们都海扁一顿。日本Zerg们就真以为自己变成P了，就不大把正宗的P放在眼里了，就偷偷派了好多兵去打美国，同时还企图用狂狗灭了中国，结果美国P们大怒，“美国从来没有这么团结过”，造了无数航母，用神海打法，一会儿就把日本的几条破船给淹了；中国这边，日本的狗兵也被灭了不少，老家又被丢了俩核弹，只好认输，老老实实做回Zerg。 <br/><br/>　　我们南面有个国家，古叫安南，自称越南。这个越南原来分成两半，北面一半，南面一半，人口有上亿，当然也属于Zerg的一种；南面的一半看美国这个好啊，一心想变成P，再不至少也得请P爸爸来管。北面的那半不答应，说安南Zerg不能让P给管了，要管也得让中国Zerg来管，不答应就动手打，南面的打不过，就向美国爸爸叫救命，美国的大执政官啃泥迪就想了，人家呼唤自由民主，这是好事，我们美国得帮（这是个秘诀，如果你实在混不下去了，就找个美国人能听见的地方，往地上一躺，四脚朝天，大哭曰“给我柿油啊，我要民主啊，我被迫害啦，没有人权啊，强迫堕胎啦”，美国的仲裁机立马就到），于是就派了许多圣堂武士加海盗机去越南。北越一看，头皮有点麻，心想，Z打Z＋P，一对二，不太好打，这中国同志有经验，于是胡志明就飘到了北京，见了毛大房子和周二房子。房子们一合计，想出来一招，叫“游击战”，就是派几十万小狗打扮成农民，从北往南爬，见了单个的P就围上去狂咬，每天咬死一百个，一年就是好几万。后来美国就莫名其妙地老死人，死的一多，美国人就想了，这安南小狗有没有民主关我P事。后来啃泥迪就给毙了，美国兵就撤了。美国兵一撤，胡房子就带了上百万狂狗猛冲，立马就灭了南越。 <br/><br/>　　现在我们东面有个小岛，叫台湾，不好好做Zerg，也想“脱Z入P”，可是这事有点难办，因为Z就是靠的人多，人多就得统一，统一人才能多；一分裂人就少一半，还很容易自己跟自己干起来，白死许多人，让邻居捡了便宜。所以自古以来，Zerg最恨的就是搞分裂的家伙，Z世界也越来越统一。台湾人因为星际打少了，不懂这个道理，心想，我要独立，关你P事。有的道理，不打一打是弄不明白的，比如P航母中看不中用的道理，不打几仗是不会明白的；要让台湾人懂得不该独立，不能独立，也不许你独立的道理，不打一仗也是不行的。 <br/><br/>　　总的来说，在这个世界上，P族是继承了希腊罗马的传统，所以既有民主意识又有国家精神，西方发达国家大多属于这个范畴；Z族大多是东方国家，受中华文化的影响很深，人口众多，历史悠久且相对贫困；T族则多属于宗教国家或专制政权后裔，因此思想大一统，给人以铁板一块，缺乏生命力的感觉，包括阿拉伯国家及东欧国家。在许多方面，P是一个极端，Z是另一个极端，而T则常常处于二者之间。其中有一个特例，即闪米特人，是属于Z的。 <br/><br/>　　民族可以分合聚散，国家可以兴衰存亡，但是这个Z、T、P的分类却似乎历久常新，因为中华民族是Z的代表，所以五千年我们不亡，可能再过五千年我们还在。 <br/>Tags - <a href="http://zhoujin.com/tags/%25E6%2598%259F%25E9%2599%2585%25E4%25BA%2589%25E9%259C%25B8/" rel="tag">星际争霸</a> , <a href="http://zhoujin.com/tags/%25E4%25B8%25AD/" rel="tag">中</a> , <a href="http://zhoujin.com/tags/%25E7%25BE%258E/" rel="tag">美</a> , <a href="http://zhoujin.com/tags/%25E4%25BF%2584/" rel="tag">俄</a> , <a href="http://zhoujin.com/tags/%25E4%25B8%2589%25E5%259B%25BD/" rel="tag">三国</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/44/</link>
<title><![CDATA[如果让李敖娶了芙蓉]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Thu, 16 Nov 2006 04:16:09 +0000</pubDate> 
<guid>http://zhoujin.com/post/44/</guid> 
<description>
<![CDATA[ 
	以下的文字有点意思...<br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">　“李 …… 敖 …… 有 …… 话 …… 说 ……” <br/>　　李敖从大陆归来，节目中的这句拉场词，音拉得更长，头摇得更猛。老沈反映，我最近看《李敖有话说》，已呈现花痴状态，想必是中了李敖隔屏打妞的唾沫星子，迷了性。其实老沈不知，当时我正有个想法儿：干脆把芙蓉姐姐嫁给李敖。 　　　　<br/>　　芙蓉有两宝：丰乳肥臀。李敖也有两宝：坐牢骂人。在李敖眼里：举国上下皆文盲；在芙蓉眼中：普天之下皆色狼。 　　　<br/>　　从性学角度讲：李敖是精神上的色魔，行动中的患者；而芙蓉则是精神上的患者，行动中的花痴。 　　　　<br/>　　李敖每说一句话都期待别人的掌声；芙蓉每上一张照片都等待别人的骂声。 　　　　<br/>　　李敖爱骂人，芙蓉爱被人骂，愿打愿挨，收支平衡。 　　　<br/>　　芙蓉嫁李敖，婚礼应该在天坛举行，那儿风大。芙蓉自是长袖善舞；李敖也好骂声远播。会场布置要别致。对联自是少不了的 —— 上联：问世间谁与争风；下联：惟有我李敖芙蓉；横批：绝配。选司仪也是难事儿。用李咏不行，那丫脸长兜风，脚下不稳；用朱军也不行，那斯泪多话少，怕吹疵了皮儿。还得用赵忠祥，亦庄亦邪，前半场来个新闻联播，下半场还能整点黄嗑儿。 　　　<br/>　　李、芙婚后，事业上也要实现联合。以后的《李敖有话说》要配上芙蓉的舞蹈 —— 李敖讲到丰满处，芙蓉示胸；李敖讲到厚重处，芙蓉秀臀。最后讲到结尾处，芙蓉再做 S 型压轴：意为 ‘Shut up !’ <br/>　　……<br/>　　说到此处，心有不忍。其实，我是热爱李敖的，可终究还是要忍痛割爱。<br/>　　哎！就让同道人终成 ‘ 家 ’ 属吧 …… </div></div><br/>Tags - <a href="http://zhoujin.com/tags/%25E6%259D%258E%25E6%2595%2596/" rel="tag">李敖</a> , <a href="http://zhoujin.com/tags/%25E8%258A%2599%25E8%2593%2589%25E5%25A7%2590%25E5%25A7%2590/" rel="tag">芙蓉姐姐</a> , <a href="http://zhoujin.com/tags/%25E4%25B9%25B1%25E5%25BC%25B9/" rel="tag">乱弹</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/43/</link>
<title><![CDATA[最欠扁的脑筋急转弯！！]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Thu, 16 Nov 2006 04:11:37 +0000</pubDate> 
<guid>http://zhoujin.com/post/43/</guid> 
<description>
<![CDATA[ 
	在落伍者看到的，我无语了~~<br/><br/><div class="quote"><div class="quote-title">引用</div><div class="quote-content">题目：蓝色的刀和蓝色的枪<br/>谜底：刀枪不入(blue)<br/><br/>题目：身穿着金色衣服的人<br/>谜底：一名惊人<br/><br/>题目：数字“3”在路上走呀走...翻了一个跟斗...接着又翻了一个...<br/>谜底：三番五次<br/><br/>题目：一条狗过了独木桥之后就不叫了<br/>谜底：过目不忘（汪）<br/><br/>题目：第十一本书<br/>谜底：不可思议(book 11)<br/><br/>题目：牛狗猪羊比赛赛跑...跑到终点后...牛狗猪都喘得不得了...只有羊不喘气<br/>谜底：扬眉吐气(羊没吐气)<br/><br/>题目：避孕药的主要成份是什么？<br/>谜底：抗“生”素<br/><br/>题目：放烟火时为什么不会射到星星？<br/>谜底：因为星星会“闪“<br/><br/>题目：一个离过很多次婚的女人，该怎么称呼她？<br/>谜底：前 “公“ 尽弃<br/><br/>题目：一只蜜蜂叮在挂历上<br/>谜底：风（蜂）和日丽（日历）<br/><br/>题目：一只熊走过来<br/>谜底：有备而来（有bear来） </div></div><br/><br/>Tags - <a href="http://zhoujin.com/tags/%25E6%25AC%25A0%25E6%2589%2581/" rel="tag">欠扁</a> , <a href="http://zhoujin.com/tags/%25E8%2584%2591%25E7%25AD%258B%25E6%2580%25A5%25E8%25BD%25AC%25E5%25BC%25AF/" rel="tag">脑筋急转弯</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/42/</link>
<title><![CDATA[水木周平戏说中国网络黑幽默！]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Thu, 16 Nov 2006 03:29:41 +0000</pubDate> 
<guid>http://zhoujin.com/post/42/</guid> 
<description>
<![CDATA[ 
	 &nbsp; &nbsp; &nbsp;1: 百度贴吧都知道吧，有狗吧，牛吧，十一生肖都有。（没错！只有十一生肖！）唯独没有鸡吧。我属鸡，为此我很伤心。----听说过草木皆兵吗？ <br/><br/> &nbsp; &nbsp;2: 这个世界上最远的距离是什么？天涯海角？不对！ 两颗心？不对！ 战争与和平？不对！南极于北极？也不对！世界上最远的距离是：电信与网通。----“中国网宽天下”这句广告词吼得不错，但心胸未必宽广。<br/><br/> &nbsp; &nbsp;3：一日半夜正在熬灯夜作，忽一个叫“浪漫女孩”的敲响了我的QQ。她说：“帅哥，我真的好喜欢你，可以加我吗？”我正在琢磨为什么我突然交了桃花运的时候。她突然口气一转：“视频包月脱给你看！30元一月！150元半年！特价大优惠……”----恍惚进入菜市场。<br/><br/> &nbsp; &nbsp;4：起码有一半的网站上“共产党”“天安门”等正常词汇都被列为违法词汇。在网络游戏RF中只要你一说“中国”二字就会提示你使用了违法词汇，而“法国”“澳大利亚”等则不违法。这是什么法？----看来是没办“法”。<br/><br/> &nbsp; &nbsp;5：网络上流传的缩写的英文字母被一些政府文件列为非正常词汇，比如PK。但他们忘了自己也经常缩写英文，如WTO，CBD，GDP，GPRS等。----谁说过让百姓点灯了？<br/><br/> &nbsp; &nbsp;6：我年迈的母亲给我打电话的时候经常念叨叫我不要上网，我亲戚朋友也是这样教育自己的子女的，他们说网上全是坏东西。在她的眼里网络就是一个妖魔。----我很遗憾，这么美好的东西，被有些人妖魔化了，导致更多的百姓谈网色变。<br/><br/> &nbsp; &nbsp;7：在全世界的网站都在为保护版权而努力的时候，中国的一些少数网络写手们却都在纷纷呐喊：“求求你们了，转我的文章吧。”----俗话说好的东西再贵也买，烂东西白给不要！别犯贱！<br/><br/> &nbsp; &nbsp;8：QQ上某一陌生人发来消息：有个女孩患了白血病，她的名字叫XXX。地址XXX。银行帐户XXXX。需要你的资助！把以上消息发给20个人（不在线的也算！）腾讯公司将把您升级为金牌会员！名字为金色！如果您不转发的话三个月内必有血光之灾！我试过！是真的哟！----在中国胡萝卜+大棒从来都好使。<br/><br/> &nbsp; &nbsp;9：某帖子最后附带一张PS过的鬼图以及文字说明如下：凡是看了本帖不回帖的人，晚上都会被这个鬼缠上。七日之内必死！----楼主自己似乎就没回过，估计已死。<br/><br/> &nbsp; &nbsp;10：当你在某些门户网站上发现一条新闻标题或者图片缩略图时，你点过去发现打开的不过是另外的一个汇总信息页。当你在这个汇总信息页找了半天才找到你想看的东西时，再点过去又发现不过是又又另外一个汇总信息页。最后要点七八次才能看到自己想看的新闻或者图片。----中国式点击量的诞生！<br/>Tags - <a href="http://zhoujin.com/tags/%25E7%25BD%2591%25E7%25BB%259C/" rel="tag">网络</a> , <a href="http://zhoujin.com/tags/%25E6%2589%25AF%25E6%25B7%25A1/" rel="tag">扯淡</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/41/</link>
<title><![CDATA[说唱FLASH -- 十元人民币]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Thu, 16 Nov 2006 03:26:05 +0000</pubDate> 
<guid>http://zhoujin.com/post/41/</guid> 
<description>
<![CDATA[ 
	上班时间无意间看到的FLASH，听了两遍，旋律是不错，就是骂得太损了点。<br/><br/>此处包含一个多媒体文件，请用网页方式查看。<br/><br/>歌曲：十元人民币<br/>歌手：小驴-tommy <br/><br/>哎呀老虎不发威你拿我当holle kitty是不是?<br/>小驴不说话你拿我当snoop啊?<br/>天晴了雨停了你又觉得你行了<br/><br/>人间大道你说你怎么咋就不去走呢?<br/>五员人民币就是说你这种没实力<br/>拿着别人的作品硬说是自己的创意<br/>别再欺骗自己那不是你的实力<br/>也许你自己的无能使你这么没有自信<br/>只会偷别人的抄袭那没有任何意义<br/>你从小缺盖长大缺爱腰系麻绳头顶锅盖<br/>还说你是中国说唱界的东方不败<br/>你长的挺有创意活得挺有勇气<br/>丑不是你的本意是上帝发的脾气<br/>你活着浪费空气死了浪费土地<br/>掘b的浪费人民币<br/>如果没有你的存在怎么能衬托世界的美丽<br/>如果没有你的存在怎么能衬托lm的美丽<br/>你靠山山倒靠河河干看鸡鸡死看狗狗翻<br/>还要杨起hip-hop的一片风帆<br/>你还整个你的名字叫做旷云你不如叫做矿井<br/>你妈叫做旷课你爸叫做矿工<br/>你还起名叫做云上舞你不如叫过街老鼠<br/>我写啥你抄啥你还真是有点土<br/>你语言没有杀伤力拿着5个大硬币<br/>看场三毛流浪记一天活得还挺满意<br/>没事喝着小酒然后迈着犬步<br/>梳着伤心的发型走在乡间的小路<br/>还硬说你那个让人踢碎的嗓子唱歌像tm阿杜<br/>(这小子那天在网吧上网然后给人发视平<br/>人家网管告诉他防火墙不同发不了<br/>他还一下跟人网管急了哪个是防火墙防火墙在哪呢<br/>我要给它扒了我要看人<br/>你这个老顿迷糊那个嘴笨的跟棉裤裆似的<br/>还天天在那汪汪汪汪汪汪汪还这rap 那rap的)<br/>还有一个三级模特自以为很挺独特<br/>身上的避孕工具更不只一个两个<br/>她需要让人养着不需要让人管着<br/>她嫉妒心随着春季之们常开着<br/>她打扮比鬼难看一打扮鬼都瘫痪<br/>你说你该怎么办<br/>你说身高是你的优势丰满是你的标志<br/>为啥一说话就像是孩子弱了智<br/>你说有钱人就是机智没钱人就是幼稚<br/>那我的钱和你比你简直就是精致<br/>你还在那跟我在这吹你奶奶个哨子<br/>-她家那穷的<br/>交通基本靠走通信基本靠吼<br/>取暖基本靠抖治安基本靠狗<br/>你说你还怎么说的出口<br/>真是在大众面前献丑(献丑)<br/>你头上插个鸡毛掸子没事包个狗皮毯子<br/>近看像个铅笔杆子远看像个铁皮铲子<br/>hey what s girl <br/>真的有句话想对你说你想知道吗?<br/>那我就告诉你你xx 狗xx <br/>(你说你家穷那个样你说你拿个小灵通你站在风雨中<br/>左手换右手你还右手打不通耗子去你家都含眼泪走的<br/>这样你还说你男朋友长的帅有钱长的是有前<br/>长的跟前列腺似的尿尿都分岔了赶紧给治治吧<br/>还白呼啥呀)<br/>还有人天天在那告诉我什么才是真正的嘻哈<br/>问我听了他那个散尿的音乐到底哈不哈<br/>什么刀枪棍棒斧岳钩叉烧饼油条包子麻花<br/>我看你就像一个纯种荷兰傻瓜<br/>yo $#$%……—*()——~#%$……%%…………—*<br/>--说的啥啊<br/>--我也不知道<br/>听不惯的有意见的都闭上你的嘴<br/>让我发现了那就是给你们一顿堆<br/>hip-hop不是cool 它是一种态度<br/>为啥你们总三翻五次的老犯错误<br/>炫耀过度还是你根本没穿内裤<br/>为啥总感觉你没走寻常路呢<br/>上有天下有地中间有空气<br/>歌里有了你们的参与那才算是有了完整意义<br/>这回给你们点脸希望你们长点记性<br/>别以为这样很不公平<br/>其实是你们真的不行<br/>大萝卜坐飞机你在那给冒充进口大苹果呢<br/>老强调自己有智商这回真的让我给治伤了是不是?<br/>写这点玩意给我累坏了两管笔都写没油了<br/>--tommy哥在最后再整两句<br/>整两句整啥呢拉倒吧就这么结素吧<br/>老整两句多俗啊就这样挺好的行不行?<br/>--那也行<br/>Tags - <a href="http://zhoujin.com/tags/flash/" rel="tag">flash</a> , <a href="http://zhoujin.com/tags/%25E5%258D%2581%25E5%2585%2583%25E4%25BA%25BA%25E6%25B0%2591%25E5%25B8%2581/" rel="tag">十元人民币</a> , <a href="http://zhoujin.com/tags/%25E5%25B0%258F%25E9%25A9%25B4/" rel="tag">小驴</a> , <a href="http://zhoujin.com/tags/tommy/" rel="tag">tommy</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/40/</link>
<title><![CDATA[你《HTTP 1.0/1.1/NG》了吗？- ]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[歪布天地]]></category>
<pubDate>Tue, 07 Nov 2006 06:18:18 +0000</pubDate> 
<guid>http://zhoujin.com/post/40/</guid> 
<description>
<![CDATA[ 
	你《HTTP 1.0/1.1/NG》了吗？<br/><br/>HTTP 协议老的标准是HTTP/1.0，目前最通用的标准是HTTP/1.1。HTTP/1.1是在HTTP/1.0基础上的升级，增加了一些功能，全面兼容HTTP/1.0。HTTP/1.0不支持文件断点续传，目前的Web服务器绝大多数都采用了HTTP/1.1。<br/>RANGE:bytes是HTTP/1.1新增内容，HTTP/1.0每次传送文件都是从文件头开始，即0字节处开始。RANGE:bytes=XXXX表示要求服务器从文件XXXX字节处开始传送，这就是我们平时所说的断点续传！<br/><br/>原文英文版<br/>RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0<br/><a href="http://www.w3.org/Protocols/rfc1945/rfc1945" target="_blank">http://www.w3.org/Protocols/rfc1945/rfc1945</a><br/><a href="http://www.faqs.org/rfcs/rfc1945.html" target="_blank">http://www.faqs.org/rfcs/rfc1945.html</a><br/><br/>RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1<br/><a href="http://www.w3.org/Protocols/rfc2616/rfc2616" target="_blank">http://www.w3.org/Protocols/rfc2616/rfc2616</a><br/><a href="http://www.w3.org/Protocols/rfc2616/rfc2616.html" target="_blank">http://www.w3.org/Protocols/rfc2616/rfc2616.html</a><br/><a href="http://www.faqs.org/rfcs/rfc2616.html" target="_blank">http://www.faqs.org/rfcs/rfc2616.html</a><br/><br/>(Proposed) HTTP-NG Working Group<br/><a href="http://www.w3.org/Protocols/HTTP-NG/" target="_blank">http://www.w3.org/Protocols/HTTP-NG/</a><br/>下一代超文本传输协议(HTTP-NG)，为了克服当前HTTP协议的缺点，W3C(World Wide Web consortium)开始研究制定下一代HTTP协议?TTP-NG。它分三个层次：应用层、消息层、传输层。现有WEB上应用将转换到HTTP-NG平台上，最后整个平台都会更新为HTTP-NG。<br/><br/>RFC 1945 - Hypertext Transfer Protocol -- HTTP/1.0 中文版<br/><a href="http://man.chinaunix.net/develop/rfc/RFC1945.txt" target="_blank">http://man.chinaunix.net/develop/rfc/RFC1945.txt</a><br/><a href="http://www.cnpaf.net/rfc/rfc1945.txt" target="_blank">http://www.cnpaf.net/rfc/rfc1945.txt</a><br/><br/>RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1 中文版<br/><br/>1.0与1.1的区别，英文版<br/>Key Differences between HTTP/1.0 and HTTP/1.1<br/><a href="http://www.research.att.com/%7Ebala/papers/h0vh1.html" target="_blank">http://www.research.att.com/%7Ebala/papers/h0vh1.html</a> <br/><br/>中文翻译版没有看到，有看到的告诉我：）<br/><br/>附上：HTTP 1.1状态代码及其含义<br/>状态代码 &nbsp;状态信息 &nbsp;含义 &nbsp;<br/>100 &nbsp;Continue &nbsp;初始的请求已经接受，客户应当继续发送请求的其余部分。（HTTP 1.1新） &nbsp;<br/>101 &nbsp;Switching Protocols &nbsp;服务器将遵从客户的请求转换到另外一种协议（HTTP 1.1新） &nbsp;<br/>200 &nbsp;OK &nbsp;一切正常，对GET和POST请求的应答文档跟在后面。 <br/>201 &nbsp;Created &nbsp;服务器已经创建了文档，Location头给出了它的URL。 &nbsp;<br/>202 &nbsp;Accepted &nbsp;已经接受请求，但处理尚未完成。 &nbsp;<br/>203 &nbsp;Non-Authoritative Information &nbsp;文档已经正常地返回，但一些应答头可能不正确，因为使用的是文档的拷贝（HTTP 1.1新）。 &nbsp;<br/>204 &nbsp;No Content &nbsp;没有新文档，浏览器应该继续显示原来的文档。如果用户定期地刷新页面，而Servlet可以确定用户文档足够新，这个状态代码是很有用的。 &nbsp;<br/>205 &nbsp;Reset Content &nbsp;没有新的内容，但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容（HTTP 1.1新）。 &nbsp;<br/>206 &nbsp;Partial Content &nbsp;客户发送了一个带有Range头的GET请求，服务器完成了它（HTTP 1.1新）。 &nbsp;<br/>300 &nbsp;Multiple Choices &nbsp;客户请求的文档可以在多个位置找到，这些位置已经在返回的文档内列出。如果服务器要提出优先选择，则应该在Location应答头指明。 &nbsp;<br/>301 &nbsp;Moved Permanently &nbsp;客户请求的文档在其他地方，新的URL在Location头中给出，浏览器应该自动地访问新的URL。 &nbsp;<br/>302 &nbsp;Found &nbsp;类似于301，但新的URL应该被视为临时性的替代，而不是永久性的。注意，在HTTP1.0中对应的状态信息是“Moved Temporatily”。 <br/>出现该状态代码时，浏览器能够自动访问新的URL，因此它是一个很有用的状态代码。 <br/><br/>注意这个状态代码有时候可以和301替换使用。例如，如果浏览器错误地请求<a href="http://host/~user" target="_blank">http://host/~user</a>（缺少了后面的斜杠），有的服务器返回301，有的则返回302。 <br/><br/>严格地说，我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。 <br/> <br/>303 &nbsp;See Other &nbsp;类似于301/302，不同之处在于，如果原来的请求是POST，Location头指定的重定向目标文档应该通过GET提取（HTTP 1.1新）。 &nbsp;<br/>304 &nbsp;Not Modified &nbsp;客户端有缓冲的文档并发出了一个条件性的请求（一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档）。服务器告诉客户，原来缓冲的文档还可以继续使用。 &nbsp;<br/>305 &nbsp;Use Proxy &nbsp;客户请求的文档应该通过Location头所指明的代理服务器提取（HTTP 1.1新）。 &nbsp;<br/>307 &nbsp;Temporary Redirect &nbsp;和302（Found）相同。许多浏览器会错误地响应302应答进行重定向，即使原来的请求是POST，即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因，HTTP 1.1新增了307，以便更加清除地区分几个状态代码：当出现303应答时，浏览器可以跟随重定向的GET和POST请求；如果是307应答，则浏览器只能跟随对GET请求的重定向。（HTTP 1.1新） &nbsp;<br/>400 &nbsp;Bad Request &nbsp;请求出现语法错误。 &nbsp;<br/>401 &nbsp;Unauthorized &nbsp;客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头，浏览器据此显示用户名字/密码对话框，然后在填写合适的Authorization头后再次发出请求。 &nbsp;<br/>403 &nbsp;Forbidden &nbsp;资源不可用。服务器理解客户的请求，但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。 &nbsp;<br/>404 &nbsp;Not Found &nbsp;无法找到指定位置的资源。这也是一个常用的应答。 &nbsp;<br/>405 &nbsp;Method Not Allowed &nbsp;请求方法（GET、POST、HEAD、DELETE、PUT、TRACE等）对指定的资源不适用。（HTTP 1.1新） &nbsp;<br/>406 &nbsp;Not Acceptable &nbsp;指定的资源已经找到，但它的MIME类型和客户在Accpet头中所指定的不兼容（HTTP 1.1新）。 &nbsp;<br/>407 &nbsp;Proxy Authentication Required &nbsp;类似于401，表示客户必须先经过代理服务器的授权。（HTTP 1.1新） &nbsp;<br/>408 &nbsp;Request Timeout &nbsp;在服务器许可的等待时间内，客户一直没有发出任何请求。客户可以在以后重复同一请求。（HTTP 1.1新） &nbsp;<br/>409 &nbsp;Conflict &nbsp;通常和PUT请求有关。由于请求和资源的当前状态相冲突，因此请求不能成功。（HTTP 1.1新） &nbsp;<br/>410 &nbsp;Gone &nbsp;所请求的文档已经不再可用，而且服务器不知道应该重定向到哪一个地址。它和404的不同在于，返回407表示文档永久地离开了指定的位置，而404表示由于未知的原因文档不可用。（HTTP 1.1新） &nbsp;<br/>411 &nbsp;Length Required &nbsp;服务器不能处理请求，除非客户发送一个Content-Length头。（HTTP 1.1新） &nbsp;<br/>412 &nbsp;Precondition Failed &nbsp;请求头中指定的一些前提条件失败（HTTP 1.1新）。 &nbsp;<br/>413 &nbsp;Request Entity Too Large &nbsp;目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求，则应该提供一个Retry-After头（HTTP 1.1新）。 &nbsp;<br/>414 &nbsp;Request URI Too Long &nbsp;URI太长（HTTP 1.1新）。 &nbsp;<br/>416 &nbsp;Requested Range Not Satisfiable &nbsp;服务器不能满足客户在请求中指定的Range头。（HTTP 1.1新） &nbsp;<br/>500 &nbsp;Internal Server Error &nbsp;服务器遇到了意料不到的情况，不能完成客户的请求。 &nbsp;<br/>501 &nbsp;Not Implemented &nbsp;服务器不支持实现请求所需要的功能。例如，客户发出了一个服务器不支持的PUT请求。 &nbsp;<br/>502 &nbsp;Bad Gateway &nbsp;服务器作为网关或者代理时，为了完成请求访问下一个服务器，但该服务器返回了非法的应答。 &nbsp;<br/>503 &nbsp;Service Unavailable &nbsp;服务器由于维护或者负载过重未能应答。例如，Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。 &nbsp;<br/>504 &nbsp;Gateway Timeout &nbsp;由作为代理或网关的服务器使用，表示不能及时地从远程服务器获得应答。（HTTP 1.1新） &nbsp;<br/>505 &nbsp;HTTP Version Not Supported &nbsp;服务器不支持请求中所指明的HTTP版本。（HTTP 1.1新） &nbsp;<br/><br/>===================================================================================<br/>更多的资源......<br/><a href="http://www.w3.org/" target="_blank">http://www.w3.org/</a><br/>中国协议分析网 <a href="http://www.cnpaf.net/" target="_blank">http://www.cnpaf.net/</a><br/><br/>用Socket类实现HTTP协议客户端应用<br/><a href="http://developer.51cto.com/art/200510/6751.htm" target="_blank">http://developer.51cto.com/art/200510/6751.htm</a><br/><br/>用Java设计下载软件<br/><a href="http://www.yesky.com/239/1739739.shtml" target="_blank">http://www.yesky.com/239/1739739.shtml</a><br/>使用多线程编程技术，同时启动多个线程，根据线程个数，计算文件分割位置，向服务器发送几个不同的下载断点，同时接受数据并写入文件，就可以实现多线程下载了。 <br/>Tags - <a href="http://zhoujin.com/tags/http/" rel="tag">http</a> , <a href="http://zhoujin.com/tags/w3c/" rel="tag">w3c</a> , <a href="http://zhoujin.com/tags/%25E5%258D%258F%25E8%25AE%25AE/" rel="tag">协议</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/39/</link>
<title><![CDATA[JSP中计算页面执行（处理）时间]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Fri, 27 Oct 2006 06:10:52 +0000</pubDate> 
<guid>http://zhoujin.com/post/39/</guid> 
<description>
<![CDATA[ 
	在好多网站的最下方，会显示页面执行时间 Processed in 4 ms ，实现如下： <br/>1. TimerFilter源码如下：<br/><br/><div class="code"><br/>package com.chinajavaworld.util;<br/> <br/>import java.io.IOException;<br/>import javax.servlet.*;<br/>import javax.servlet.http.HttpServletRequest;<br/> <br/>public class TimerFilter<br/>&nbsp;&nbsp;&nbsp;&nbsp;implements Filter<br/>&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public static class Timer<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long time;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void start()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time = System.currentTimeMillis();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void stop()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time = System.currentTimeMillis() - time;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public long getTime()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return time;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Timer()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time = 0L;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;public static final String DEFAULT_TIMER_ATTRIBUTE = &quot;cjw.timer&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;private String key;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;public TimerFilter()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key = null;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void init(FilterConfig filterConfig)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws ServletException<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(filterConfig.getInitParameter(&quot;key&quot;) != null)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key = filterConfig.getInitParameter(&quot;key&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key = DEFAULT_TIMER_ATTRIBUTE;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws IOException, ServletException<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest request = (HttpServletRequest)servletRequest;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Timer timer = new Timer();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.start();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;request.setAttribute(key, timer);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterChain.doFilter(servletRequest, servletResponse);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.stop();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;handleTimer(timer);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void handleTimer(Timer timer1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;public void destroy()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/></div><br/>2. 在web.xml中配置： <br/><div class="code"><br/>&lt;filter&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-name&gt;Timer&lt;/filter-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-class&gt;com.chinajavaworld.util.TimerFilter&lt;/filter-class&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/filter&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-mapping&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;filter-name&gt;Timer&lt;/filter-name&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;/filter-mapping&gt;<br/></div><br/>3. 在JSP页面中写上代码： <br/><div class="code"><br/>&lt;%<br/>&nbsp;&nbsp;&nbsp;&nbsp;// Get the timer from the request as an attribute if it exists:<br/>&nbsp;&nbsp;&nbsp;&nbsp;TimerFilter.Timer timer<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= (TimerFilter.Timer)request.getAttribute(TimerFilter.DEFAULT_TIMER_ATTRIBUTE);<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (timer != null) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.stop();<br/>%&gt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&lt;p style=&quot;font-size:11px;&quot;&gt;Processed in &lt;b&gt;&lt;%= timer.getTime() %&gt;&lt;/b&gt; ms<br/>&lt;%&#125;%&gt;<br/> </div><br/>Tags - <a href="http://zhoujin.com/tags/jsp/" rel="tag">jsp</a> , <a href="http://zhoujin.com/tags/%25E6%2589%25A7%25E8%25A1%258C%25E6%2597%25B6%25E9%2597%25B4/" rel="tag">执行时间</a> , <a href="http://zhoujin.com/tags/%25E8%25BF%2590%25E7%25AE%2597%25E9%2580%259F%25E5%25BA%25A6/" rel="tag">运算速度</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/37/</link>
<title><![CDATA[开源便利店开源网址大全]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Sat, 23 Sep 2006 01:17:29 +0000</pubDate> 
<guid>http://zhoujin.com/post/37/</guid> 
<description>
<![CDATA[ 
	开源便利店<br/>LUPA文化衫<br/>开源网址大全<br/>Apache<br/>chinaopensource<br/>counter.li.org<br/>Debian<br/>fedora<br/>firefoxcn中文网<br/>freelamp<br/>freshmeat<br/>fsf.org<br/>gnome<br/><br/>go-opensource<br/>GUN Linux中华<br/>howtoforge<br/>javascud<br/>joomla<br/>Linux Forums<br/>Linux.org<br/>linuxabc<br/>linuxaid<br/>linuxbyte<br/>linuxext<br/>LinuxFocus 在线杂志<br/>linuxiso<br/>Linuxkit<br/>linuxlearningzone<br/>linuxplus<br/>linuxsir<br/>linuxtoday<br/>Linux中国<br/>Linux中文文件计划<br/>Linux人<br/>Linux伊甸园<br/>Linux公社<br/>Linux初探<br/>Linux天空<br/>Linux宝库<br/>Linux技术中坚站<br/>linux时代<br/>Linux简史<br/>Linux精品店<br/>Linux网址大全<br/>Linux论坛<br/>Linux非常空间<br/>LPI中国<br/>lwn.net<br/>mambo<br/>markshuttleworth网站<br/>Novell中国<br/>oldlinux.org<br/>opendesktop<br/>openfans<br/>openoffice<br/>opensource<br/>OSDL中文<br/>osdn<br/>php.net<br/>phpBB中文开发小组<br/>PHP中文站<br/>PHP编程标准<br/>plinux.org<br/>postgresql<br/>PostgreSQL中文网<br/>python.cn<br/>RedHat中国<br/>solidot.org<br/>sourceforge.net<br/>SUSE中文<br/>taiwanmambo<br/>The Linux Kernel Archives<br/>turbolinux<br/>Ubuntu中文网站<br/>Ubuntu中文论坛<br/>Ubuntu实验室<br/>Ubuntu正体中文wiki<br/>Ubuntu爱好者<br/>Ubuntu英文<br/>winehq.com<br/>wordpress.org<br/>中国LINUX公社<br/>中国开源世界<br/>中国开源社区<br/>中国开源软件推进联盟<br/>中标软件<br/>共创软件联盟<br/>北京中科红旗软件技术公司<br/>北京共创开源公司<br/>北京红旗中文贰仟公司<br/>奇客的新闻<br/>妖光Linux编程<br/>广东省LINUX公共服务技术支持中心<br/>开放系统研用协会<br/>开源书签<br/>开源大本营<br/>开源百科全书<br/>微软开源官方网站codeplex.com<br/>操作系统大全(转LUPA维客) <br/>文泉驿<br/>新华科技<br/>曼波中国<br/>极限Linux<br/>校园网-Linux<br/>浙江省Linux公共服务中心<br/>炎黄角马<br/>简易Java框架<br/>芭比技术工作室 <br/>超越PHP<br/>与自由软件相关的连接<br/>GNU 操作系统 - 自由软件基金会（FSF）<br/>Top 10 Open Source <br/>Tags - <a href="http://zhoujin.com/tags/%25E5%25BC%2580%25E6%25BA%2590/" rel="tag">开源</a> , <a href="http://zhoujin.com/tags/%25E7%25BD%2591%25E5%259D%2580/" rel="tag">网址</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/36/</link>
<title><![CDATA[批处理自动关机程序]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Fri, 22 Sep 2006 08:11:37 +0000</pubDate> 
<guid>http://zhoujin.com/post/36/</guid> 
<description>
<![CDATA[ 
	<a href="http://zhoujin.com/attachment/1158912593_0.jpg" target="_blank"><img src="http://zhoujin.com/attachment/1158912593_0.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>看了这个觉得很牛~~很霸道~~仅仅是批处理~~<br/><br/>自动关机程序.bat<br/><br/><div class="code"><br/>@ECHO off<br/>TITLE 自动关机程序 作者:廖晓青<br/><br/>:start<br/>CLS<br/>COLOR 1f<br/>rem 使用COLOR命令对控制台输出颜色进行更改<br/>MODE con: COLS=41 LINES=18<br/>rem MODE语句为设定窗体的宽和高<br/>set tm1=%time:~0,2%<br/>set tm2=%time:~3,2%<br/>set tm3=%time:~6,2%<br/>ECHO %date% %tm1%点%tm2%分%tm3%秒<br/>ECHO =========================================<br/>ECHO 请选择要进行的操作，然后按回车<br/>ECHO ───────────────<br/>ECHO.<br/>ECHO 1. 定时关机<br/>ECHO 2. 倒计时关机<br/>ECHO 3. 删除定时关机任务<br/>ECHO 4. 查看任务状态<br/>ECHO 5. 刷新当前时间<br/>ECHO 6. 重新启动<br/>ECHO 7. 锁定计算机<br/>ECHO 8. 注销<br/>ECHO 9. 退出<br/>ECHO.<br/><br/>:cho <br/>SET Choice=<br/>SET /P Choice=选择:<br/>rem 设定变量&quot;Choice&quot;为用户输入的字符<br/>IF NOT &quot;%Choice%&quot;==&quot;&quot; SET Choice=%Choice:~0,1%<br/>rem 如果输入大于1位,取第1位,比如输入132,则返回值为1<br/>ECHO.<br/>IF /I &quot;%Choice%&quot;==&quot;1&quot; GOTO SetHour<br/>IF /I &quot;%Choice%&quot;==&quot;2&quot; GOTO outtime<br/>IF /I &quot;%Choice%&quot;==&quot;3&quot; GOTO delAt<br/>IF /I &quot;%Choice%&quot;==&quot;4&quot; GOTO view<br/>IF /I &quot;%Choice%&quot;==&quot;5&quot; GOTO start<br/>IF /I &quot;%Choice%&quot;==&quot;6&quot; GOTO restart<br/>IF /I &quot;%Choice%&quot;==&quot;7&quot; GOTO lock<br/>IF /I &quot;%Choice%&quot;==&quot;8&quot; GOTO logoff<br/>IF /I &quot;%Choice%&quot;==&quot;9&quot; GOTO end<br/>rem 为避免出现返回值为空或含空格而导致程序异常,需在变量外另加双引号<br/>rem 注意,IF语句需要双等于号<br/>rem 如果输入的字符不是以上数字,将返回重新输入<br/>ECHO 选择无效，请重新输入<br/>ECHO.<br/>GOTO cho<br/><br/>:SetHour<br/>CLS<br/>ECHO.<br/>SET ask=<br/>SET /p ask=是否设定为每天执行关机命令(y/n):<br/>IF NOT &quot;%ask%&quot;==&quot;&quot; SET ask=%ask:~0,1%<br/>IF /I &quot;%ask%&quot;==&quot;y&quot; GOTO yes<br/>IF /I &quot;%ask%&quot;==&quot;n&quot; GOTO no<br/>GOTO SetHour<br/><br/>:yes<br/>ECHO 请指定24小时制式时间,格式为 小时:分钟<br/>SET shutdowntime=<br/>SET /p shutdowntime=输入:<br/>at %shutdowntime% /every:M,T,W,Th,F,S,Su tsshutdn 0 /delay:0 /powerdown &gt;nul<br/>rem 设定为每周的星期一至星期日,即为每天<br/>IF NOT errorlevel 1 GOTO ok<br/>rem 如果输入正确,就执行ok段的语句<br/>ECHO %shutdowntime% 不是标准的时间格式,请重新输入<br/>ECHO.<br/>GOTO yes<br/><br/>:no<br/>ECHO 请指定24小时制式时间,格式为 小时:分钟<br/>SET shutdowntime=<br/>SET /p shutdowntime=输入:<br/>at %shutdowntime% tsshutdn 0 /delay:0 /powerdown &gt;nul<br/>IF NOT errorlevel 1 GOTO ok<br/>ECHO %shutdowntime% 不是标准的时间格式,请重新输入<br/>ECHO.<br/>GOTO no<br/><br/>:ok<br/>ECHO.<br/>SET h=%shutdowntime:~1,1%<br/>SET ah=%shutdowntime:~0,1%<br/>SET am=%shutdowntime:~2,2%<br/>SET bh=%shutdowntime:~0,2%<br/>SET bm=%shutdowntime:~3,2%<br/>IF &quot;%h%&quot;==&quot;:&quot; (<br/>SET HM=%ah%时%am%分<br/>) ELSE (<br/>SET HM=%bh%时%bm%分)<br/>rem 如果输入h:mm则HM=h时mm分,否则HM=hh时mm分 <br/>IF /I &quot;%ask%&quot;==&quot;y&quot; ECHO 系统将于每天的%HM%关闭<br/>IF /I &quot;%ask%&quot;==&quot;n&quot; ECHO 系统将于%HM%关闭<br/>ECHO 设定完毕! 按任意键继续...<br/>PAUSE &gt;nul<br/>GOTO start<br/><br/>:outtime<br/>CLS<br/>ECHO.<br/>ECHO 请输入倒计时秒数<br/>ECHO ────────<br/>ECHO (设定后要取消,单击&quot;确定&quot;后按Ctrl+C键两次)<br/>SET timed=<br/>SET /p timed=输入:<br/>tsshutdn %timed% /delay:0 /powerdown &gt;nul<br/>IF not errorlevel 1 GOTO ok<br/>ECHO %timed% 是无效的关机时间,请重新输入<br/>ECHO.<br/>GOTO outtime<br/><br/>:delAt<br/>cls<br/>echo.<br/>at /del /y<br/>echo 定时关机任务已取消,按任意键继续...<br/>pause &gt;nul<br/>GOTO start<br/><br/>:view<br/>MODE con: COLS=85 LINES=18<br/>COLOR 70<br/>ECHO.<br/>at<br/>ECHO 按任意键继续...<br/>PAUSE &gt;nul<br/>GOTO start<br/><br/>:restart<br/>shutdown -r -t 0<br/><br/>:lock<br/>rundll32.exe user32.dll,LockWorkStation<br/>goto start<br/><br/>:logoff<br/>logoff<br/><br/>:end<br/>exit<br/></div><br/>Tags - <a href="http://zhoujin.com/tags/%25E6%2589%25B9%25E5%25A4%2584%25E7%2590%2586/" rel="tag">批处理</a> , <a href="http://zhoujin.com/tags/%25E5%2585%25B3%25E6%259C%25BA/" rel="tag">关机</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/38/</link>
<title><![CDATA[Windows Media Player 网页播放器 参数含义]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[歪布天地]]></category>
<pubDate>Wed, 20 Sep 2006 09:00:43 +0000</pubDate> 
<guid>http://zhoujin.com/post/38/</guid> 
<description>
<![CDATA[ 
	代码一：这个播放器是老式的那种，6.4版本！<br/>代码二：新式播放器是在MediaPlayer9.0以后出现的，也就是说只有装了9.0或9.0以上的播放器才能正常使用的。<br/><br/>(默认0为否，-1或1为是) <br/><br/>代码一：<br/><br/><div class="code">&lt;object classid=&quot;clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95&quot; id=&quot;MediaPlayer1&quot; width=&quot;286&quot; height=&quot;225&quot;&gt; <br/>&lt;param name=&quot;AnimationAtStart&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;AllowScan&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;AllowChangeDisplaySize&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;AutoRewind&quot; value=&quot;0&quot;&gt; <br/>&lt;param name=&quot;Balance&quot; value=&quot;0&quot;&gt; <br/>&lt;!--左右声道平衡,最左-9640,最右9640--&gt; <br/>&lt;param name=&quot;BaseURL&quot; value&gt; <br/>&lt;param name=&quot;BufferingTime&quot; value=&quot;15&quot;&gt; <br/>&lt;!--缓冲时间--&gt; <br/>&lt;param name=&quot;CaptioningID&quot; value&gt; <br/>&lt;param name=&quot;ClickToPlay&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;CursorType&quot; value=&quot;0&quot;&gt; <br/>&lt;param name=&quot;CurrentPosition&quot; value=&quot;0&quot;&gt; <br/>&lt;!--当前播放进度 -1 表示不变,0表示开头 单位是秒,比如10表示从第10秒处开始播放,值必须是-1.0或大于等于0--&gt; <br/>&lt;param name=&quot;CurrentMarker&quot; value=&quot;0&quot;&gt; <br/>&lt;param name=&quot;DefaultFrame&quot; value&gt; <br/>&lt;param name=&quot;DisplayBackColor&quot; value=&quot;0&quot;&gt; <br/>&lt;param name=&quot;DisplayForeColor&quot; value=&quot;16777215&quot;&gt; <br/>&lt;param name=&quot;DisplayMode&quot; value=&quot;0&quot;&gt; <br/>&lt;param name=&quot;DisplaySize&quot; value=&quot;0&quot;&gt; <br/>&lt;!--视频1-50%, 0-100%, 2-200%,3-全屏 其它的值作0处理,小数则采用四舍五入然后按前的处理--&gt; <br/>&lt;param name=&quot;Enabled&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;EnableContextMenu&quot; value=&quot;-1&quot;&gt; <br/>&lt;!-是否用右键弹出菜单控制--&gt; <br/>&lt;param name=&quot;EnablePositionControls&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;EnableFullScreenControls&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;EnableTracker&quot; value=&quot;-1&quot;&gt; <br/>&lt;!--是否允许拉动播放进度条到任意地方播放--&gt; <br/>&lt;param name=&quot;Filename&quot; value=&quot;01.wma&quot; valuetype=&quot;ref&quot;&gt; <br/>&lt;!--播放的文件地址--&gt; <br/>&lt;param name=&quot;InvokeURLs&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;Language&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;Mute&quot; value=&quot;0&quot;&gt; <br/>&lt;!--是否静音--&gt; <br/>&lt;param name=&quot;PlayCount&quot; value=&quot;10&quot;&gt; <br/>&lt;!--重复播放次数,0为始终重复--&gt; <br/>&lt;param name=&quot;PreviewMode&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;Rate&quot; value=&quot;1&quot;&gt; <br/>&lt;!--播放速率控制,1为正常,允许小数--&gt; <br/>&lt;param name=&quot;SAMIStyle&quot; value&gt; <br/>&lt;!--SAMI样式--&gt; <br/>&lt;param name=&quot;SAMILang&quot; value&gt; <br/>&lt;!--SAMI语言--&gt; <br/>&lt;param name=&quot;SAMIFilename&quot; value&gt; <br/>&lt;!--字幕ID--&gt; <br/>&lt;param name=&quot;SelectionStart&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;SelectionEnd&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;SendOpenStateChangeEvents&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;SendWarningEvents&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;SendErrorEvents&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;SendKeyboardEvents&quot; value=&quot;0&quot;&gt; <br/>&lt;param name=&quot;SendMouseClickEvents&quot; value=&quot;0&quot;&gt; <br/>&lt;param name=&quot;SendMouseMoveEvents&quot; value=&quot;0&quot;&gt; <br/>&lt;param name=&quot;SendPlayStateChangeEvents&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;ShowCaptioning&quot; value=&quot;0&quot;&gt; <br/>&lt;!--是否显示字幕,为一块黑色,下面会有一大块黑色,一般不显示--&gt; <br/>&lt;param name=&quot;ShowControls&quot; value=&quot;-1&quot;&gt; <br/>&lt;!--是否显示控制,比如播放,停止,暂停--&gt; <br/>&lt;param name=&quot;ShowAudioControls&quot; value=&quot;-1&quot;&gt; <br/>&lt;!--是否显示音量控制--&gt; <br/>&lt;param name=&quot;ShowDisplay&quot; value=&quot;0&quot;&gt; <br/>&lt;!--显示节目信息,比如版权等--&gt; <br/>&lt;param name=&quot;ShowGotoBar&quot; value=&quot;0&quot;&gt; <br/>&lt;!--是否启用上下文菜单--&gt; <br/>&lt;param name=&quot;ShowPositionControls&quot; value=&quot;-1&quot;&gt; <br/>&lt;!--是否显示往前往后及列表,如果显示一般也都是灰色不可控制--&gt; <br/>&lt;param name=&quot;ShowStatusBar&quot; value=&quot;-1&quot;&gt; <br/>&lt;!--当前播放信息,显示是否正在播放,及总播放时间和当前播放到的时间--&gt; <br/>&lt;param name=&quot;ShowTracker&quot; value=&quot;-1&quot;&gt; <br/>&lt;!--是否显示当前播放跟踪条,即当前的播放进度条--&gt; <br/>&lt;param name=&quot;TransparentAtStart&quot; value=&quot;-1&quot;&gt; <br/>&lt;param name=&quot;VideoBorderWidth&quot; value=&quot;0&quot;&gt; <br/>&lt;!--显示部的宽部,如果小于视频宽,则最小为视频宽,或者加大到指定值,并自动加大高度.此改变只改变四周的黑框大小,不改变视频大小--&gt; <br/>&lt;param name=&quot;VideoBorderColor&quot; value=&quot;0&quot;&gt; <br/>&lt;!--显示黑色框的颜色, 为RGB值,比如ffff00为黄色--&gt; <br/>&lt;param name=&quot;VideoBorder3D&quot; value=&quot;0&quot;&gt; <br/>&lt;param name=&quot;Volume&quot; value=&quot;0&quot;&gt; <br/>&lt;!--音量大小,负值表示是当前音量的减值,值自动会取绝对值,最大为0,最小为-9640--&gt; <br/>&lt;param name=&quot;WindowlessVideo&quot; value=&quot;0&quot;&gt; <br/>&lt;!--如果是0可以允许全屏,否则只能在窗口中查看--&gt; <br/>&lt;/object&gt; <br/></div><br/><br/>------------------------------------------------------------------------------- <br/>代码二：<br/>下面是新式播放器代码，相对以前的来说要简单很多： <br/><div class="code"><br/>&lt;object id=&quot;player&quot; height=&quot;64&quot; width=&quot;260&quot; classid=&quot;CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6&quot;&gt; <br/>&lt;param NAME=&quot;AutoStart&quot; VALUE=&quot;-1&quot;&gt; <br/>&lt;!--是否自动播放--&gt; <br/>&lt;param NAME=&quot;Balance&quot; VALUE=&quot;0&quot;&gt; <br/>&lt;!--调整左右声道平衡,同上面旧播放器代码--&gt; <br/>&lt;param name=&quot;enabled&quot; value=&quot;-1&quot;&gt; <br/>&lt;!--播放器是否可人为控制--&gt; <br/>&lt;param NAME=&quot;EnableContextMenu&quot; VALUE=&quot;-1&quot;&gt; <br/>&lt;!--是否启用上下文菜单--&gt; <br/>&lt;param NAME=&quot;url&quot; VALUE=&quot;1.wma&quot;&gt; <br/>&lt;!--播放的文件地址--&gt; <br/>&lt;param NAME=&quot;PlayCount&quot; VALUE=&quot;1&quot;&gt; <br/>&lt;!--播放次数控制,为整数--&gt; <br/>&lt;param name=&quot;rate&quot; value=&quot;1&quot;&gt; <br/>&lt;!--播放速率控制,1为正常,允许小数,1.0-2.0--&gt; <br/>&lt;param name=&quot;currentPosition&quot; value=&quot;0&quot;&gt; <br/>&lt;!--控件设置:当前位置--&gt; <br/>&lt;param name=&quot;currentMarker&quot; value=&quot;0&quot;&gt; <br/>&lt;!--控件设置:当前标记--&gt; <br/>&lt;param name=&quot;defaultFrame&quot; value=&quot;&quot;&gt; <br/>&lt;!--显示默认框架--&gt; <br/>&lt;param name=&quot;invokeURLs&quot; value=&quot;0&quot;&gt; <br/>&lt;!--脚本命令设置:是否调用URL--&gt; <br/>&lt;param name=&quot;baseURL&quot; value=&quot;&quot;&gt; <br/>&lt;!--脚本命令设置:被调用的URL--&gt; <br/>&lt;param name=&quot;stretchToFit&quot; value=&quot;0&quot;&gt; <br/>&lt;!--是否按比例伸展--&gt; <br/>&lt;param name=&quot;volume&quot; value=&quot;50&quot;&gt; <br/>&lt;!--默认声音大小0%-100%,50则为50%--&gt; <br/>&lt;param name=&quot;mute&quot; value=&quot;0&quot;&gt; <br/>&lt;!--是否静音--&gt; <br/>&lt;param name=&quot;uiMode&quot; value=&quot;mini&quot;&gt; <br/>&lt;!--播放器显示模式:Full显示全部;mini最简化;None不显示播放控制,只显示视频窗口;invisible全部不显示--&gt; <br/>&lt;param name=&quot;windowlessVideo&quot; value=&quot;0&quot;&gt; <br/>&lt;!--如果是0可以允许全屏,否则只能在窗口中查看--&gt; <br/>&lt;param name=&quot;fullScreen&quot; value=&quot;0&quot;&gt; <br/>&lt;!--开始播放是否自动全屏--&gt; <br/>&lt;param name=&quot;enableErrorDialogs&quot; value=&quot;-1&quot;&gt; <br/>&lt;!--是否启用错误提示报告--&gt; <br/>&lt;param name=&quot;SAMIStyle&quot; value&gt; <br/>&lt;!--SAMI样式--&gt; <br/>&lt;param name=&quot;SAMILang&quot; value&gt; <br/>&lt;!--SAMI语言--&gt; <br/>&lt;param name=&quot;SAMIFilename&quot; value&gt; <br/>&lt;!--字幕ID--&gt; <br/>&lt;/object&gt; <br/></div><br/>Tags - <a href="http://zhoujin.com/tags/windows/" rel="tag">windows</a> , <a href="http://zhoujin.com/tags/media/" rel="tag">media</a> , <a href="http://zhoujin.com/tags/player/" rel="tag">player</a> , <a href="http://zhoujin.com/tags/%25E7%25BD%2591%25E9%25A1%25B5%25E6%2592%25AD%25E6%2594%25BE%25E5%2599%25A8/" rel="tag">网页播放器</a> , <a href="http://zhoujin.com/tags/%25E5%258F%2582%25E6%2595%25B0/" rel="tag">参数</a> , <a href="http://zhoujin.com/tags/%25E5%2590%25AB%25E4%25B9%2589/" rel="tag">含义</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/34/</link>
<title><![CDATA[智商80以下看不懂，智商150以上看了会疯掉的故事]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Mon, 18 Sep 2006 08:29:04 +0000</pubDate> 
<guid>http://zhoujin.com/post/34/</guid> 
<description>
<![CDATA[ 
	 &nbsp; &nbsp; &nbsp; 一九四五年的一天，克力富兰的孤儿院里出现了一个神秘的女婴，没有人知道她的父母是谁。她孤独地长大，没有任何人与她来往。 <br/>　　 　　 &nbsp; <br/>　　直到一九六三年的一天，她莫明其妙地爱上了一个流浪汉，情况才变得好起来。可是好景不长，不幸事件一个接一个的发生。首先，当她发现自己怀上了流浪汉的小孩时，流浪汉却突然失踪了。其次，她在医院生小孩时，医生发现她是双性人，也就是说她同时具有男女性器官。为了挽救她的生命，医院给她做了变性手术，她变成了他。最不幸的是，她刚刚生下的小女孩又被一个神秘的人给绑走了。这一连串的打击使他从此一蹶不振，最后流落到街头变成了一个无家可归的流浪汉。 <br/>　　 　　 &nbsp; <br/>　　直到一九七八年的一天，他醉熏熏地走进了一个小酒吧，把他一身不幸的遭遇告诉了一个比他年长的酒吧伙计。酒吧伙计很同情他，主动提出帮他找到那个使‘他’怀孕而又失踪的流浪汉。唯一的条件是他必须参加伙计他们的‘时间旅行特种部队’。 &nbsp; <br/>　 &nbsp; <br/>　　他们一起进了‘时间飞车’。飞车回到六三年时，伙计把流浪汉放了出去。流浪汉莫明其妙地爱上了一个孤儿院长大的姑娘，并使她怀了孕。伙计又乘‘时间飞车’前行九个多月，到医院抢走了刚刚出生的小女婴，并用‘时间飞车’把女婴带回到一九四五年，悄悄地把她放在克力富兰的一个孤儿院里。然后再把稀里糊涂的流浪汉向前带到了一九八五年，并且让他加入了他们的‘时间旅行特种部队’。 <br/>　　 　 &nbsp; <br/>　　流浪汉有了正式工作以后，生活走上了正轨。并逐渐地在特种部队里混到了相当不错的地位。有一次，为了完成一个特殊任务，上级派他飞回一九七零年，化装成酒吧伙计去拉一个流浪汉加入他们的特种部队.<br/>Tags - <a href="http://zhoujin.com/tags/%25E6%2599%25BA%25E5%2595%2586/" rel="tag">智商</a> , <a href="http://zhoujin.com/tags/%25E6%25B5%2581%25E6%25B5%25AA%25E6%25B1%2589/" rel="tag">流浪汉</a> , <a href="http://zhoujin.com/tags/%25E5%2585%258B%25E5%258A%259B%25E5%25AF%258C%25E5%2585%25B0/" rel="tag">克力富兰</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/35/</link>
<title><![CDATA[汉字也搞笑]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Sun, 17 Sep 2006 08:41:19 +0000</pubDate> 
<guid>http://zhoujin.com/post/35/</guid> 
<description>
<![CDATA[ 
	熊对能说，哥儿们，穷成这样啦，四个熊掌全卖啦？<br/><br/>电对曳说，好好歇会行不，你这姿势不累呀？<br/><br/>掰对分说，咋的，当官有架子了，小手还背上了呢？<br/><br/>兵对丘说，兄弟，踩上地雷了吧，两腿咋都没了？<br/><br/>王对皇说，哥们，当皇上有啥好处呀，你看，头发都白了<br/><br/>口对回说，亲爱的，都怀孕这么长时间了，咋不说一声呢？<br/><br/>丑对妞说，好好和她过吧，咱这模样的，找个女人可不容易呀<br/><br/>果对裸说，哥儿们，你穿上衣服还不如不穿<br/><br/>臣对巨说：和你一样的面积，却有三室两厅<br/><br/>占对点说：买小轿车了？<br/><br/>日对曰说：该减肥了<br/><br/>土对丑说：别以为披肩发就好看，其实骨子里还是老土
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/33/</link>
<title><![CDATA[一生中的“九月九日”]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Fri, 08 Sep 2006 16:02:41 +0000</pubDate> 
<guid>http://zhoujin.com/post/33/</guid> 
<description>
<![CDATA[ 
	1927年9月9日<br/>1945年9月9日<br/>1949年9月9日<br/>1956年9月9日<br/>1971年9月9日<br/>1976年9月9日<br/>1981年9月9日<br/>2001年9月9日<br/>2006年9月9日<br/>*<br/>*<br/>*<br/>从1981年始,日子就这样过了一天，一月，一年又一年。<br/><br/>常常感叹时间过得真快，一晃许多年过去了。<br/><br/>从那个时候的起点到现在的时间点，记忆中始终绽开出两个影子，一个在阳光下，轻易地就会看到；另一个，在心里，是不愿碰触，不愿想起，却又无法遗忘，如枯萎的藤蔓，虽已老去却仍不得挣脱。<br/><br/>人与人之间的感觉，也是如此，游离且微妙。 <br/>2006年9月9日零时零分,听阒张国荣在《阿飞正传》中的独白。<br/><br/>“我听别人说这世界上有一种鸟是没有脚的，它只能够一直的飞呀飞呀，飞累了就在风里面睡觉，这种鸟一辈子只能下地一次，那一次就是它死亡的时候。” <br/><br/>“真的有这种鸟吗？”我想。<br/><br/>“有，当它找到爱情的时候，它就会出现。”<br/><br/>“如果非得死亡，那么不如不要爱情。”我想。<br/><br/>“如果会死亡，就不要下地，不要爱情，这样就永远不会死去。”我心中重复一遍。<br/><br/>手机响了.一条短信.一个电话.<br/><br/>有一线灯光透过白纱窗帘，轻盈地倾洒在地板上。<br/>*********<br/>一直以来，我和她在各自的生命中行走,看不同的风景,遭遇不同人。有些人只是擦肩而过，匆忙中忽视了彼此的眼光对视，没有言语,没有留恋，因此没有故事；而有些人，相遇了，相爱了，这种际遇，留待余生去不断重复地去回味。我们迷恋的许是一个风情万种的眼神，许是一种似曾相识的旧日痕迹。时间久了，陪伴而已，如果想要一个吻，那就给彼此一个吻。如果觉得寂寞，就静静地依偎在对方的怀中，直到老去。<br/><br/>那是从小到大伴我成长，扎在生命中的，永不会被岁月冲走的尘埃。<br/><br/>在她怀中，还没有等我老去，就已然清醒。<br/><br/>*********<br/>当每一次的风轻轻吹过，都来自不同的方向，咖啡厅里的杯子里不断冒出的温热湿气，秋雨季节特别伤感潮湿的泪水，还有淡若无痕的香奈儿气味，手机上的留言，见证了一场突如其来的爱情故事。<br/><br/>心细如丝的我察觉到她正遭遇着生活中的一场，或者更象是影片中的一场意外，各个细枝末节都充满了新奇和惊喜。她不知道下一秒将会怎样，所以充满期待。<br/><br/>她和他偶遇，告别，隐忍，想念，疼痛，一闪而逝，重逢，刻骨铭心，错过，变幻无常。字典里的每一个词语都是一个关于爱情的故事，怎样都有意义，怎样都没有意义。 <br/><br/>爱情就是一场冬天的海啸，一夜隔岸的烟火，观赏的人明明清楚它不过是一种一瞬而逝的美丽现象，随时会从手中和眼中溜走，却偏又忍不住去朝思暮想，偏要去近距离地接触，直到伤痕累累，方才心甘情愿的回头。 <br/><br/>我不愿意看着她痛苦，无论如何，我都应该选择去勇敢地面对一切，她亦是。<br/><br/>*********<br/><br/>杜拉斯说：世界上没有一次恋爱能代替爱情。 <br/><br/>爱人，不是我们爱过的，或正在爱的那个人，而是在明天的明天的明天，仍会跟自己相濡以沫，荣辱与共的那个人。在很老很老白发苍苍的时候，还能在一起手牵着手看夕阳看流星看春暖花开。<br/><br/>我知道她爱我，当然，她也爱着他。他们，或者我们，多美丽的爱情，多深情的主角，都不是一生一世，都不是牵我手的那个人。<br/><br/>于是，灿烂的阳光下，我轻轻地抽出手，转身快步离去，很远很远了，我知道身后那道视线仍旧注视着我远去的背影。我想，我和她还有他都是始终不知道怎样去做才是对的人，始终不明白什么才是自己所要的人。所以才会一直一直寻找，哪怕头破血流，亦会勇往直前。<br/><br/>我想，我会微笑，因为毕竟爱过。<br/><br/>*********<br/><br/>夜晚，没有开灯，我在黑暗中静静的看，然后想起一个人，想起已经很久没有她的消息。有些人，再见了，就真得是再也不会见了，留下的只有记忆。而有些人，即使想忘记，却依旧清晰如旧。<br/><br/>想说的话，曾经都说过，想忘记的人，曾经都试过。实在忘不了的，只是让它沉默、堆积、封闭、燃料，然后化为灰烬。<br/><br/>就象张国荣说：要是你有机会碰上她的话，你跟她说我什么都忘了，这样大家都会好过一点。而刘德华却回答道：我也不知道我有没有机会再碰上她。也许再碰到她的时候她已经把我忘了。<br/><br/>一切都象影片中的片段。断片。过程。结束。看过之后，在黑夜里会回忆。然后被时光遗忘。 <br/><br/>影片没有结束，我没有看完它，我不想知道结局，所以选择在尚未结束的时候关上电视，那么这出戏就会永远永远演下去，不会落幕。<br/><br/>我刻意漏掉了结尾。<br/><br/>片中的张国荣仍在自言自语：以前我以为有一种鸟一开始飞就会飞到死亡的那一天才落地。其实它什么地方也没去过，那鸟一开始就已经死了。我曾经说过不到最后一刻我也不会知道最喜欢的女人是谁，不知道她现在在干什么呢？天开始亮了，今天的天气看上去不错，不知道今天的日落会是怎么样的呢？<br/><br/>我想，没有人知道<br/><br/>现在又要到这个日子了，每个人的感觉只有自己知道吧。
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/66/</link>
<title><![CDATA[超强的光盘Live操作系统──ParallelKnoppix]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[快乐企鹅]]></category>
<pubDate>Mon, 28 Aug 2006 07:36:38 +0000</pubDate> 
<guid>http://zhoujin.com/post/66/</guid> 
<description>
<![CDATA[ 
	<a href="attachment/pelicanlogo.png" target="_blank"><img class="insertimage" src="attachment/pelicanlogo.png" border="0" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" width="90" height="79" align="left" /></a> 上英文网站乱逛又有不少收获~<img src="http://www.zhoujin.com/images/emot/grin.gif" border="0" alt="grin" width="20" height="20" /><br />发现了这款超强的光盘上的Live操作系统──ParallelKnoppix。看这名字就知道是基于Knoppix，那有什么特别的呢？<br />左边的这个Logo看到没？一群企鹅。原来这个ParallelKnoppix可以快速地布署并行处理机集群──一台装了Linux的电脑不怎么样，一群装了Linux并购成并行处理机集群的电脑将是非常Power的！<br /><hr /><br /><span style="color: #0000ff">&ldquo;你可以把一间屋子里运行着Windows操作系统的所有电脑转换为Linux系统集群，当你做完工作，所有的电脑都可以马上回复原状。让这个集群启动并开始运行只要5分钟，如果这些机器上有PXE网卡，这将可以支持2到200台进行集群工作。一个由PK（ParallelKnoppix的缩写）构成的集群将是临时的，如果你下次想使用那么你得重建（不过这仍只需花5分钟&hellip;&hellip;）&rdquo;</span><br />这就是基于Live-CD Knoppix的ParallelKnoppix的威力！<br />哈哈，Linux发行版本真是各具特色啊！<br /><a href="http://idea.uab.es/mcreel/ParallelKnoppix/" target="_blank">ParallelKnoppix的主页</a><br /><br /><span style="color: #ff1493">PS:等</span><span style="color: #008000">UbuntuStudio</span><span style="color: #ff1493">发布了，会不会在影音工作站领域发起一场革命呢？</span><br/>Tags - <a href="http://zhoujin.com/tags/linux/" rel="tag">linux</a> , <a href="http://zhoujin.com/tags/live-cd/" rel="tag">live-cd</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/30/</link>
<title><![CDATA[两种Java容器类List和Set分析]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Fri, 25 Aug 2006 04:38:47 +0000</pubDate> 
<guid>http://zhoujin.com/post/30/</guid> 
<description>
<![CDATA[ 
	　　容器类可以大大提高编程效率和编程能力，在Java2中，所有的容器都由SUN公司的Joshua Bloch进行了重新设计，丰富了容器类库的功能。 <br/><br/>　　Java2容器类类库的用途是“保存对象”，它分为两类： <br/><br/>　　Collection----一组独立的元素，通常这些元素都服从某种规则。List必须保持元素特定的顺序，而Set不能有重复元素。 <br/><br/>　　Map----一组成对的“键值对”对象，即其元素是成对的对象，最典型的应用就是数据字典，并且还有其它广泛的应用。另外，Map可以返回其所有键组成的Set和其所有值组成的Collection，或其键值对组成的Set，并且还可以像数组一样扩展多维Map，只要让Map中键值对的每个“值”是一个Map即可。 <br/><br/>　　1.迭代器 <br/><br/>　　迭代器是一种设计模式，它是一个对象，它可以遍历并选择序列中的对象，而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象，因为创建它的代价小。 <br/><br/>　　Java中的Iterator功能比较简单，并且只能单向移动： <br/><br/>　　(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时，它返回序列的第一个元素。 <br/><br/>　　(2) 使用next()获得序列中的下一个元素。 <br/><br/>　　(3) 使用hasNext()检查序列中是否还有元素。 <br/><br/>　　(4) 使用remove()将迭代器新返回的元素删除。 <br/><br/>　　Iterator是Java迭代器最简单的实现，为List设计的ListIterator具有更多的功能，它可以从两个方向遍历List，也可以从List中插入和删除元素。 <br/><br/>　　2.List的功能方法 <br/><br/>　　List(interface): 次序是List最重要的特点；它确保维护元素特定的顺序。List为Collection添加了许多方法，使得能够向List中间插入与移除元素(只推荐LinkedList使用)。一个List可以生成ListIterator，使用它可以从两个方向遍历List，也可以从List中间插入和删除元素。 <br/><br/>　　ArrayList: 由数组实现的List。它允许对元素进行快速随机访问，但是向List中间插入与移除元素的速度很慢。ListIterator只应该用来由后向前遍历ArrayList，而不是用来插入和删除元素，因为这比LinkedList开销要大很多。 <br/><br/>　　LinkedList: 对顺序访问进行了优化，向List中间插入与删除得开销不大，随机访问则相对较慢(可用ArrayList代替)。它具有方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()，这些方法(没有在任何接口或基类中定义过)使得LinkedList可以当作堆栈、队列和双向队列使用。 <br/><br/>　　3.Set的功能方法 <br/><br/>　　Set(interface): 存入Set的每个元素必须是唯一的，因为Set不保存重复元素。加入Set的Object必须定义equals()方法以确保对象的唯一性。Set与Collection有完全一样的接口。Set接口不保证维护元素的次序。 <br/><br/>　　HashSet: 为快速查找而设计的Set。存入HashSet的对象必须定义hashCode()。 <br/><br/>　　TreeSet: 保持次序的Set，底层为树结构。使用它可以从Set中提取有序的序列。 <br/><br/>　　LinkedHashSet: 具有HashSet的查询速度，且内部使用链表维护元素的顺序(插入的次序)。于是在使用迭代器遍历Set时，结果会按元素插入的次序显示。 <br/><br/>　　HashSet采用散列函数对元素进行排序，这是专门为快速查询而设计的；TreeSet采用红黑树的数据结构进行排序元素；LinkedHashSet内部使用散列以加快查询速度，同时使用链表维护元素的次序，使得看起来元素是以插入的顺序保存的。需要注意的是，生成自己的类时，Set需要维护元素的存储顺序，因此要实现Comparable接口并定义compareTo()方法。<br/>Tags - <a href="http://zhoujin.com/tags/java/" rel="tag">java</a> , <a href="http://zhoujin.com/tags/list/" rel="tag">list</a> , <a href="http://zhoujin.com/tags/set/" rel="tag">set</a> , <a href="http://zhoujin.com/tags/%25E5%25AE%25B9%25E5%2599%25A8/" rel="tag">容器</a> , <a href="http://zhoujin.com/tags/%25E8%25BF%25AD%25E4%25BB%25A3%25E5%2599%25A8/" rel="tag">迭代器</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/31/</link>
<title><![CDATA[hibernate的配置]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[HIBERNATE]]></category>
<pubDate>Sun, 20 Aug 2006 04:42:45 +0000</pubDate> 
<guid>http://zhoujin.com/post/31/</guid> 
<description>
<![CDATA[ 
	Hibernate配置文件可以有两种格式，一种是：hibernate.properties;一种是：hibernate.cfg.xml;<br/>现在就介绍两种方式：<br/>hibernate.properties---在hibernate的src目录下有一个hibernate.properties摸板，我们只要修改就可以了<br/>1。hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'<br/>这个配置意思是当你在Hibernate里面输入true的时候，Hibernate会转化为1插入数据库，当你在Hibernate里面输入false的时候，Hibernate会转化为0插入数据库，后面的Y，N同理。<br/><br/>2。 hibernate.dialect net.sf.hibernate.dialect.MySQLDialect<br/>注(3.*):hibernate.dialect org.hibernate.dialect.MySQLDialect<br/><br/><br/>hibernate.connection.driver_class com.mysql.jdbc.Driver<br/><br/>hibernate.connection.url jdbc:mysql:///test<br/><br/>hibernate.connection.username root<br/><br/>hibernate.connection.password <br/><br/>3。hibernate.connection.pool_size 1<br/><br/>hibernate.statement_cache.size 25<br/><br/>这是Hibernate自带的连接池的配置参数，在默认情况下将采用。意义很直观，不多解释。<br/><br/>只是提醒一点，Hibernate这个连接池是非常原始非常简单的连接池，如果你在项目中用Hibernate的话，建议你首选App Server的连接池，次选Hibernate带的DBCP连接池。自带的连接池应该做为末选。<br/><br/>如果你采用DBCP连接池，除了要配置DBCP连接池以外，还需要取消掉下行的注释：<br/><br/>hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider<br/><br/>注(3.*):hibernate.connection.provider_class org.hibernate.connection.DatasourceConnectionProvider<br/>其它的连接池同理。<br/><br/>如果采用App Server的连接池，假设App Server连接池的DataSource的JNDI名称为"mypool"的话，配置应该如下：<br/><br/>hibernate.dialect net.sf.hibernate.dialect.MySQLDialect<br/><br/>hibernate.connection.datasource mypool<br/><br/>hibernate.connection.provider_class org.hibernate.connection.DatasourceConnectionProvider<br/><br/>其它参数就不必写了，因为已经在App Server配置连接池的时候指定好了。<br/><br/>如果你不是在App Server环境中使用Hibernate，例如远程客户端程序，但是你又想用App Server的数据库连接池，那么你还需要配置JNDI的参数，例如Hibernate连接远程Weblogic上的数据库连接池：<br/><br/>hibernate.dialect net.sf.hibernate.dialect.MySQLDialect<br/><br/>hibernate.connection.datasource mypool<br/><br/>hibernate.connection.provider_class net.sf.hibernate.connection.DatasourceConnectionProvider<br/><br/>hibernate.jndi.class weblogic.jndi.WLInitialContextFactory<br/><br/>hibernate.jndi.url t3://servername:7001/<br/><br/>最后，如果你需要在EJB或者JTA中使用Hibernate，需要取消下行的注释：<br/><br/>hibernate.transaction.factory_class net.sf.hibernate.transaction.JTATransactionFactory<br/><br/>4。hibernate.show_sql false<br/><br/>是否将Hibernate发送给数据库的sql显示出来，这是一个非常非常有用处的功能。当你在调试Hibernate的时候，让Hibernate打印sql语句，可以帮助你迅速解决问题。5<br/><br/>5。#hibernate.connection.isolation 4<br/><br/>指定数据库的隔离级别，往往不同的数据库有自己定义的隔离级别，未必是Hibernate的设置所能更改的，所以也不必去管它了。<br/><br/> <br/><br/>6。hibernate.jdbc.fetch_size 50<br/><br/>hibernate.jdbc.batch_size 25<br/><br/>这两个选项非常非常非常重要！！！将严重影响Hibernate的CRUD性能!<br/><br/>C = create, R = read, U = update, D = delete<br/><br/>Fetch Size 是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。<br/><br/>例如一次查询1万条记录，对于Oracle的JDBC驱动来说，是不会1次性把1万条取出来的，而只会取出Fetch Size条数，当纪录集遍历完了这些记录以后，再去数据库取Fetch Size条数据。<br/><br/>因此大大节省了无谓的内存消耗。当然Fetch Size设的越大，读数据库的次数越少，速度越快；Fetch Size越小，读数据库的次数越多，速度越慢。<br/><br/>Batch Size是设定对数据库进行批量删除，批量更新和批量插入的时候的批次大小，有点相当于设置Buffer缓冲区大小的意思。<br/><br/>Batch Size越大，批量操作的向数据库发送sql的次数越少，速度就越快。我做的一个测试结果是当Batch Size=0的时候，使用Hibernate对Oracle数据库删除1万条记录需要25秒，Batch Size = 50的时候，删除仅仅需要5秒！！！<br/><br/>可见有多么大的性能提升！很多人做Hibernate和JDBC的插入性能测试会奇怪的发现Hibernate速度至少是JDBC的两倍，就是因为Hibernate使用了Batch Insert，而他们写的JDBC没有使用Batch的缘故。<br/><br/> <br/><br/>7。#hibernate.jdbc.use_scrollable_resultset true<br/><br/>设定是否可以使用JDBC2.0规范的可滚动结果集，这对Hibernate的分页显示有一定的作用，默认就好了。<br/><br/> <br/><br/>8。#hibernate.cglib.use_reflection_optimizer false<br/><br/>默认打开，启用cglib反射优化。cglib是用来在Hibernate中动态生成PO字节码的，打开优化可以加快字节码构造的速度。<br/>Tags - <a href="http://zhoujin.com/tags/hibernate/" rel="tag">hibernate</a> , <a href="http://zhoujin.com/tags/java/" rel="tag">java</a> , <a href="http://zhoujin.com/tags/dbcp/" rel="tag">dbcp</a> , <a href="http://zhoujin.com/tags/jndi/" rel="tag">jndi</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/32/</link>
<title><![CDATA[61条面向对象设计的经验原则]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Fri, 18 Aug 2006 04:56:20 +0000</pubDate> 
<guid>http://zhoujin.com/post/32/</guid> 
<description>
<![CDATA[ 
	　　你不必严格遵守这些原则，违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃，若违背了其中的一条，那么警铃就会响起&nbsp;&nbsp;&nbsp;&nbsp;----- Arthur J.Riel<br/><br/>　　(1)所有数据都应该隐藏在所在的类的内部。<br/><br/>　　(2)类的使用者必须依赖类的共有接口，但类不能依赖它的使用者。<br/><br/>　　(3)尽量减少类的协议中的消息。<br/><br/>　　(4)实现所有类都理解的最基本公有接口[例如，拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。 <br/><br/>　　(5)不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。 <br/><br/>　　如果类的两个方法有一段公共代码，那么就可以创建一个防止这些公共代码的私有函数。 <br/><br/>　　(6)不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。<br/><br/>　　(7)类之间应该零耦合，或者只有导出耦合关系。也即，一个类要么同另一个类毫无关系，要么只使用另一个类的公有接口中的操作。 <br/><br/>　　(8)类应该只表示一个关键抽象。<br/><br/>　　包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响，则将对包中的所有类产生影响，而对其他的包不造成任何影响 . <br/><br/>　　(9)把相关的数据和行为集中放置。<br/><br/>　　设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这种类型的行为暗示着这条经验原则被违反了。 <br/><br/>　　(10)把不相关的信息放在另一个类中(也即：互不沟通的行为)。<br/><br/>　　朝着稳定的方向进行依赖. <br/><br/>　　(11)确保你为之建模的抽象概念是类，而不只是对象扮演的角色。 <br/><br/>　　(12)在水平方向上尽可能统一地分布系统功能，也即：按照设计，顶层类应当统一地共享工作。<br/><br/>　　(13)在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。<br/><br/>　　规划一个接口而不是实现一个接口。 <br/><br/>　　(14)对公共接口中定义了大量访问方法的类多加小心。大量访问方法意味着相关数据和行为没有集中存放。<br/><br/>　　(15)对包含太多互不沟通的行为的类多加小心。<br/><br/>　　这个问题的另一表现是在你的应用程序中的类的公有接口中创建了很多的get和set函数。 <br/><br/>　　(16)在由同用户界面交互的面向对象模型构成的应用程序中，模型不应该依赖于界面，界面则应当依赖于模型。<br/><br/>　　(17)尽可能地按照现实世界建模(我们常常为了遵守系统功能分布原则、避免全能类原则以及集中放置相关数据和行为的原则而违背这条原则) 。 <br/><br/>　　(18)从你的设计中去除不需要的类。<br/><br/>　　一般来说，我们会把这个类降级成一个属性。 <br/><br/>　　(19)去除系统外的类。 <br/><br/>　　系统外的类的特点是，抽象地看它们只往系统领域发送消息但并不接受系统领域内其他类发出的消息。 <br/><br/>　　(20)不要把操作变成类。质疑任何名字是动词或者派生自动词的类，特别是只有一个有意义行为的类。考虑一下那个有意义的行为是否应当迁移到已经存在或者尚未发现的某个类中。<br/><br/>　　(21)我们在创建应用程序的分析模型时常常引入代理类。在设计阶段，我们常会发现很多代理没有用的，应当去除。<br/><br/>　　(22)尽量减少类的协作者的数量。<br/><br/>　　一个类用到的其他类的数目应当尽量少。 <br/><br/>　　(23)尽量减少类和协作者之间传递的消息的数量。<br/><br/>　　(24)尽量减少类和协作者之间的协作量，也即：减少类和协作者之间传递的不同消息的数量。<br/><br/>　　(25)尽量减少类的扇出，也即：减少类定义的消息数和发送的消息数的乘积。<br/><br/>　　(26)如果类包含另一个类的对象，那么包含类应当给被包含的对象发送消息。也即：包含关系总是意味着使用关系。<br/><br/>　　(27)类中定义的大多数方法都应当在大多数时间里使用大多数数据成员。<br/><br/>　　(28)类包含的对象数目不应当超过开发者短期记忆的容量。这个数目常常是6。 <br/><br/>　　当类包含多于6个数据成员时，可以把逻辑相关的数据成员划分为一组，然后用一个新的包含类去包含这一组成员。 <br/><br/>　　(29)让系统功能在窄而深的继承体系中垂直分布。<br/><br/>　　(30)在实现语义约束时，最好根据类定义来实现。这常常会导致类泛滥成灾，在这种情况下，约束应当在类的行为中实现，通常是在构造函数中实现，但不是必须如此。<br/><br/>　　(31)在类的构造函数中实现语义约束时，把约束测试放在构造函数领域所允许的尽量深的包含层次中。<br/><br/>　　(32)约束所依赖的语义信息如果经常改变，那么最好放在一个集中式的第3方对象中。<br/><br/>　　(33)约束所依赖的语义信息如果很少改变，那么最好分布在约束所涉及的各个类中。<br/><br/>　　(34)类必须知道它包含什么，但是不能知道谁包含它。<br/><br/>　　(35)共享字面范围(也就是被同一个类所包含)的对象相互之间不应当有使用关系。 <br/><br/>　　(36)继承只应被用来为特化层次结构建模。<br/><br/>　　(37)派生类必须知道基类，基类不应该知道关于它们的派生类的任何信息。<br/><br/>　　(38)基类中的所有数据都应当是私有的，不要使用保护数据。<br/><br/>　　类的设计者永远都不应该把类的使用者不需要的东西放在公有接口中。 <br/><br/>　　(39)在理论上，继承层次体系应当深一点，越深越好。<br/><br/>　　(40)在实践中，继承层次体系的深度不应当超出一个普通人的短期记忆能力。一个广为接受的深度值是6。<br/><br/>　　(41)所有的抽象类都应当是基类。<br/><br/>　　(42)所有的基类都应当是抽象类。<br/><br/>　　(43)把数据、行为和/或接口的共性尽可能地放到继承层次体系的高端。<br/><br/>　　(44)如果两个或更多个类共享公共数据(但没有公共行为)，那么应当把公共数据放在一个类中，每个共享这个数据的类都包含这个类。 <br/><br/>　　(45)如果两个或更多个类有共同的数据和行为(就是方法)，那么这些类的每一个都应当从一个表示了这些数据和方法的公共基类继承。 <br/><br/>　　(46)如果两个或更多个类共享公共接口(指的是消息，而不是方法)，那么只有他们需要被多态地使用时，他们才应当从一个公共基类继承。 <br/><br/>　　(47)对对象类型的显示的分情况分析一般是错误的。在大多数这样的情况下，设计者应当使用多态。<br/><br/>　　(48)对属性值的显示的分情况分析常常是错误的。类应当解耦合成一个继承层次结构，每个属性值都被变换成一个派生类。 <br/><br/>　　(49)不要通过继承关系来为类的动态语义建模。试图用静态语义关系来为动态语义建模会导致在运行时切换类型。<br/><br/>　　(50)不要把类的对象变成派生类。对任何只有一个实例的派生类都要多加小心。<br/><br/>　　(51)如果你觉得需要在运行时刻创建新的类，那么退后一步以认清你要创建的是对象。现在，把这些对象概括成一个类。 <br/><br/>　　(52)在派生类中用空方法(也就是什么也不做的方法)来覆写基类中的方法应当是非法的。<br/><br/>　　(53)不要把可选包含同对继承的需要相混淆。把可选包含建模成继承会带来泛滥成灾的类。<br/><br/>　　(54)在创建继承层次时，试着创建可复用的框架，而不是可复用的组件。<br/><br/>　　(55)如果你在设计中使用了多重继承，先假设你犯了错误。如果没犯错误，你需要设法证明。<br/><br/>　　(56)只要在面向对象设计中用到了继承，问自己两个问题：(1)派生类是否是它继承的那个东西的一个特殊类型？(2)基类是不是派生类的一部分？<br/><br/>　　(57)如果你在一个面向对象设计中发现了多重继承关系，确保没有哪个基类实际上是另一个基类的派生类。<br/><br/>　　(58)在面向对象设计中如果你需要在包含关系和关联关系间作出选择，请选择包含关系。<br/><br/>　　(59)不要把全局数据或全局函数用于类的对象的薄记工作。应当使用类变量或类方法。<br/><br/>　　(60)面向对象设计者不应当让物理设计准则来破坏他们的逻辑设计。但是，在对逻辑设计作出决策的过程中我们经常用到物理设计准则。<br/><br/>　　(61)不要绕开公共接口去修改对象的状态。<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%259D%25A2%25E5%2590%2591%25E5%25AF%25B9%25E8%25B1%25A1%25E8%25AE%25BE%25E8%25AE%25A1/" rel="tag">面向对象设计</a> , <a href="http://zhoujin.com/tags/%25E5%258E%259F%25E5%2588%2599/" rel="tag">原则</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/29/</link>
<title><![CDATA[张泽石《战俘手记》]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Sat, 15 Jul 2006 10:22:42 +0000</pubDate> 
<guid>http://zhoujin.com/post/29/</guid> 
<description>
<![CDATA[ 
	...因为它真实，就更加感人... （这篇blog的内容全部来自书中的开篇文字，直接引用过来）<br/><br/>　　张泽石先生１９２９年生于四川广安，１９岁在清华大学加入共产党，新中国成立前先後从事地下学运、农运以及武装斗争。１９５１年５月参加朝鲜战争，在战场上不幸受伤被俘。以後在战俘集中营坚持反迫害斗争，发动了生擒美军杜德准将、震惊世界的巨济岛事件。张泽石先生作为最後一批的交换战俘，１９５４年返回了祖国。<br/>　　张泽石先生应该是当之无愧的中国志愿军英雄，但是等着他的是长达一年的受审和被视为“变节者”的悲惨命运。他接着被开除了军籍和党籍，以後在“反右”和“文革”中被打成右派和叛徒，惨遭迫害。直到１９８１年才被恢复中断了３０年之久军籍和党籍，可谓重见天日。<br/>　　张泽石先生把他这三十多年来的遭遇和历史写成这部长达三十万字的自传小说《战俘手记》，部分章节曾在很多报刊连续登载，引起了社会强烈反响。张泽石先生在电话中告诉我，最近国内某电视台正在邀请他一起将此书改编成剧本，准备在电视上上演。<br/><br/>　　我非常投入地读完这部书，它给了我心灵以极大的震撼！过去曾片断地读过，这次完整地通读了。 我几次不忍卒读，是因为难以忍受感情的折磨，但它的吸引力又使我非读完终卷不可。这部书的价值不仅在文学方面，而更在它的重大思想价值方面。它是现代革命史上一出巨大的历史悲剧，罕见的悲剧，不只是个人命运的悲剧，而是民族的一个悲剧。它不是虚构的小说，是真真实实的历史。但它具有许多优秀悲剧文学毫不逊色的悲剧美学特征，具有一种感人肺腑，催人泪下，震撼心灵的崇高的悲剧力量！因为它真实，就更加感人。它还含有令人深思的丰厚的历史文化内涵。这部书的悲剧力量、令人无限感伤、令人深思的是在书的下半卷里的主人公们的命运，美的毁灭！本来是英雄，却成为罪 人，包括主人公在内都有负罪感，这多麽令人惊心！<br/><br/>战俘手记完整版应该分为两部分，我只有上半部分，就是从被俘到交换人质回到祖国的这部分，不过读者不用担心，上半部分本身就是一部完整的作品。<br/>《战俘手记》繁体中文版:<a href="attachment/1152958831.zip">点击这里下载文件</a> <br/>《战俘手记》简体中文版:<a href="attachment/1152958921.zip">点击这里下载文件</a><br/>Tags - <a href="http://zhoujin.com/tags/%25E5%25BC%25A0%25E6%25B3%25BD%25E7%259F%25B3/" rel="tag">张泽石</a> , <a href="http://zhoujin.com/tags/%25E6%2588%2598%25E4%25BF%2598%25E6%2589%258B%25E8%25AE%25B0/" rel="tag">战俘手记</a> , <a href="http://zhoujin.com/tags/%25E6%259C%259D%25E9%25B2%259C%25E6%2588%2598%25E4%25BA%2589/" rel="tag">朝鲜战争</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/28/</link>
<title><![CDATA[728桌面菜单的添加]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Sun, 09 Jul 2006 07:18:42 +0000</pubDate> 
<guid>http://zhoujin.com/post/28/</guid> 
<description>
<![CDATA[ 
	由本身机子原因，所有以后增加的程序都只能快捷健只能放在“下载管理器”里，一次无意中发现，原因我们也可以做到放在桌面的！<br/>首先机子默认设置“下载管理器”是没有放在桌面的，我们如何打开呢！见下图<br/><a href="http://zhoujin.com/attachment/1152428941.jpg" target="_blank"><img src="http://zhoujin.com/attachment/1152428941.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>点“桌面配置”。然后选择你要把“下载管理器”放在那个桌面集上。下图是放在“商务助理”的，你可以选择你喜欢的桌面集上。<br/><a href="http://zhoujin.com/attachment/1152429049.jpg" target="_blank"><img src="http://zhoujin.com/attachment/1152429049.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>然后点“应用”按钮就可以保存刚才的设置了！<br/> 然后我们到“商务助理”中打开“下载管理器”会出现如下界面后，选择“管理”菜单中的“添加”功能：<br/><a href="http://zhoujin.com/attachment/1152429188.jpg" target="_blank"><img src="http://zhoujin.com/attachment/1152429188.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>接着，在出现的资源管理器中找到你的执行的应用程序文件。然后点右上角的“OK”就会出现如下图：<br/><a href="http://zhoujin.com/attachment/1152429263.jpg" target="_blank"><img src="http://zhoujin.com/attachment/1152429263.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>然后使用ActiveSync同步手机到PC上。<br/>打开目录如下：<br/><a href="http://zhoujin.com/attachment/1152429341.jpg" target="_blank"><img src="http://zhoujin.com/attachment/1152429341.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>这时你会发现这个目录上出现你刚才添加应用程序快捷键，你可以复制一个或者复制你想要加入桌面的快捷键到如下图中所示的目录：<br/><a href="http://zhoujin.com/attachment/1152857570.jpg" target="_blank"><img src="http://zhoujin.com/attachment/1152857570.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>然后你重启手机进入安装模式下进行应用软件的升级安装好后，正常开机后到“桌面配置”中你会发现你刚才复制的快捷键全部出现了！<br/>Tags - <a href="http://zhoujin.com/tags/728/" rel="tag">728</a> , <a href="http://zhoujin.com/tags/%25E6%25A1%258C%25E9%259D%25A2%25E8%258F%259C%25E5%258D%2595/" rel="tag">桌面菜单</a> , <a href="http://zhoujin.com/tags/%25E6%25B7%25BB%25E5%258A%25A0/" rel="tag">添加</a> , <a href="http://zhoujin.com/tags/%25E5%25BF%25AB%25E6%258D%25B7/" rel="tag">快捷</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/27/</link>
<title><![CDATA[09月09日 生日密码]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Tue, 04 Jul 2006 11:09:34 +0000</pubDate> 
<guid>http://zhoujin.com/post/27/</guid> 
<description>
<![CDATA[ 
	9月9日&nbsp;&nbsp;&nbsp;&nbsp;挑战困难的人 <br/>宫位：处女座15º-17º <br/>处女座二 <br/>变动的土象 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>9月9日出生的人，复杂的本质会让他们一再地面对各种艰难的状况，当然，也有少部分是命运使然。如果这些人能选择阻力比较小的路来走，不要老挑最困难的路，他们的日子就能平静许多，但相对地，生活也就没有那么多采姿了。 <br/>&nbsp;&nbsp; <br/>毫无疑问地，9月9日出生的人很容易受到艰难挑战的吸引。如果要求他们年复一年重复做着回报（或没有回报）是可预期的工作，简直要他们的命。因此，在自觉或不自觉中，他们总会寻求机会介入一些比较复杂的人、土方或事情中，这种欲求很可能是出自他们内在的渴望，不管目前是多么成功或多么富有，他们始终感到似乎有个空缺没有填补，好像少了些什么。事实上，有许多9月9日出生的人从小开始，就一直起追寻失去的某种事物。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>这种情感的复杂面，使得9月9日出生的人对某些异性产生莫大的吸引力，通常，这些异性都想在他们身上满足母性或父性心理。但是，虽然这些9月9日出生的人很想获得这种滋养心灵的爱的模式，却同时也想保有独立的自主性与强大的意志力。一旦他们决定要做某件事时，任凭谁也没办法令他们缩手。此外，由于9月9日出生的人很善于自我反省，十分在乎个人所选取的路径，所以，只要犯了一个错或是选了一个错误的方向，他们立即会有自知之明，懂得加以改正。这一天出生的人有一个弱点，那就是会夸大自己的问题，而且常常在求助时找错了对象。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>出生于这一天的人其实是非常重视隐私权的人，但是由于职业或兴趣的缘故，却使他们必须深深与社会、人群接触。此外，他们也非常善于嗅社会大众所要的品味，也了解如何满足这些需求。因此，他们必须决定自己该处理上层社会或精英阶层的问题，或迎合低下阶层的最大需求，或在两者当中寻求一个折衷的立场。然而，不管如何，9月9日出生的人均能从过程中赚得很大的利润，获得自我的成长。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>对9月9日出生的人来说，生活就是一场对抗自我恐惧与不安全感的持续性战斗。奇怪的是，这种恐惧感却常能驱使他们获致重大的成功，而这也是为什么挑战对他们具有莫大吸引力的另一个原因。就像是对恐惧的人格特质一样，9月9日出生的人必须经常把自己置于危险的地带，好体验征服恐惧之后的满足感。出生于今天的人必须紧紧地看住自己狂野的一面，因为这会令他们做出自毁性的行为，使得周围的人们无法轻易了解或原谅他们。 <br/>幸运数字和守护星 <br/>&nbsp;&nbsp; 9月9日出生的人会受到数字9和火星的影响。数字9对其他数字拥有强大的影响力（1至9任何数字加上9之后，十位数与个位数的数字相加即会等于原来的数字，例如5＋9＝14，4＋1＝5；而1至10任何数字乘以9之后，两个位数的数字相加也会等于9，例如9*5＝45，4＋5＝9），9月9日出生的人也会对其周遭的人产生相当大的影响力。火星是个力量充沛且侵略性十足的星球，象征男性的阳刚之力，可是，对9月9日出生的处女座（主宰行星为水星）人的而方，这两个行星的会合将使他们拥有过于好辩与挑剔的个性。 <br/>健康 <br/>&nbsp;&nbsp; 9月9日出生的人容易罹患消化系统方面的毛病，他们很敏感也容易沮丧，因此能忍受压力的极限就很低，一旦情绪受到波动，压力就会使他们的胃部分泌出过多的胃酸。有些9月9日出生的人在这种情况下表现出来的饮食习惯就很不稳定，从拒食（感到很沮丧时）到暴饮暴食（非常忧郁时）都可能发生。出生于这一天的人必须学习如何让饮食变得均衡，同时，还要培养新的饮食品味。除此，他们还必须强迫自己经常运动，但是除非是职业的运动员，否则一般的运动就可以了，不必进行激烈竞争的运动。为了得到比较安稳的睡眠，他们也必须花一些心思和精力，将床铺、卧室等睡觉时的环境布置得极为舒适、满意。 <br/>建议 <br/>&nbsp;&nbsp; 建立自信是件很大的工程，你必须有反省的空间，然后再确认自己的真实才能并毫不犹豫地依此而行。如果你任由恐惧与忧虑横行的话，它们终将把你吞噬。只有你自己能够让自己倒退。保持喜悦，永不绝望。 <br/>名人 <br/>&nbsp;&nbsp; 托尔斯泰(LeoTolstoy)俄国文豪，为旧俄时代伯爵，著有小说《战争与和平》、《安娜.卡列尼娜》以及短篇小说《科罗采奏鸣曲》等书。他同时也是哲学家与社会改革者。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>台湾文学家余光中，以［左手写诗，右手写散文］知名，代表作有诗集《白玉苦仅》及《余光中散文选》。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>英国维多利亚时代的艺术家暨插画家拉克汉(ArthurRackham)，作品有《彼得潘》、《爱丽丝梦游仙境》和霍桑的《神奇书》等。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>欧提斯雷丁(OtisRedding)美国灵魂歌曲歌手与作词者。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>德国舞台剧权威莱恩哈(MaxReinhardt)，同时也是演员、制作人与导演。 <br/>&nbsp;&nbsp;&nbsp;&nbsp;<br/>美国企业家桑德斯(Harland'Colonel'Sanders)，利用11种香料的秘密配方，以高压锅蒸制美味肯德基炸鸡，行销全美和世界50余国，成为富翁。 <br/>塔罗牌 <br/>&nbsp;&nbsp; 大秘仪塔罗牌的第9张是［隐士］，他提着一盏灯、拄着拐杖，代表冥想、孤立与寂静，象征智慧的结晶及绝对的纪律。隐士是严厉的导师，他运用良心使人走上正途。牌面正立时，代表有所坚持、有目标、深沉且专注；牌面倒立时，则表示专断、不易原谅他人、多疑以及气馁。 <br/>静思语 <br/>&nbsp;&nbsp; 恼怒有时是自找的。 <br/>优点 <br/>&nbsp;&nbsp; 有分辨力、喜欢挑战、自我反省。 <br/>缺点 <br/>&nbsp;&nbsp; 恐惧、不安全感、要求过多。<br/>Tags - <a href="http://zhoujin.com/tags/%25E7%2594%259F%25E6%2597%25A5%25E5%25AF%2586%25E7%25A0%2581/" rel="tag">生日密码</a> , <a href="http://zhoujin.com/tags/%25E5%25A4%2584%25E5%25A5%25B3%25E5%25BA%25A7/" rel="tag">处女座</a> , <a href="http://zhoujin.com/tags/%25E6%2583%2585%25E6%2584%259F/" rel="tag">情感</a> , <a href="http://zhoujin.com/tags/%25E5%25A1%2594%25E7%25BD%2597%25E7%2589%258C/" rel="tag">塔罗牌</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/26/</link>
<title><![CDATA[中国最有气势的诗句一览]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Mon, 03 Jul 2006 01:04:52 +0000</pubDate> 
<guid>http://zhoujin.com/post/26/</guid> 
<description>
<![CDATA[ 
	大盗亦有盗 &nbsp;诗书所不屑 <br/>黄金若粪土 肝胆硬如铁 <br/>策马渡悬崖 弯弓射胡月 <br/>人头做酒杯 饮尽仇雠血 <br/>扬鞭慷慨莅中原 不为仇雠不为恩 <br/>只觉苍天方溃溃 欲凭赤手拯元元 <br/>十年揽髻悲羸马 万众梯山似病猿 <br/>我志未酬人犹苦 东南到处有啼痕 <br/>忍令上国衣冠沦于戎狄， 相率中原豪杰还我河山 <br/>十步杀一人，千里不留行 <br/>相爱不敢愿双飞 想逢到底成落空 <br/>一门七进士 父子三探花 <br/>壮志饥餐胡虏肉，笑谈渴饮匈奴血。 <br/>天下风去出我辈，一入江湖岁月摧。 <br/>皇图霸业谈笑中，不胜今宵一场醉！ <br/>生当作人杰, &nbsp; &nbsp;死亦为鬼雄. <br/>至今思项羽, &nbsp; &nbsp;不肯过江东. <br/>无边落木萧萧下，不尽长江滚滚来。<br/>想当年，金戈铁马，气吞万里如虎 <br/>它强任它强,轻风拂山冈, 它横任它横,月光照大江. <br/>振衣千仞冈,濯足万里流 <br/>十年磨一剑， 霜寒未曾试。 今日把君问， 可有不平事？ <br/>望门头止思张俭 忍死须臾待杜根 <br/>我自横刀向天笑 去留肝胆两昆仑 <br/>宁做真小人，不做伪君子 <br/>慷慨过燕市, 从容做楚囚, 引刀成一快, 不符少年头! <br/>我自狂歌空度日,飞扬跋扈为谁雄! <br/>赵客缦胡樱，吴钩霜雪明<br/>“犯强汉者，虽远必诛” <br/>八百里分为麾下炙 <br/>五十弦翻赛外声 <br/>壮志饥餐胡虏肉 笑谈渴饮匈奴血 <br/>红军不怕远征难，万水千山只等闲。 <br/>五岭逶迤腾细浪，乌蒙磅礴走泥丸。 金沙水拍云崖暖，大渡桥横铁索 <br/>寒。 更喜岷山千里雪，三军过后尽开颜。 <br/>仰天大笑出门去，吾辈岂是蓬蒿人。 <br/><br/>男儿何不带吴钩， 收取关山五十州？<br/>请君暂上凌烟阁， 若个书生万户侯!？ <br/>老天顺我老天昌，老天逆我叫它亡！ <br/>要知兵器为凶器，圣人不得已用之... <br/>会挽雕弓如满月，西北望，射天狼 <br/>自反而缩，虽千万人吾往矣 <br/>别人笑我忒疯癫，我笑别人看不穿； <br/>不见五陵豪杰墓，无花无酒锄做田。<br/>用舍由时,行藏在我,袖手何妨闲时看! <br/>尽挹西江,细斟北斗,万象为宾客! <br/>:呜呼！楚虽三户能亡秦，岂有堂堂中国空无人！ <br/>我自横刀向天笑，去留肝胆两昆仑。 <br/>乱石穿空，惊涛拍岸，卷起千堆雪。 <br/>驾长车踏破贺兰山缺！ <br/>安能摧眉折腰事权贵？使我不得开心颜。 <br/>星垂平野阔，月涌大江流 <br/>暮色苍茫看劲松，乱云飞渡仍从容. <br/>我本楚狂人，疯歌笑孔丘。 <br/>但使龙城飞将在，不叫胡马渡阴山 <br/><br/>黄沙百战穿金甲，不破楼兰终不还。 <br/><br/>待到来年九月八，我花开后百花杀，透天香气袭长安，满地尽带黄金甲！！！！！ <br/>飘飘何所似，天地一沙鸥 <br/>醉里挑灯看剑，梦回吹角连营 <br/>江山如此多娇，引无数英雄竞折腰~~~~俱往已，数风流人物，还看今朝 <br/>风萧萧兮易水寒 壮士一去兮不复返 <br/>一身转战三千里,一剑曾挡百万师. <br/>琴声动武林 剑在手中握 逍遥万里行 <br/>岂不惮艰险，深怀国士恩。 <br/>季布无二诺，侯嬴重一言。 <br/>人生感意气，功名谁复论！ <br/>醉卧美人漆, 醒掌杀人权. <br/>不求连城璧, 但求杀人剑. <br/>无可奈何花落去 似曾相识燕归来 <br/><br/>匈奴未灭，何以为家 <br/>有朝一日权在手，杀尽天下负我人 <br/>神勇双枪将。 风流万户侯。 <br/><br/>醉里挑灯看剑，梦回吹角连营。 <br/>我本楚狂人，凤歌笑孔丘。 <br/>十年磨一剑，霜刃未曾试。 <br/>伏波唯愿裹尸还，定远何需生入关 <br/>莫遣只轮回海窟，仍留一箭在天山<br/>不恨古人吾不见，恨古人不见吾狂耳 <br/>八百里分麾下炙，五十弦翻塞外声 <br/><br/>欲悲闹鬼叫 我哭豺狼笑 <br/>洒泪祭雄杰 扬眉剑出鞘 <br/>前不见古人，后不见来者 <br/>念天地之悠悠，独怆然而涕下 <br/>风潇潇，雨兮兮，壮士一去不复返！ <br/>王候将相，宁有种乎 <br/>老夫聊发少年狂，…………<br/><br/>鬓微霜，又何妨。持节云中，何日遣冯唐。<br/>会挽雕弓如满月，西北望，射天狼。 <br/>振长策而御宇内，执搞朴而震天下 <br/>金鳞岂是池中物,一遇风云遍化龙. <br/>风萧萧兮易水寒，壮士一去兮不复还！ <br/>落日楼头，断鸿声里，江南游子，把吴钩看了，阑干拍遍，无人会，登临意。 <br/>君子死知己，提剑出燕京。 <br/>大鹏一日同风起，扶摇直上九万里! <br/>群山万壑赴荆门，生长林彪尚有村。 <br/>一去紫台连朔漠，独留青冢向黄昏。 <br/>君不见高阳酒徒起草中， 长揖山东隆准公。 <br/>入门不拜骋雄辩， 两女辍洗来趋风。 <br/>东下齐城七十二， 指挥楚汉如旋蓬。 <br/>不料韩信不听话， 十万大军下历城。 <br/>齐王火冒三千丈， 抓了酒徒付鼎烹。 <br/>醉卧沙场君莫笑，古来征战几人回。 <br/>双手劈开生死路，一刀割断是非根。 <br/>待到风起云涌时，朝天射！！！！ <br/>人生自古谁无死，留取丹心照汗青 <br/><br/>此生自断天休问，独倚危楼。 <br/>独倚危楼，不信人间别有愁。 <br/><br/>天下文章数潇湘 潇湘文章数吾乡 <br/>吾乡文章数吾弟 吾为吾弟改文章 <br/><br/>易水萧萧西风冷，满座衣冠似雪。 <br/><br/>吾辈岂是池中物，一遇风云便化龙。 <br/>唯大英雄能本色 是真名士自风流。<br/>他日我若为青帝 报与桃花一处开 <br/><br/>世事如棋 乾坤莫测 <br/><br/>父总统子总统父子总统 <br/>兄州长弟州长兄弟州长 <br/><br/>横批:天下第一家 <br/><br/>一生思破红尘路 剑藏庐轩隐迷踪 <br/>万战自称不提刃 生来双眼篾群容 <br/><br/>傲笑天地间 黑白两不分 <br/>马车幽灵影 潇洒一郎君 <br/><br/>征衣风尘化云烟 江湖落拓不知年 <br/><br/>剑痴刀狂世纷云 今将衣钵卸双肩 <br/><br/>踏尽千山无人识 当初枉受成名牵 <br/><br/>东风吹醒英雄梦 笑对青山万重天<br/>Tags - <a href="http://zhoujin.com/tags/%25E8%25AF%2597%25E5%258F%25A5/" rel="tag">诗句</a> , <a href="http://zhoujin.com/tags/%25E6%25B0%2594%25E5%258A%25BF/" rel="tag">气势</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/25/</link>
<title><![CDATA[(WORDS OF LOVE／Dragoste-din-tei )绿柠檬树下的爱]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Fri, 30 Jun 2006 12:02:40 +0000</pubDate> 
<guid>http://zhoujin.com/post/25/</guid> 
<description>
<![CDATA[ 
	O-Zone组合乐队简介 <br/>O-Zone组合是一支来自摩尔多瓦的三人组合，现在由他们原唱的这首歌曲已经开始登上了欧洲各大排行榜。 <br/><a href="http://zhoujin.com/attachment/1151668453.jpg" target="_blank"><img src="http://zhoujin.com/attachment/1151668453.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/> &nbsp;音乐由沉闷转向清晰，很有节奏感<br/>演唱歌手： O-Zone &nbsp;<br/>专辑名称： Disco Zone <br/>中文对照歌词<br/>Dragoste-din-tei (WORDS OF LOVE)绿柠檬树下的爱 &nbsp;<br/>中文对照 &nbsp;<br/>Ma-ia-hii &nbsp;<br/>Ma-ia-huu &nbsp;<br/>Ma-ia-hoo &nbsp;<br/>Ma-ia-haa &nbsp;<br/>Ma-ia-hii &nbsp;<br/>Ma-ia-huu &nbsp;<br/>Ma-ia-hoo &nbsp;<br/>Ma-ia-haa &nbsp;<br/>Ma-ia-hii &nbsp;<br/>Ma-ia-huu &nbsp;<br/>Ma-ia-hoo &nbsp;<br/>Ma-ia-haa &nbsp;<br/>Ma-ia-hii &nbsp;<br/>Ma-ia-huu &nbsp;<br/>Ma-ia-hoo &nbsp;<br/>Ma-ia-haa &nbsp;<br/>Alo, salut, sunt eu, un haiduc,(嗨，你好， 是我， 一名歹徒) &nbsp;<br/>Si te rog, iubirea mea, primeste fericirea.(我求你， 我的爱人，接受幸福吧) &nbsp;<br/>Alo, alo, sunt eu Picasso,(嗨 嗨， 是我， 毕加索) &nbsp;<br/>Ti-am dat beep, si sunt voinic,(我给你发一声beep，而我自觉强大无比) &nbsp;<br/>Dar sa stii nu-ti cer nimic.(但你要知道我不是在要求你什么) &nbsp;<br/>Chorus.] &nbsp;<br/>Vrei sa pleci dar nu ma, nu ma iei,(你想走，不想 不想要我) &nbsp;<br/>Nu ma, nu ma iei,(不想 不想要我) &nbsp;<br/>Nu ma, nu ma, nu ma iei.(不想 不想 不想要我) &nbsp;<br/>Chipul tau si dragostea din tei,(你的脸孔和爱是从椴树里来的) &nbsp;<br/>Mi-amintesc de ochii tai.(而我会记着你的眼睛的) &nbsp;<br/>Vrei sa pleci dar nu ma, nu ma iei,(你想走，不想 不想要我) &nbsp;<br/>Nu ma, nu ma iei,(不想 不想要我) &nbsp;<br/>Nu ma, nu ma, nu ma iei.(不想 不想 不想要我) &nbsp;<br/>Chipul tau si dragostea din tei,(你的脸孔和爱是从椴树里来的) &nbsp;<br/>Mi-amintesc de ochii tai.(而我会记着你的眼睛的) &nbsp;<br/>Te sun, sa-ti spun, ce simt acum,(我给你打了个电话， 来告诉你我对你现在的感觉) &nbsp;<br/>Alo, iubirea mea, sunt eu, fericirea.(嗨， 是我， 你的幸福) &nbsp;<br/>Alo, alo, sunt iarasi eu, Picasso,(嗨 嗨， 是我，毕加索) &nbsp;<br/>Ti-am dat beep, si sunt voinic,(我给你发一声beep，而我自觉强大无比) &nbsp;<br/>Dar sa stii nu-ti cer nimic.(但你要知道我不是在要求你什么) &nbsp;<br/>Vrei sa pleci dar nu ma, nu ma iei,(你想走，不想 不想要我) &nbsp;<br/>Nu ma, nu ma iei,(不想 不想要我) &nbsp;<br/>Nu ma, nu ma, nu ma iei.(不想 不想 不想要我) &nbsp;<br/>Chipul tau si dragostea din tei,(你的脸孔和爱是从椴树里来的) &nbsp;<br/>Mi-amintesc de ochii tai.(而我会记着你的眼睛的) &nbsp;<br/>Vrei sa pleci dar nu ma, nu ma iei,(你想走，不想 不想要我) &nbsp;<br/>Nu ma, nu ma iei,(不想 不想要我) &nbsp;<br/>Nu ma, nu ma, nu ma iei.(不想 不想 不想要我) &nbsp;<br/>Chipul tau si dragostea din tei,(你的脸孔和爱是从椴树里来的) &nbsp;<br/>Mi-amintesc de ochii tai.(而我会记着你的眼睛的) &nbsp;<br/>Ma-ia-hii &nbsp;<br/>Ma-ia-huu &nbsp;<br/>Ma-ia-hoo &nbsp;<br/>Ma-ia-haa &nbsp;<br/>Ma-ia-hii &nbsp;<br/>Ma-ia-huu &nbsp;<br/>Ma-ia-hoo &nbsp;<br/>Ma-ia-haa &nbsp;<br/>Ma-ia-hii &nbsp;<br/>Ma-ia-huu &nbsp;<br/>Ma-ia-hoo &nbsp;<br/>Ma-ia-haa &nbsp;<br/>Ma-ia-hii &nbsp;<br/>Ma-ia-huu &nbsp;<br/>Ma-ia-hoo &nbsp;<br/>Ma-ia-haa &nbsp;<br/>Vrei sa pleci dar nu ma, nu ma iei,(你想走，不想 不想要我) &nbsp;<br/>Nu ma, nu ma iei,(不想 不想要我) &nbsp;<br/>Nu ma, nu ma, nu ma iei.(不想 不想 不想要我) &nbsp;<br/>Chipul tau si dragostea din tei,(你的脸孔和爱是从椴树里来的) &nbsp;<br/>Mi-amintesc de ochii tai.(而我会记着你的眼睛的) &nbsp;<br/>Vrei sa pleci dar nu ma, nu ma iei,(你想走，不想 不想要我) &nbsp;<br/>Nu ma, nu ma iei,(不想 不想要我) &nbsp;<br/>Nu ma, nu ma, nu ma iei.(不想 不想 不想要我) &nbsp;<br/>Chipul tau si dragostea din tei,(你的脸孔和爱是从椴树里来的) &nbsp;<br/>Mi-amintesc de ochii tai.(而我会记着你的眼睛的) <br/><br/>此处包含一个多媒体文件，请用网页方式查看。<br/><br/>Tags - <a href="http://zhoujin.com/tags/dragoste/" rel="tag">dragoste</a> , <a href="http://zhoujin.com/tags/din/" rel="tag">din</a> , <a href="http://zhoujin.com/tags/tei/" rel="tag">tei</a> , <a href="http://zhoujin.com/tags/%25E7%25BB%25BF%25E6%259F%25A0%25E6%25AA%25AC%25E6%25A0%2591%25E4%25B8%258B%25E7%259A%2584%25E7%2588%25B1/" rel="tag">绿柠檬树下的爱</a> , <a href="http://zhoujin.com/tags/o-zone/" rel="tag">o-zone</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/24/</link>
<title><![CDATA[处女座传说]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Fri, 30 Jun 2006 11:35:58 +0000</pubDate> 
<guid>http://zhoujin.com/post/24/</guid> 
<description>
<![CDATA[ 
	传说一 <br/><br/>　　人间管理谷物的农业之神、希腊的大地之母--狄蜜特，有一个美丽的独生女--泊瑟芬，她是春天的灿烂女神，只要她轻轻踏过的地方，都会开满娇艳欲滴的花朵。有一天她和同伴正在山谷中的一片草地上摘花，突然间，她看到一朵银色的水仙，甜美的利味飘散在空气中，泊瑟芬想：“它比我任何一朵花都漂亮！”美得光彩照人，于是她远离同伴偷偷地走近，伸手正要碰到花儿，突然，地底裂开了一个洞，一辆马车由两匹黑马拉着，冲出地面，原来是阴间之王海地士，他因爱慕“最美的春神”泊瑟芬，设下诡计掳走了她。 <br/>　　泊瑟芬的呼救声回荡在山谷、海洋之间，当然，也传到了母亲狄蜜特的耳中，狄蜜特非常的悲伤！她抛下了待收割的谷物，飞过千山万水去寻找女儿。 <br/><br/>　　人间少了大地之母，种子不再发芽，肥沃的土地结不出成串的麦穗，人类都要饿死了，宙斯看到这个情形只好命令冥王放了泊瑟芬，冥王不得不服从宙斯，但暗中却生诡计--临走前给泊瑟芬一颗果子，泊瑟芬怎么知道一旦她吃了这颗果子便无法在人间生活，注定要回到阴暗恶臭的地狱里。 <br/><br/>　　宙斯没有辨法，只好说：“一年之中，你将只有四分之一的时间可以和泊瑟芬在一起”。从此以后只要大地结满冰霜，寸草不生的时候，人们就知道这是因泊瑟芬又去了地府。处女座象征着春神泊瑟芬的美丽与纯洁，母亲养育的麦穗，也成为她手持之物。即使如此，她再也不是那个无忧无虑嬉戏于草地上的少女，每年春天她虽然会复活，依旧明艳动人，但地狱的恶臭与可怕的气氛却永远随着她。 <br/><br/>　　传说二 <br/><br/>　　传说雅斯德莱是宙斯与正义女神的女儿，当时世事纷乱，恶行猖獗，众神厌恶这个世界，纷纷远离。但雅斯德莱仍抱着一线希望，四处奔走，但仍无进展。只好遗憾地离开人间，升到天上成为处女星座。 <br/><br/>　　五六月的傍晚，在南方的天空，你可以看到她仍眷恋地俯视着人间。 <br/><br/><br/>　　传说三 <br/><br/>　　根据罗马神话，处女座又名阿斯特里亚(astraea)，为天神朱庇特和维纳斯女神的女儿，是正义女神。黄金时代末期，人类触犯了她，于是她大怒之下回到天庭。<br/>Tags - <a href="http://zhoujin.com/tags/%25E5%25A4%2584%25E5%25A5%25B3%25E5%25BA%25A7/" rel="tag">处女座</a> , <a href="http://zhoujin.com/tags/%25E4%25BC%25A0%25E8%25AF%25B4/" rel="tag">传说</a> , <a href="http://zhoujin.com/tags/%25E5%25AE%2599%25E6%2596%25AF/" rel="tag">宙斯</a> , <a href="http://zhoujin.com/tags/%25E6%25AD%25A3%25E4%25B9%2589%25E5%25A5%25B3%25E7%25A5%259E/" rel="tag">正义女神</a> , <a href="http://zhoujin.com/tags/%25E5%25B8%258C%25E8%2585%258A/" rel="tag">希腊</a> , <a href="http://zhoujin.com/tags/%25E7%258B%2584%25E8%259C%259C%25E7%2589%25B9/" rel="tag">狄蜜特</a> , <a href="http://zhoujin.com/tags/%25E6%25B3%258A%25E7%2591%259F%25E8%258A%25AC/" rel="tag">泊瑟芬</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/22/</link>
<title><![CDATA[Java SE 6 Beta 2发布 关注Mustang八大看点]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Sun, 25 Jun 2006 11:26:41 +0000</pubDate> 
<guid>http://zhoujin.com/post/22/</guid> 
<description>
<![CDATA[ 
	Java 平台的第六个版本, Standard Edition (Java SE), 代号Mustang, 发布了第二个Beta版本.今年年初Mustang发布了第一个Beta版本.掀开了Java SE 6 的神秘面纱.这一次,是时隔4个月发布第二次Beta版本.<br/>　　Java SE 6 Beta 2 (Mustang) 有什么新东西? 有什么值得开发者关注?<br/><br/>　　简化Web Services<br/><br/>　　Mustang 将 简化Web services 的开发和发布. XML和Web服务一直都是Mustang的关注重点.. Mustang为此引入了JAX-WS(Java Architecture for XML-Web Services) 2.0 以及JAXB(Java Architecture for XML Binding) 2.0.. 同时还有Streaming API for XML (STaX), 它提供了一个双向API，这个API可以通过一个事件流来读取或者写入XML，其中包括跳过某个部分，然后直接关注与文档中的另外一个小部分的能力。<br/><br/>　　Scripting,整合脚本语言<br/><br/>　　目前来讲，Java 开发者们必须在Java之外独立地额外编码来使用non-Java 脚本语言。这个头痛的问题将被Mustang 消灭，开发者将更加轻松的使用Perl、PHP、Python、JavaScript 和Ruby等脚本语言。新的框架将允许人们操作任意的脚本语言，和使用Java 对象。<br/><br/>　　Java SE6中实现了JSR223。这是一个脚本框架，提供了让脚本语言来访问Java内部的方法。你可以在运行的时候找到脚本引擎，然后调用这个引擎去执行脚本。这个脚本API允许你为脚本语言提供Java支持。另外，Web Scripting Framework允许脚本代码在任何的Servlet容器(例如Tomcat)中生成Web内容。<br/><br/>　　Database,绑定Derby<br/><br/>　　开源嵌入式数据库 Derby(JavaDB) 绑定在JDK 1.6中.具体可以参考:JDK 1.6 将绑定开源数据库 Derby<br/><br/>　　更丰富的Desktop APIs<br/><br/>　　Mustang中拥有更多强的桌面API提供给开发者, 开发者可以更简单地开发更强大的桌面应用, 比如启动界面的支持,系统托盘的支持,JTable排序等等<br/><br/>　　监视和管理<br/><br/>　　Java SE 6中对内存泄漏增强了分析以及诊断能力。当遇到java.lang.OutOfMemory异常的时候，可以得到一个完整的堆栈信息，并且当堆已经满了的时候，会产生一个Log文件来记录这个致命错误。另外，JVM还添加了一个选项，允许你在堆满的时候运行脚本。(这也就是提供了另外一种方法来诊断错误)<br/><br/>　　增强的JMX 监视API在MBean的属性值传入了一个特定的参数的时候，允许这个应用程序发送一个事件通告。(这里的属性值可以在很复杂的类型中)<br/><br/>　　对于Solaris 10的用户，为Solaris提供的Hotspot JVM中，提供了一种通过Solaris DTrace(这是个系统的调试工具)来追踪显示JVM内部的活动情况，包括垃圾收集，类装载，线程，锁等等。<br/><br/>　　Pluggable Annotations<br/><br/>　　从Java SE 5 带来得新特性Annotations,将在Mustang继续扮演重要角色..<br/><br/>　　Compiler API:访问编译器<br/><br/>　　对于Java开发工具, 或者Web框架 等的开发者来说, 利用编译器编译动态生成的代码, 是一个普遍的需求.<br/><br/>　　Mustang实现了JSR 199, 提供了Java编译器API(应用程序接口)，允许你从一个Java应用程序中去编译其他的Java源程序--比如在应用程序中动态生成的一些源代码..<br/><br/>　　Security:安全性<br/><br/>　　Java SE 6的安全部分，增加了 XML-Digital Signature (XML-DSIG) APIs, 整合了GSS/Kerberos的操作API，LDAP上的JAAS认证。<br/><br/>　　Java SE 6 Beta 2 <a href="http://java.sun.com/javase/6/download.jsp?feed=JSC" target="_blank">下载</a>:<br/>Tags - <a href="http://zhoujin.com/tags/java/" rel="tag">java</a> , <a href="http://zhoujin.com/tags/se/" rel="tag">se</a> , <a href="http://zhoujin.com/tags/jsr223/" rel="tag">jsr223</a> , <a href="http://zhoujin.com/tags/derby/" rel="tag">derby</a> , <a href="http://zhoujin.com/tags/web/" rel="tag">web</a> , <a href="http://zhoujin.com/tags/services/" rel="tag">services</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/21/</link>
<title><![CDATA[远方]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Fri, 23 Jun 2006 04:49:47 +0000</pubDate> 
<guid>http://zhoujin.com/post/21/</guid> 
<description>
<![CDATA[ 
	远方有我最真的梦,有我最深的情,有我最爱的她…… <br/>今天很孤独,突然没了她的消息,突然好想有自己的小楼,我只想做这里孤独寂寞的主人,我只想在这座楼里有份美丽的心情,在心情里有和她走过的四季风景,直到永远……<br/><br/>三月 <br/>一年中最美丽 <br/>最多情的季节 <br/>她在我生命的树上 <br/>雕了一枝梅花 <br/>春风吹过 <br/>抖落在我的怀里 <br/>我轻轻的把它珍藏在心灵深处 <br/>它不小心触动了我心中的音乐 <br/>化成了小诗一朵<br/><br/>傍晚的嫣红是我一天对她最后的守候。。。。。。<br/><br/>晨起的第一缕阳光是我对她的问候。。。。。。<br/><br/>她的心海水太深，我游不过去。。。。。。 <br/>还记得那个多情的春天，她如一只蝴蝶翩然闯进我的视线，为我镀亮生命中的那段音符，从此，甘愿让我的心化作一朵白云，跟随她到天涯海角；让我的灵魂化作一挂雨帘，伴她有雨的日子到永远。。。。。。 <br/><br/>面对远去的她,我的思念更浓,然而她有自己的天空,我只有独自心疼,徒然将思念植成一棵相思树,在她流浪的必经路上守候,除此之外我还能做些什么。我只想她疲惫时，别忘了望望天空上飘飞的红云，那里有我对她深深的祝福。。。。。。 <br/>能相逢一个让你好想的人真的好不容易。。。。。。<br/><br/>有远方的人是幸福的,这样的幸福,也只有当你真正思念远方才会懂得。。。。。。<br/><br/>我开始习惯了在黑夜孤灯下读写每日不同的心情,一种渺远又实在的情真意切的思念又萦绕在眼前,在脑海...... <br/>每当这个时间段：千里信息咫尺语/夜浓草眠真心语——是我们睡前最温馨的时光，是我与她道晚安的时间...交出了眼睛，收获了美美的风景；交出了心灵，收获了浓浓的情！——很想她......<br/><br/>今天的雨压跟就没停过，听着雨声从天而降，不顾一切扑到地面的执着和勇气，令我动容也钦佩。我喜欢雨，不仅喜欢雨声的美妙悦耳，更喜欢雨的神奇和惬意，它能弥漫成情调，浸润成氛围，镌刻成记忆。。。此时外面下着雨，心却晴着；又有时，外面晴着，心却下着雨。世界上的许多东西就是这样，在对比中让你回味，让你选择。。。心晴的时候，雨也美丽，心雨的时候，晴也乌云。。。下雨的时候最容易思念远方，想着远方的她在干什么？过得好不好？ <br/><br/>坐在这里，很庆幸的想着，我不只拥有和她春夏秋冬四季完整的甜蜜回忆，更多的还有对她无休无止的亲情牵挂,谁让上苍在茫茫人海为我送来善良、阳光、快乐的她，曾经心有灵犀不点也通的两颗心那么的快乐过，心灵感应原来可以天涯咫尺，这种感觉以后不会再有谁能给得了，所以至今仍然把她深深的遥想。。。 <br/>我要把这些属于我和她的文字，涂上她最喜欢的兰色，那一个个兰色串起的思念文字，写着只有我和她懂得的心情，然后它们就友好的等待着她来阅读它们，我的心情也因此而美丽。。。<br/><br/>总是 <br/>独自在夜晚 <br/>悄悄打开记忆的盒子 <br/>守财奴般的清点 <br/>我们的曾经 <br/><br/>每个清晨 <br/>每个夜晚 <br/>每次相约 <br/>每句话语 <br/>雕刻在心中 <br/>为的是好在来世 <br/>与你的重逢 <br/><br/>如果真有来世 <br/>如果来世的时间可以预约 <br/>那么从春天到冬季 <br/>我都会 <br/>伫立在桥边 <br/>痴痴的在雨中 <br/>等你撑兰色的伞 <br/>来接<br/><br/>把往事谱成歌 <br/>歌里唱你 <br/>也唱着我 <br/>把歌唱成思念 <br/>思中有你 <br/>念中有我 <br/>把思念吟成诗行 <br/>诗中是你 <br/>行中藏我 <br/>把诗行化成雨 <br/>雨中有你 <br/>雨中有我 <br/>把雨拧成风筝线 <br/>一头是你 <br/>一头是我<br/>Tags - <a href="http://zhoujin.com/tags/%25E8%25BF%259C%25E6%2596%25B9/" rel="tag">远方</a> , <a href="http://zhoujin.com/tags/%25E4%25B8%2589%25E6%259C%2588/" rel="tag">三月</a> , <a href="http://zhoujin.com/tags/%25E5%25B0%258F%25E9%259B%25A8/" rel="tag">小雨</a> , <a href="http://zhoujin.com/tags/%25E5%25B9%25B8%25E7%25A6%258F/" rel="tag">幸福</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/19/</link>
<title><![CDATA[2006世界杯霸主：阿根廷 无疑]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Tue, 20 Jun 2006 02:04:24 +0000</pubDate> 
<guid>http://zhoujin.com/post/19/</guid> 
<description>
<![CDATA[ 
	强队实在令人佩服，配合、个人技术、心里素质都实在让人挑不出任何毛病，6粒净进球 让人看得实在过瘾。 这届大力神杯 舍 阿根廷 其谁？<br/>我也不指望中国队能达到这种一半的水平了，我能达到一半我就满足了，哈哈。 <br/><br/>下面是全场比赛 <br/>技术统计数据：<br/><hr/><br/><a href="http://zhoujin.com/attachment/1150768937.jpg" target="_blank"><img src="http://zhoujin.com/attachment/1150768937.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0" width="510" height="300"/></a><br/><hr/><br/>(注：以上技术统计来自欧洲权威统计机构OPTA)<br/>Tags - <a href="http://zhoujin.com/tags/%25E9%2598%25BF%25E6%25A0%25B9%25E5%25BB%25B7/" rel="tag">阿根廷</a> , <a href="http://zhoujin.com/tags/%25E6%25AF%2594%25E8%25B5%259B/" rel="tag">比赛</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/18/</link>
<title><![CDATA[JBPM的一些资料]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[JBPM]]></category>
<pubDate>Tue, 20 Jun 2006 01:53:24 +0000</pubDate> 
<guid>http://zhoujin.com/post/18/</guid> 
<description>
<![CDATA[ 
	jPDL的流程定义元素 <br/>第一层级:GraphElement <br/><br/>这个容易理解,因为在画流程定义时,每个拖拉的对象都是一个graph的元素. <br/><br/>GraphElement有四个属性:1)processDefine 表示当前元素属于哪个流程定义 <br/><br/>2)events 表示可以接收哪些event <br/><br/>3)name 名字 <br/><br/>4)exceptionHandlers 异常处理类集合(List) <br/><br/>第二层级:node;processDefinition;Transition;Task 它们都inherited from GraphElement <br/><br/>1)processDefinition表示流程定义(implements NodeCollection),它有下面的属性:name,version,nodes,startState nodes表示流程中所有的node,startState用于启动流程时找到首节点 <br/><br/>2)Transition表示转移,它有三个属性:from(Node),to(Node),supportedEventTypes表示支持的event类型 <br/><br/>3)node表示节点,它有四个属性:leaving transitions;arriving transitions;action;superState <br/><br/>4)Task 定义任务 <br/><br/>第三层级:各种不同的node,它们都inherited from node decision;EndState;Fork;Join;Merge;Milestone; InterleaveEnd;InterleaveStart;ProcessState;State 这些都是见名知义,和xpdl差不多. <br/>jbpm的Token <br/>jbpm中最重要的概念,应该是令牌(Token)和信令(Signal) <br/><br/>在整个流程实例运行过程中,我们可以迅速的利用token得到其当前的current state。在解决“并行”等（比如Fork）问题时，jBpm让Token对象维护了父子关系，这种关系在涉及到Fork的时候会产生。 jBpm让Token这个对象身兼了多种使命：（1）快速定位current state （2）用于fork,join算法 （3）用于告知任务执行者的任务索引。 <br/><br/>如下代码: <br/><br/>//pd是process definition,pi是process instance ProcessInstance <br/><br/>pi = new ProcessInstance( pd ); <br/><br/>//得到根令牌 <br/><br/>Token token = pi.getRootToken(); <br/><br/>//发信令 <br/><br/>token.signal(); <br/><br/>Token的signal方法也可以传入transition参数,这个方法把信令发送给Token,这样,令牌将被激活,并沿指定的transition离开当前的状态(如果没有指定transition,将沿缺省的transition 离开当前状态). <br/><br/>jbpm是怎么实现的呢?其实很简单: <br/><br/>1)Token记录了当前的状态（current state）,只有当前的状态(或称节点)拥有该令牌 <br/><br/>2)向TOKEN发signal后,当前状态收到该signal <br/><br/>3)当前状态把令牌传给signal中指定的transition <br/><br/>4)transition收到令牌后,不强占,马上把令牌传给下个状态. <br/><br/>5)根据令牌的位置,流程的状态已经发生改变. <br/><br/><br/>1、process definition <br/>一个process definition代表了一个正式的业务流程，它以一个流程图为基础。这个流程图由 许多node和transition组成。每个node在这个流程图里都有着各自特殊的类型，这些不同的类型决定了node在运行时的不同行为。一个process definition只有一个start state 。 <br/>2、token <br/>一个token代表了一条执行路径，它包含了这条执行路径的当前的执行状态（current state）。 <br/>3、process instance <br/>一个process instance（流程实例）即一个process definition（流程定义）的流程执行实例。一个process definition可以对应多个process instance。当一个process instance被创建的时候，一个主执行路径token同时被创建，这个token叫做root token，它指向流程定义的start state（processDefinition.getStartState()==token.getNode()）。 <br/>4、signal <br/>一个signal 发送给token通知token 继续流程的执行。如果signal 没有指定transition，token将沿缺省的transition离开当前状态,如果signal 指定transition，token将沿指定的transition离开当前的状态。看源代码可以看到发给process instance的signal 其实都是发送给了root token。 <br/>5、Actions <br/>jbpm提供了灵活的action ，当流程执行，token 进入node和transition时，会触发相应的一些event（事件）。在这些event上附上我们自己写的action，就会带动action 的执行。action里是我们自己的相关java操作代码，非常方便。注意的是event（事件）是内置的，无法扩展。另外，action也可以直接挂在node上，而不依赖于event（事件）的触发，这个很重要！ <br/>Node <br/><br/><br/>一个流程图由许多node和transition组成。每个node都有一种类型，这个类型决定了当流程执行到这个node时的不同行为。jbpm有一组node type可以供你选择，当然你可以定制自己node 。 <br/>node的作用 <br/>node有两个主要的作用： <br/>1）执行java代码，比如说创建task instance（任务实例）、发出通知、更新数据库等等。很典型的就是在node 上挂上我们的action <br/>2) 控制流程的执行： <br/>A、等待状态 <br/>流程进入到这个node时将处于等待状态，直到一个signal 的发出 <br/>B、流程将沿着一个leaving transition越过这个node <br/>这种情况特殊一点，需要有个action挂在这个node上（注意这个action不是event触发的！），action中将会调用到API里 <br/>executionContext.leaveNode(String transitionName)，transitionName即这里的leaving transition名字。 <br/>C、创建新的执行路径 <br/>很典型的就是fork node。流程在这里会分叉，产生新的执行路径。这样就创建了新的token，每个新的token代表一个新的执行路径。注意的是，这些新的token和产生前的token是父子关系！ <br/>D、结束执行路径 <br/>一个node可以结束一条执行路径，这同样意味着相应的token的结束和流程的结束。<br/><br/>流程图中的node type <br/><br/><br/>1、task-node <br/>一个task-node可以包含一个或多个task，这些task分配给特定的user。当流程执行到task-node时，task instance将会被创建，一个task对应一个task instance。task instances 创建后，task-node就处于等待状态。当所有的task instances被特定的user执行完毕后，将会发出一个新的signal 到token，即流程继续执行。 <br/>2、state <br/>state是一个纯粹的wait state(等待状态）。它和task-node的区别就是它不会创建task instances。很典型的用法是，当进入这个节点时（通过绑定一个action到node-enter event），发送一条消息到外部的系统，然后流程就处于等待状态。外部系统完成一些操作后返回一条消息，这个消息触发一个signal 到token，然后流程继续执行。（不常用） <br/>3、decision <br/>当需要在流程中根据不同条件来判断执行不同路径时，就可以用decision节点。两种方法：最简单的是在transitions里增加condition elements（条件），condition是beanshell script写的，它返回一个boolean。当运行的时候，decision节点将会在它的 leaving transitions里循环，同时比较 leaving transitions里的condition，最先返回'true'的condition，那个leaving transitions将会被执行；作为选择，你可以实现DecisionHandler接口，它有一个decide()方法，该方法返回一个String(leaving transition的名字）。 <br/>4、fork <br/>fork节点把一条执行路径分离成多条同时进行（并发）的执行路径，每条离开fork节点的路径产生一个子token。 <br/>5、join <br/>默认情况下，join节点会认为所有到达该节点的token都有着相同的父token。join 节点会结束每一个到达该节点的token,当所有的子token都到达该节点后，父token会激活。当仍然有子token处于活动状态时，join 节点是wait state(等待状态）。 <br/>6、node <br/>node节点就是让你挂自己的action用的（注意：不是event触发！！），当流程到达该节点时，action会被执行。你的action要实现ActionHandler接口。同样，在你的action里要控制流程！<br/><br/>Actions的说明 <br/><br/><br/>存在两种action，一种是 event触发的action，一种是挂在node 节点的action。要注意它们的区别，event触发的action无法控制流程，也就是说它无法决定流程经过这个节点后下一步将到哪一个leaving transition；而挂在node 节点的action就不同，它可以控制流程。不管是哪一种action都要实现ActionHandler接口。 <br/>variable的管理 <br/><br/><br/>流程实例中,存有contextInstance来管理token和variable. <br/>contextInstance是通过一个map来进行管理的,这个map的key是token,value是一个TokenVariableMap的对象. <br/><br/>TokenVariableMap本身并不是个map,而是一个普通的Object <br/><br/>TokenVariableMap有三个属性,一个是contextInstance,一个是Token对象本身,还有一个是 <br/>一个Map,用来放variableInstance,这个Map的名称为variableInstances. <br/><br/>variableInstances是一个map,它的key是variable的名称,如"a",value是一个VariableInstance对象,VariableInstance对象放了四个属性,一个是token对象本身,一个是variable的名称,一个是TokenVariableMap对象，还有一个是processInsance,你可能会奇怪：variable的value放到哪里呢？实际上VariableInstance是一个抽象类，具体的实现是它根据value的class类型选择它的子类，子类中有个属性叫value。这个variable的value,如 new Integer(3). <br/><br/>一个流程实例可以有多个Token,Token间是有父子关系的: <br/>Token tokenAB=new Token(tokenA,"ab"); <br/>上行代码的意思是在tokenA下面建立一个TokenAB,该新建的 <br/>Token的名字是"ab". <br/><br/>ci.createVariable(tokenA, "a", new Integer(3)); <br/>表示在tokenA范围内建立一个variable,它的名称为"a", <br/>值为new Integer(3) <br/>建立这个variable后,tokenA下面的token都可以看到该 <br/>variable,而上面的token则看不到. <br/><br/>只有createVariable可以在某个token上建立variable,其它的 <br/>方法只可以在rootToken上建立variable. <br/>如:ci.setVariable(tokenA, "a", new Integer(3)); <br/>其实是在rootToken上建立了一个名称为"a"的variable <br/>Map variables = new HashMap(); <br/>variables.put("a", new Integer(3)); <br/>variables.put("b", new Integer(4)); <br/>ci.addVariables(variables); <br/>上面四行代码在rootToken上建立了两个variable. <br/>实际上在ExecutionContext中只有两个方法： <br/>public void setVariable(String name, Object value) &#123; <br/>getContextInstance().setVariable(name, value, token); <br/>&#125; <br/>public Object getVariable(String name) &#123; <br/>return getContextInstance().getVariable(name, token); <br/>&#125; <br/>可以在子token中修改父token中建立的variable.<br/><br/>Task（任务） <br/><br/><br/>jbpm一个相当重要的功能就是对任务进行管理。 <br/>Task（任务）是流程定义里的一部分，它决定了task instance的创建和分配。 <br/>Task（任务）可以在task-node节点下定义，也可以挂在process-definition节点下。最普遍的方式是在task-node节点下定义一个或多个任务。默认情况下，流程在task-node节点会处于等待状态，直到所有的任务被执行完毕。任务的名称在整个流程中必须是唯一的。 <br/><br/>一个TaskNode对应多个Task <br/>对于这样的流程定义： <br/><task-node name='a'> <br/><task name='laundry' /> <br/><task name='dishes' /> <br/><task name='change nappy' /> <br/><transition to='b' /> <br/></task-node> <br/>只有当节点中的三个任务都完成后，流程才进入后面的节点 <br/><br/>对于这样的流程定义： <br/><task-node name='a' signal='first'>> <br/><task name='laundry' /> <br/><task name='dishes' /> <br/><task name='change nappy' /> <br/><transition to='b' /> <br/></task-node> <br/>当第一个任务完成后，token就指向后面的节点 <br/><br/>对于这样的流程定义： <br/><task-node name='a' signal='never'>> <br/><task name='laundry' /> <br/><task name='dishes' /> <br/><task name='change nappy' /> <br/><transition to='b' /> <br/></task-node> <br/>三个任务都完成后，token仍然不会指向后面的节点；需要自己手动调用 <br/><br/>processInstance.signal()才会驱动流程到下面的节点 <br/><br/>对于这样的流程定义： <br/><task-node name='a' signal='unsynchronized'>> <br/><task name='laundry' /> <br/><task name='dishes' /> <br/><task name='change nappy' /> <br/><transition to='b' /> <br/></task-node> <br/>token不会在本节点停留，而是直接到后面的节点<br/><br/>jbpm的任务管理实现 <br/>一个Task instance（任务实例）可以被分配给一个actorId (java.lang.String)。所有的Task instance都被保存在数据库中的表jbpm_taskinstance里。当你想得到特定用户的任务清单时，你就可以通过一个与用户关联的actorId来查询这张表。 <br/><br/>一个流程定义有一个TaskMgmtDefinition；一个TaskMgmtDefinition对应多个swimlane,同时对应多个task;一个swimlane有多个task,可以从TaskMgmtDefinition中通过task的名称直接获取相应的task; <br/><br/>swimlane对象有四个属性，分别是name（名字）、assignmentDelegation（分配代理类）、taskMgmtDefinition、tasks（Set 对应多个task),可以增加task <br/><br/>task对象主要的属性：taskMgmtDefinition、swimlane、assignmentDelegation、taskNode，需要注意的是swimlane和assignmentDelegation中间只是可以一个属性有值，因为它们都和任务的分配有关系。 <br/><br/>一个流程实例有一个TaskMgmtInstance；一个TaskMgmtInstance对应多个swimlaneInstance,同时对应多个taskInstance;一个swimlaneInstance有多个taskInstance,可以从TaskMgmtInstance中直接获取相应的taskInstance; <br/><br/>swimlaneInstance对象主要有五个属性，分别是name、actorId、pooledActors（Set）、swimlane、taskMgmtInstance。 <br/>taskInstance对象的主要属性：name、actorId、task、swimlaneInstance、taskMgmtInstance、pooledActors。 <br/><br/>当对任务进行分配时，一般需要实现AssignmentHandler这个接口，这个接口的方法只有一个： <br/>void assign( Assignable assignable, ExecutionContext executionContext ) throws Exception; <br/>一个典型的实现（把名字是'change nappy'的任务交给NappyAssignmentHandler这个类来分配） <br/><task name='change nappy'> <br/><assignment class='org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler' /> <br/></task> <br/>NappyAssignmentHandler类： <br/>public void assign(Assignable assignable, ExecutionContext executionContext) &#123; <br/>assignable.setActorId("papa"); <br/>&#125; <br/>同样，Assignable只是一个接口，它有两个方法：setActorId()和setPooledActors()，Assignable的具体实现类也是两个 <br/>swimlaneInstancehe和taskInstance。这样就不不难理解整个任务分配流程了： <br/>1、流程进入TaskNode节点，执行TaskNode类的execute()方法，该方法首先获得TaskMgmtInstance实例，然后通过它来创建TaskInstance。taskMgmtInstance.createTaskInstance(task, executionContext); <br/>2、在上面的createTaskInstance(task, executionContext)里，该方法调用了taskInstance.assign(executionContext)对taskInstance进行分配。 <br/>3、在assign(executionContext)方法里，首先会判断task属性里是否存在swimlane，如果有的话，这个taskInstance就会分配给swimlane指定的ActorId或 PooledActors；如果不存在，再去找task属性里 assignmentDelegation（分配代理类）通过代理类（即我们自己写的实现AssignmentHandler这个接口的类）指定ActorId或 PooledActors。 <br/>jbpm的用户角色管理 <br/><br/><br/>jbpm在用户角色管理上共设计了四个类：Entity、 Membership、 Group、 User <br/>Entity类是其他三个类的父类，它包含了两个属性：name(String)、 permissions(Set) <br/>User类继承Entity类，包含三个属性：password(String)、 email(String)、 memberships(Set) <br/>Group类继承Entity类，包含四个属性: type(String) 、parent(Group)、 children(Set)、 memberships(Set) <br/>Membership类继承Entity类，包含三个属性:role(String)、 user(User)、 group(Group) <br/>很明显，一个user对应一个用户，一个group对应一个用户组，它们之间通过membership关联，并且一个user可以属于多个不同类型（type)的group，user和 group之间是多对多的关系。 <br/>Membership类的role属性个人感觉用途不大，反倒是name属性代表了user在group里的role（角色）！<br/>Tags - <a href="http://zhoujin.com/tags/jbpm/" rel="tag">jbpm</a> , <a href="http://zhoujin.com/tags/jpdl/" rel="tag">jpdl</a> , <a href="http://zhoujin.com/tags/node/" rel="tag">node</a> , <a href="http://zhoujin.com/tags/task/" rel="tag">task</a> , <a href="http://zhoujin.com/tags/%25E8%25A7%2592%25E8%2589%25B2/" rel="tag">角色</a> , <a href="http://zhoujin.com/tags/%25E4%25BB%25BB%25E5%258A%25A1/" rel="tag">任务</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/17/</link>
<title><![CDATA[O/R Mapping ]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Tue, 20 Jun 2006 01:46:58 +0000</pubDate> 
<guid>http://zhoujin.com/post/17/</guid> 
<description>
<![CDATA[ 
	（一）对象之间的关系：<br/>1． 依赖：<br/>依赖对象通过调用被依赖对象的方法来获得服务。一种比较松散的关系，并且是短期的。我们的过程与对象往往依赖与我们的实体域对象。如在struts 的 action中调用模型层的方法。<br/>2． 关联<br/>它使一个类指到另一个类的属性。长期的<br/>3． 聚合<br/>聚合关系是关联关系的一种，是强的关联关系。聚合是整体和部分之间的关系。<br/>4． 组合<br/>也叫合成关系，组成关系是关联关系的一种，是比聚合关系强的关系。对象负责代表部分的对象的生命周期。<br/>注：既然聚合，组合关系属于关联关系，那么如何区分一般关联关系，聚合关系和组合关系呢？<br/>一般关联：只要一个对象联系到另外一个对象就形成了关联关系。如：人和他的猫，黑豹乐队和窦魏，pc机和显示器。<br/>聚合关系：一种强关联关系，它要求有部分和整体的关系，并且没有了整体部分也可以独立存在。在上面三个例子中人和它的猫显然没有部分和整体的关系，所以只能是一般的关联关系。而黑豹乐队和窦魏，窦魏等人组成了黑豹乐队即：窦魏和黑豹是整体和部分的关系。而<br/>窦魏脱离了黑豹（早就离开了）更或者黑豹不存在了那么窦魏仍然可以以音乐人的身份存在（即对象仍然可以独立存在）所以它属于聚合关系。组成关系是可以共享的。（窦魏也可以加入其他乐队）。<br/>组合关系：一种更强的整体和部分的关系。它并且要求代表整体的对象负责代表部分的对象的生命周期，组成关系是不能共享的。如：pc机和显示器的关系。<br/>我觉得：如果两个实体是整体和部分的关系，那么它们到底是聚合还是组合，这取决于你的需求。比如说：pc机和显示器的关系，如果你的系统中，显示器脱离了pc机就不存在意义了，也可以说：所有显示器的访问都是通过pc机进行的，那么你可以把关系设定为组合（如你在为一个只买品牌机的代理商作系统你可能是可以这么作的）。如果你的显示器脱离的pc机仍然可以独立存在，也就是说在系统中可以直接访问显示器对象，那么你可以将关系设为聚合（如你在为一个买散件的代理商作系统你可能是可以这么作的）<br/>5． 继承<br/>这个我不想多讲了，用过面向对象的语言都应该知道。<br/>（二）关系数据库的关系<br/>一对一<br/>一对多<br/>多对一<br/>多对多<br/>（三）o/r mapping策略<br/>1．继承：<br/>对于继承关系一般有三种策略：<br/>策略1继承树的每个类对应一个表<br/>共享主键<br/>策略2继承树的根类对应一个表<br/>需要添加一个识别字段<br/>策略3继承树的叶子类对应一个表<br/>不支持多态查询<br/>2．关联<br/>2．1一对一<br/>一半有两种策略：<br/>策略1：唯一的外键<br/>+unique=”true” (唯一的外键)<br/><br/>策略2：共享主键<br/><br/>(既是主键又是外键)<br/>注意：生成方式需要用：foreign<br/>2．2一对多（无需多说）<br/>2．3多对一（无需多说）<br/>2．4多对多<br/>策略1：A,B表多对多的关系需要引入C表。<br/>C表中的所有属性即为主键又为外键分别参照A,B两表。<br/>C表中不可以有其他属性<br/>策略2：将多对多拆分成两个一对多：<br/>A,B对象多对多的关系需要引入C对象。使得A,B两对象与C对象的关系为一对多。对应数据库中：A,B表多对多的关系需要引入C表。A,B两表与C表的关系为一对多。<br/>C表又自己的主键<br/>C表中又非主键的外键分别参照A,B两表。<br/>C表中不可以有其他属性<br/>如；学生 ，课程为多对多的关系 那么引入学生选课。<br/>注意：策略1和策略2的不同在于：策略2引入了新的对象而策略1没有。这是因为这样：策略1的c表不能又自己的东西。而策略2有。<br/>2．5其他<br/>上面说过：聚合与组成是关联的一种所以他们也符合以上策略。<br/>特别的：当用到组合关系的是否我们可用用到hibernate的“组件”.由于“组件”它完全可以满足组成关系的强关联。<br/>3．依赖<br/>一般不在实体域对象中体现。<br/>Tags - <a href="http://zhoujin.com/tags/%25E4%25BE%259D%25E8%25B5%2596/" rel="tag">依赖</a> , <a href="http://zhoujin.com/tags/%25E7%25AD%2596%25E7%2595%25A5/" rel="tag">策略</a> , <a href="http://zhoujin.com/tags/%25E4%25B8%25BB%25E9%2594%25AE/" rel="tag">主键</a> , <a href="http://zhoujin.com/tags/%25E5%25A4%2596%25E9%2594%25AE/" rel="tag">外键</a> , <a href="http://zhoujin.com/tags/hibernate/" rel="tag">hibernate</a> , <a href="http://zhoujin.com/tags/%25E7%25BB%2584%25E4%25BB%25B6/" rel="tag">组件</a> , <a href="http://zhoujin.com/tags/%25E7%25BB%2584%25E5%2590%2588/" rel="tag">组合</a> , <a href="http://zhoujin.com/tags/%25E5%2585%25B3%25E8%2581%2594/" rel="tag">关联</a> , <a href="http://zhoujin.com/tags/%25E8%2581%259A%25E5%2590%2588/" rel="tag">聚合</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/16/</link>
<title><![CDATA[让插入到 innerHTML 中的 script 跑起来]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[JAVASCRIPT]]></category>
<pubDate>Mon, 19 Jun 2006 03:34:25 +0000</pubDate> 
<guid>http://zhoujin.com/post/16/</guid> 
<description>
<![CDATA[ 
	在做 ajax 编程时，我们常常需要将 xmlhttp 获取到的页面内容通过 innerHTML 来赋给某个容器（比如 div、span 或者 td 等），但是这里存在一个问题，就是我们将要赋给 innerHTML 的页面内容如果包含有脚本程序，这些脚本程序不管是外部脚本，还是内部脚本，可能(1)都不会被执行。这个问题在某些时候微不足道，甚至可以忽略，但有些时候，这个问题就非常严重，它很可能让我们的程序得不到预期的结果。因此我们需要解决这个问题。<br/><br/>如果你读过 MSDN，你会发现并非所有插入到 innerHTML 中的脚本都不能执行，如果这段脚本的 script 标签中包含了 defer 属性，IE 会正确的执行这些脚本程序。但不幸的是，Moziila/Firefox 和 Opera 可不吃这一套，不管 script 标签有没有设置 defer 属性，这些浏览器都不会向 IE 那样去执行插入到 innerHTML 中的脚本。<br/><br/>但不管脚本是否被执行了，有一点我们可以肯定，那就是这些脚本确实被插入到了 innerHTML 中，如果不相信，你可以 alert 一下看看。但如果你真的 alert 了，你也可能会发现有一种例外情况存在，那就是如果脚本在 innerHTML 内容开头的话，那么 IE 浏览器将会忽略掉这段脚本，而 Moziila/Firefox 和 Opera 却不会。<br/><br/>好了，问题分析的差不多了，我们来看看如何解决吧。<br/><br/>解决的思路其实很简单，那就是将插入到 innerHTML 中的所有脚本取出来，然后一一执行。不过我们先要解决上面的两个问题。<br/><br/>先来看第一个问题，如何避免在 IE 中重复执行 innerHTML 中带有 defer 属性的脚本。这个很容易，只需要先确定浏览器是否是 IE，然后再检测将要执行的脚本是否带有 defer 属性即可。需要注意的是，在判断 IE 浏览器时，我们需要避免被 opera 的浏览器识别欺骗。这一点我们在后面的代码中将会看到它是如何做的。<br/><br/>接下来，看 IE 忽略 innerHTML 开头脚本的问题，这个也很容易解决。只需要在要插入到 innerHTML 中的内容的开头附加一段不是脚本的内容，就可以了。但不要试图附加一个空内容的标签，或者空格、回车、换行等，这将不起作用，开头的脚本仍然会被忽略。也不要试图附加&nbsp;&nbsp;，虽然这可以让开头的脚本不再被忽略，但这个&nbsp;&nbsp; 仍然会影响原有内容的显示，虽然你可能觉得不明显，但是对于挑剔的用户来说，这可能是无法容忍的。因此，为了让附加的内容既可以起到避免开头脚本被忽略的功能，又不会造成不良影响，我们将附加这么一段内容：<br/><div class="code">&lt;span style=&quot;display: none&quot;&gt;hack ie&lt;/span&gt;</div><br/>虽然上面这段内容有一定的长度，但是它并不会显示，而且这个插入的标签没有 id 也没有 name，所以也不会跟原来内容中的某些标签的 id 或者 name 产生冲突。不过这里有一点要注意，这里也要判断是否是 IE，然后再决定加不加这段内容，因为其他某些浏览器可能不支持 display: none 这个 CSS 修饰（例如 Opera Mini），如果加上这段代码会影响最终的显示效果。<br/><br/>下面我们来看看如何取出脚本并执行。<br/><br/>取出脚本很容易，只需要用 innerHTML 所在对象的 getElementsByTagName 方法就可以了，这个方法对几乎所有的容器标签都管用。取出脚本以后，我们要一一判断它们是外部脚本还是内部脚本。<br/><br/>先来看外部脚本，如果是外部脚本，我们选择了这样一种方法，即先创建这个外部脚本的一个副本对象，并设置它的 defer 属性为 true（这一点是为了让 IE 浏览器能正确执行），然后用 appendChild 方法将这个副本对象插入到 head 中。这里你可能会问，为什么不是插入到 innerHTML 所在的对象中呢？插入到 innerHTML 所在的对象中不是更好吗？如果你试一下就会知道，如果插入到 innerHTML 所在的对象中，在 IE 浏览器中没有问题，但是在 Mozilla/Firefox 和 Opera 浏览器中会有一些问题。问题是如果在 Firefox 上这样做，浏览器会停止响应（这是在 Firefox 1.5 上的测试结果，其他版本是否有此问题，尚不得知），而在 Opera 上，脚本会莫名其妙的执行两次（这是在 Opera 8.5 上的测试结果，其它版本的 Opera 是否由此问题，也尚不得知）。为了避免这些问题，所以我选择了插入到 head 中。<br/><br/>再来看内部脚本，内部脚本的内容我们可以直接用脚本对象的 text 属性来获取，这里我们使用脚本对象的 text 属性而不是 innerHTML 属性，是因为在 Opera 浏览器中，脚本对象的 innerHTML 属性是空的，只有用 text 属性才能获取到脚本内容。执行内部脚本直接用 eval 即可。但是脚本可能会被包含在 HTML 的注释标签中，因此我们需要先将注释标签去掉，不然在 IE 中会出错。<br/><br/>上面的分析看上去很完美了，但是实际上还是有问题，一个是 document.write 和 document.writeln 的问题，这个问题在 Blueidea 上，bound0 给出了一个思路，就是替换掉默认的 document.write 和 document.writeln 方法，不过他用的是字符串替换，因此只对内部脚本有效，对外部脚本就没办法了，因此我想了个更通用的办法，就是直接把 document.write 和 document.writeln 重新定义，这样不管内部脚本还是外部脚本执行的就都是我们我们自己定义的 document.write 和 document.writeln 了。不过也有副作用，就是这两个函数在当前页面中就不能再像原来一样使用了，不过这两个函数在页面加载完之后一般是不会再用到了，因此这里重新定义它们所带来的副作用影响很小。但是还有个问题是，尽管这样，我们仍然无法保证 document.write 或 document.writeln 输出的内容会显示在最合适的位置，它只是把内容附加到了我们放置内容的容器中。<br/><br/>另一个问题是 eval 引起的问题，一个是 Blueidea 上的 hutia 说的作用域的问题，另一个问题是如果用 eval 执行的内部脚本的话，内部脚本会在外部脚本加载完之前就开始执行了。要解决这个两个问题可以采用 window.setTimeout 这个函数，让每个脚本都延时一段后再执行，外部脚本延时时间可以设的较长，以保证其能够完全加载，而内部脚本则可以设置为很短，因为一个脚本执行的时间通常是很短的，这样既可以保证不会改变作用域，又可以基本保证脚本执行顺序不会改变了（这种方法对于保证执行顺序上也不一定会 100% 有效，如果网络非常繁忙，外部脚本可能在设置的时间内加载不完，但至少比直接用 eval 的时候好多了）。<br/><br/>——————————–<br/>(1) 注：在这里，我们用了限定词“可能”，因为有一种情况，脚本会被执行，在下文中你将会看到这种情况。<br/><br/>如果按照前面的方式实现，对于大多数脚本来说可以正常执行了。但是如果 script 中带有 defer 属性，IE 会自己运行那段代码（前面提过了），因此它会打乱执行的顺序。另外 document.write 和 document.writeln 写入的代码都回被添加到最后面，而不是脚本所在的位置上，因此这也是个问题。 <br/><br/>为了解决这两个问题，我们需要对前面的解决方法作一些改变。首先我们不能先把内容赋值给 innerHTML，然后再通过它取脚本了，我们需要直接对内容分析来取出脚本。另外，脚本以外的 HTML 部分也不能直接赋值给 innerHTML，需要在脚本执行以后，将原有的 HTML 内容和 document.write&#92;writeln 写的内容按照顺序合并到一起再赋值给 innerHTML，这里要注意，我们不能一部分一部分的将这些内容连接到 innerHTML 后面，因为其中可能有半个标签的内容，这种情况下，浏览器很容易发生错误。而且你会看到页面反复刷新的情况出现。而如果先放入缓冲区，最后一次赋给 innerHTML，就不会出现这种问题了。<br/><br/>另外放入缓冲区的好处是，当脚本执行完后，可以检查缓冲区中是否还有新的脚本，如果有，再递归执行，这样就可以解决 document.write 和 document.writeln 写的脚本也可以执行的问题了。<br/><br/>2006-6-4 更新：<br/><br/>修正了插入到 innerHTML 中的脚本无法获取插入到 innerHTML 中对象的问题。（感谢网友 DE 的提醒）。<br/><br/>增加了对同一容器中内容设置的共享锁，使得连续设置同一个容器内的时，不会再发生冲突。（感谢新加坡网友 Jason Li 的提醒）。<br/><br/>2006-5-29 更新：<br/><br/>增加了使用外部脚本缓存功能，提高了第二次加载相同外部脚本的速度。<br/><br/>2006-5-23 更新：<br/><br/>在热心的使用者 johnZEN 的提醒下，增加了共享锁，使得同时设置多个容器内的内容时，不会再发生冲突。<br/><br/>在网友 udbjatwfn 的提醒下，修正了 IE 中存在的内部脚本执行作用域错误的问题。<br/><a href="attachment/1150688221.rar">点击这里下载文件</a><br/>下面是最后本人的实现代码：<br/><div class="code"> <br/>var global_html_pool = &#91;&#93;;<br/>var global_script_pool = &#91;&#93;;<br/>var global_script_src_pool = &#91;&#93;;<br/>var global_lock_pool = &#91;&#93;;<br/>var innerhtml_lock = null;<br/>var document_buffer = &quot;&quot;;<br/> <br/>function set_innerHTML(obj_id, html, time) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (innerhtml_lock == null) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;innerhtml_lock = obj_id;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else if (typeof(time) == &quot;undefined&quot;) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global_lock_pool&#91;obj_id + &quot;_html&quot;&#93; = html;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.setTimeout(&quot;set_innerHTML(&#039;&quot; + obj_id + &quot;&#039;, global_lock_pool&#91;&#039;&quot; + obj_id + &quot;_html&#039;&#93;);&quot;, 10);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else if (innerhtml_lock != obj_id) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global_lock_pool&#91;obj_id + &quot;_html&quot;&#93; = html;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.setTimeout(&quot;set_innerHTML(&#039;&quot; + obj_id + &quot;&#039;, global_lock_pool&#91;&#039;&quot; + obj_id + &quot;_html&#039;&#93;, &quot; + time + &quot;);&quot;, 10);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;function get_script_id() &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &quot;script_&quot; + (new Date()).getTime().toString(36)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+ Math.floor(Math.random() * 100000000).toString(36);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;document_buffer = &quot;&quot;;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;document.write = function (str) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document_buffer += str;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;document.writeln = function (str) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document_buffer += str + &quot;&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;global_html_pool = &#91;&#93;;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;var scripts = &#91;&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;html = html.split(/&lt;&#92;/script&gt;/i);<br/>&nbsp;&nbsp;&nbsp;&nbsp;for (var i = 0; i &lt; html.length; i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global_html_pool&#91;i&#93; = html&#91;i&#93;.replace(/&lt;script&#91;&#92;s&#92;S&#93;*$/ig, &quot;&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scripts&#91;i&#93; = &#123;text: &#039;&#039;, src: &#039;&#039; &#125;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scripts&#91;i&#93;.text = html&#91;i&#93;.substr(global_html_pool&#91;i&#93;.length);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scripts&#91;i&#93;.src = scripts&#91;i&#93;.text.substr(0, scripts&#91;i&#93;.text.indexOf(&#039;&gt;&#039;) + 1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scripts&#91;i&#93;.src = scripts&#91;i&#93;.src.match(/src&#92;s*=&#92;s*(&#92;&quot;(&#91;^&#92;&quot;&#93;*)&#92;&quot;&#124;&#92;&#039;(&#91;^&#92;&#039;&#93;*)&#92;&#039;&#124;(&#91;^&#92;s&#93;*)&#91;&#92;s&gt;&#93;)/i);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (scripts&#91;i&#93;.src) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (scripts&#91;i&#93;.src&#91;2&#93;) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scripts&#91;i&#93;.src = scripts&#91;i&#93;.src&#91;2&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (scripts&#91;i&#93;.src&#91;3&#93;) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scripts&#91;i&#93;.src = scripts&#91;i&#93;.src&#91;3&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (scripts&#91;i&#93;.src&#91;4&#93;) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scripts&#91;i&#93;.src = scripts&#91;i&#93;.src&#91;4&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scripts&#91;i&#93;.src = &quot;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scripts&#91;i&#93;.text = &quot;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scripts&#91;i&#93;.src = &quot;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scripts&#91;i&#93;.text = scripts&#91;i&#93;.text.substr(scripts&#91;i&#93;.text.indexOf(&#039;&gt;&#039;) + 1);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scripts&#91;i&#93;.text = scripts&#91;i&#93;.text.replace(/^&#92;s*&lt;&#92;!--&#92;s*/g, &quot;&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;var s;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if (typeof(time) == &quot;undefined&quot;) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s = 0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s = time;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;var script, add_script, remove_script;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;for (var i = 0; i &lt; scripts.length; i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var add_html = &quot;document_buffer += global_html_pool&#91;&quot; + i + &quot;&#93;;&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_html += &quot;document.getElementById(&#039;&quot; + obj_id + &quot;&#039;).innerHTML = document_buffer;&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;script = document.createElement(&quot;script&quot;);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (scripts&#91;i&#93;.src) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;script.src = scripts&#91;i&#93;.src;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (typeof(global_script_src_pool&#91;script.src&#93;) == &quot;undefined&quot;) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global_script_src_pool&#91;script.src&#93; = true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s += 2000;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s += 10;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;script.text = scripts&#91;i&#93;.text;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s += 10;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;script.defer = true;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;script.type =&nbsp;&nbsp;&quot;text/javascript&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;script.id = get_script_id();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global_script_pool&#91;script.id&#93; = script;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_script = add_html;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_script += &quot;document.getElementsByTagName(&#039;head&#039;).item(0)&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_script += &quot;.appendChild(global_script_pool&#91;&#039;&quot; + script.id + &quot;&#039;&#93;);&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.setTimeout(add_script, s);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove_script = &quot;document.getElementsByTagName(&#039;head&#039;).item(0)&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove_script += &quot;.removeChild(document.getElementById(&#039;&quot; + script.id + &quot;&#039;));&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remove_script += &quot;delete global_script_pool&#91;&#039;&quot; + script.id + &quot;&#039;&#93;;&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;window.setTimeout(remove_script, s + 10000);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/> <br/>&nbsp;&nbsp;&nbsp;&nbsp;var end_script = &quot;if (document_buffer.match(/&lt;&#92;&#92;/script&gt;/i)) &#123;&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end_script += &quot;set_innerHTML(&#039;&quot; + obj_id + &quot;&#039;, document_buffer, &quot; + s + &quot;);&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end_script += &quot;&#125;&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end_script += &quot;else &#123;&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end_script += &quot;document.getElementById(&#039;&quot; + obj_id + &quot;&#039;).innerHTML = document_buffer;&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end_script += &quot;innerhtml_lock = null;&#92;n&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;end_script += &quot;&#125;&quot;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;window.setTimeout(end_script, s);<br/>&#125; </div><br/>不过感觉本人的实现过于笨拙， Ajax Wing: 跨浏览器的设置innerHTML方法 的实现更精辟一些，效果也更好，本人实在是非常的佩服！不过这个实现有一点问题就是脚本中的 document.write 和 document.writeln 缩写的内容位置是不对的。<br/>Tags - <a href="http://zhoujin.com/tags/ajax/" rel="tag">ajax</a> , <a href="http://zhoujin.com/tags/opera/" rel="tag">opera</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/20/</link>
<title><![CDATA[JBOSS jBPM 工作流管理系统简介]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[JBPM]]></category>
<pubDate>Sat, 17 Jun 2006 02:08:36 +0000</pubDate> 
<guid>http://zhoujin.com/post/20/</guid> 
<description>
<![CDATA[ 
	jBPM，全称是Java Business Process Management，是一种基于J2EE的轻量级工作流管理系统。jBPM是公开源代码项目，它使用要遵循 Apache License。jBPM在2004年10月18日，发布了2.0版本，并在同一天加入了JBoss，成为了JBoss企业中间件平台的一个组成部分，它的名称也改成JBoss jBPM。随着jBPM加入JBoss组织，jBPM也将进入一个全新的发展时代，它的前景是十分光明的。 <br/><br/>jBPM最大的特色就是它的商务逻辑定义没有采用目前的一些规范，如WfMC´s XPDL, BPML, ebXML, BPEL4WS等，而是采用了它自己定义的JBoss jBPM Process definition language (jPdl)。jPdl认为一个商务流程可以被看作是一个UML状态图。jPdl就是详细定义了这个状态图的每个部分，如起始、结束状态，状态之间的转换等。 <br/><br/>jBPM的另一个特色是它使用Hibernate来管理它的数据库。Hibernate是目前Java领域最好的一种数据持久层解决方案。通过Hibernate，jBPM将数据的管理职能分离出去，自己专注于商务逻辑的处理。 <br/><br/>使用jBPM开发工作流的一般流程如下： <br/><br/>1) jBPM的运行需要数据库的支持，因此系统设计时要选定所用数据库。只要是Hibernate支持的数据库，jBPM就支持。数据库的初始化可以由jBPM自动完成，也可以通过ant generate.ddl任务生成SQL语句，在jBPM外部自己创建所需的表。 <br/><br/>2) 使用jPdl定义工作流，生成processdinination.xml文件。可以采用GUI工具gpdl，但目前只支持jBPM1.0，而且bug很多。XML的DTD定义文件在jBPM下载包中。 <br/><br/>3) Ant create.pde生成pde包的工作目录。将processdinination.xml文件和其它需要的文件放在指定的目录下，使用ant build.precess.archives生成pde包。pde包的格式采用jar。 <br/><br/>4) 更改pde工作目录/src/config/jbpm.properties的相关属性，主要是设定相关的数据库连接信息。注意要将数据库的JDBC驱动放在pde工作目录的lib目录下。 <br/><br/>5) Ant deploy.process.archives将刚才生成的pde部署到数据库。实际上就是向数据库插入一些相关数据。 <br/><br/>6) 利用jBPM API函数开发相应的工作流程。<br/>Tags - <a href="http://zhoujin.com/tags/jbpm/" rel="tag">jbpm</a> , <a href="http://zhoujin.com/tags/%25E5%25B7%25A5%25E4%25BD%259C%25E6%25B5%2581/" rel="tag">工作流</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/15/</link>
<title><![CDATA[监狱问题?]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Sun, 28 May 2006 17:23:12 +0000</pubDate> 
<guid>http://zhoujin.com/post/15/</guid> 
<description>
<![CDATA[ 
	一个监狱长把所有囚徒招来，对他们说，<br/><br/>1。这次会议结束之后，你们将被隔离，互相之间再也不能交流任何信息，除了2。<br/>2。你们唯一可以交流信息的是我桌子上的一枚硬币。因为我会经常的随机的叫你们中的一个到我的办公桌来。被叫来的人可以决定硬币哪面朝上，然后离开。接着我会叫下一个。<br/>3。硬币的初始面由我来定。我也可以改变它在桌子上的位置。自从你们中的第一个人被叫进来，我便不会再翻硬币了。<br/>4。如果有一天你们中的一个声称所有人都曾经被单独叫到我的办公室。如果说对了，你们就都被释放，如果说错了，你们就都将被处决。<br/>5。现在给你们10分钟时间。<br/><br/>注意：除了硬币的正反面朝上，没有其他信息。也就是信息只有一位二进制。另外初始状态是不知道的。<br/><br/>请给出一个安全的策略，让这些囚犯有机会被全部释放，而被处决的可能为0。<br/>Tags - <a href="http://zhoujin.com/tags/%25E4%25BA%258C%25E8%25BF%259B%25E5%2588%25B6/" rel="tag">二进制</a> , <a href="http://zhoujin.com/tags/%25E5%25AE%2589%25E5%2585%25A8/" rel="tag">安全</a> , <a href="http://zhoujin.com/tags/%25E7%25AD%2596%25E7%2595%25A5/" rel="tag">策略</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/14/</link>
<title><![CDATA[虚拟世界，真诚相待]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Sun, 28 May 2006 17:05:38 +0000</pubDate> 
<guid>http://zhoujin.com/post/14/</guid> 
<description>
<![CDATA[ 
	总有那么一群人每天都在这充满虚幻的世界里游荡着，他们或许是想在这里寻找一种希望一种寄托，将美好的希望寄托于这虚幻的世界中来。<br/><br/> &nbsp;当网络已成为生活时，生活在现实中的我们也禁不住它的诱惑一脚踏进了深渊…….. <br/><br/> &nbsp;网络、聊天、QQ逐渐变为一种伴随人们生活的东西，让一群人感到惊奇，让另一群人开始陷入沉思，人们好奇进入这张网中，以不同的方式去触摸它游戏它，并尽力审视自己的位置，可不久发现自己好像迷路了，于是人们开始叹息：原来网络是虚拟的。想找到来时的路往回走，人们在回家的路上冥冥苦思，这时才发现：哦！原来网络也需要真诚！于是人们相信：心灵深处存在着一种最原始的色彩，如生命的本质一样单纯而透明！ <br/><br/> &nbsp;当网恋已成为时尚时，一天到晚在网上徘徊的人也不禁成了他的俘虏 ，当见网友已风靡网林时，有的人却不敢去触摸这张已成为他们生活一部分的网。因为他们怕它会在那刹那间支离破碎 ，或许现实中的他们和网络中的他们是有根本的区别。在网上他们可以畅所欲言，可在现实中却是沉默寡言。 <br/> &nbsp;<br/> &nbsp;在网上他们可以张至狂野，而在现实中他们只是一个野蛮落寂 。在网上他们可以出类拔萃，而在现实中他们可能是默默无闻 。<br/> <br/> &nbsp;这就是一个徘徊在网络和现实之间的痴人 ，在繁华的网络背后只是一颗空虚的心灵，不知道该怎么去拯救自己 ，但心灵深处却有个声音在说不要 ………. <br/><br/> &nbsp;其实网络亦真亦幻，网虫们在自编自演悲欢离合的故事，雾里看花.水中望月成了聊天的一道亮丽风景线，愿大喜大悲的朋友多一份冷静！相信：海内存知己.天涯若比邻！<br/><br/> &nbsp;曾有人说过这样的一句话：未曾谋面的神秘在诱惑，一见钟情的机会在招手。<br/><br/> &nbsp;网络本身只是一个媒介，而以它为平台衍生出来种种故事无论是悲是喜，都非网络之过。网络给我们许多快乐的同时也给我们许多的悲伤。在网上有假也有真，只是需要你用自己的眼睛去看这一切，当你看到真时网络也许就全部是真的，看到假时也许网络就全部是假的，但事实是真假都有。其实从某种程度上来说网络中的生活与真实的生活是一样的。这个社会上有什么样的人，网络中同样也存在。至于他们的心有没有虚拟。我想是和网络是真是假的问题可作出一样的回答。<br/><br/> &nbsp;网络世界在许多人心中已经变成了一个发泄、空虚 、失意的地方， 大多的人们已经在心里给它下了错误的定位，于是刻意和不刻意的欺骗就这样发生，谁相信网络就会被看成幼稚。<br/><br/> &nbsp;让我们在虚拟的世界里真诚交往，不要再去刻意的欺骗刻意的怀疑，让这里成为心灵的休息地，不要将这里变成欺诈的角斗场！ &nbsp;<br/><br/> &nbsp; 网络需要你我的真诚!<br/>Tags - <a href="http://zhoujin.com/tags/%25E8%2599%259A%25E6%258B%259F/" rel="tag">虚拟</a> , <a href="http://zhoujin.com/tags/%25E4%25B8%2596%25E7%2595%258C/" rel="tag">世界</a> , <a href="http://zhoujin.com/tags/%25E7%259C%259F%25E8%25AF%259A/" rel="tag">真诚</a> , <a href="http://zhoujin.com/tags/%25E7%259B%25B8%25E5%25BE%2585/" rel="tag">相待</a> , <a href="http://zhoujin.com/tags/qq/" rel="tag">qq</a> , <a href="http://zhoujin.com/tags/%25E8%2581%258A%25E5%25A4%25A9/" rel="tag">聊天</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/13/</link>
<title><![CDATA[[转]如果你觉得你的域名长请看看下面四个网站]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Tue, 23 May 2006 07:11:58 +0000</pubDate> 
<guid>http://zhoujin.com/post/13/</guid> 
<description>
<![CDATA[ 
	这么长的域名，算是开了眼了。<br/><br/>第一个 <br/><a href="http://www.llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch.co.uk/" target="_blank">http://www.llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch.co.uk/</a> <br/><br/>这个域名属于一个旨在宣传英国圭内斯郡安格尔西的一个同名村庄，这个名字的意思是“位于急流附近白榛树山谷中的圣玛丽亚教堂和红山洞附近的圣泰西里奥教堂。” <br/><br/>第二个 <br/><a href="http://www.111111111111111111111111111111111111111111111111111111111111.com/" target="_blank">http://www.111111111111111111111111111111111111111111111111111111111111.com/</a> <br/><br/>这个域名是由60个1组成的，国外都简称60x1，很有名气的。打开后是一张非常花哨和夸张的图片，有代表美国文化的可口可乐、麦当劳、美国番茄酱、美钞等，哦，还有被ps的布什头像。看了大概意思应该是一个anti-us的网站，图像创意非常棒，设计也不错，就是太占资源了，5分钟都没有下载完页面内容，首页最下方有一个不起眼的"Enter"，点击进入可以看见满屏的萨达姆和拉登的小图片，找地方再点吧，还能看见被丑恶化的布什和麦加万岁这样的主题图片，看了挺爽。<br/><br/>第三个 <br/><a href="http://3.141592653589793238462643383279502884197169399375105820974944592.com/" target="_blank">http://3.141592653589793238462643383279502884197169399375105820974944592.com/</a> <br/><br/>你应该知道该网站的内容了吧，的确是，此网站只有一个页面，打开后慢慢等，然后你就能看见精确到小数点100万位的圆周率，谁要是没事干想背圆周率，推荐上去看看。 <br/><br/>第四个 <br/><a href="http://www.thelongestdomainnameintheworldandthensomeandthensomemoreandmore.com/" target="_blank">http://www.thelongestdomainnameintheworldandthensomeandthensomemoreandmore.com/</a> <br/><br/>一共63位，这是目前全球公认的最长的域名了，网站的站长已经向吉尼斯世界纪录申请了世界最长的域名，可惜被吉尼斯给婉言拒绝了，大致原因是认为这就像无法申请世界最长的数字一样。<br/>Tags - <a href="http://zhoujin.com/tags/%25E5%259F%259F%25E5%2590%258D/" rel="tag">域名</a> , <a href="http://zhoujin.com/tags/%25E5%25B8%2583%25E4%25BB%2580/" rel="tag">布什</a> , <a href="http://zhoujin.com/tags/%25E5%258F%25AF%25E5%258F%25A3%25E5%258F%25AF%25E4%25B9%2590/" rel="tag">可口可乐</a> , <a href="http://zhoujin.com/tags/%25E9%25BA%25A6%25E5%25BD%2593%25E5%258A%25B3/" rel="tag">麦当劳</a> , <a href="http://zhoujin.com/tags/%25E7%25BE%258E%25E5%259B%25BD/" rel="tag">美国</a> , <a href="http://zhoujin.com/tags/%25E7%2595%25AA%25E8%258C%2584%25E9%2585%25B1/" rel="tag">番茄酱</a> , <a href="http://zhoujin.com/tags/%25E9%25BA%25A6%25E5%258A%25A0/" rel="tag">麦加</a> , <a href="http://zhoujin.com/tags/%25E8%2590%25A8%25E8%25BE%25BE%25E5%25A7%2586/" rel="tag">萨达姆</a> , <a href="http://zhoujin.com/tags/%25E6%258B%2589%25E7%2599%25BB/" rel="tag">拉登</a> , <a href="http://zhoujin.com/tags/%25E5%259C%2586%25E5%2591%25A8%25E7%258E%2587/" rel="tag">圆周率</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/12/</link>
<title><![CDATA[男生的爱一辈子只会付出一次]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Mon, 22 May 2006 09:28:21 +0000</pubDate> 
<guid>http://zhoujin.com/post/12/</guid> 
<description>
<![CDATA[ 
	男生的爱只有一次，每一个男生都是这样，他可以对每个女生说“我爱你”，但他一辈子<br/>只会爱上一个人，只有一个。女生需要的是一个关怀她，爱她，可以让她依靠，保护她的<br/>人，当她遇到一个男生时，爱的死去活来，山盟海誓。<br/><br/>然后因为种种原因的分开，她不会再记得他，或者说不会记得那么深刻。因为当她遇到一<br/>个更好的男生时，她会拿两个人来比较，她会觉得遇到更好的是她的幸运。<br/><br/>但男生不是这样，当他爱上一个女生，真真正正的爱，他不会再爱上任何一个人。<br/><br/>当这段感情失败后，他会把这段记忆放在心里，把这个女生放在心底。原来一个男生可以<br/>把很多女生放在心里，但一辈子只有一个女生可以在他心底。无论他以后会跟再多的女生<br/>相处，他都会清楚的知道，自己最爱的是谁。无论以后他遇到的女生多么优秀，他也不会<br/>改变。<br/><br/>因为他心底的女生是他的支柱，他不会用她和任何一个人相比，他认为这种比较是愚蠢的<br/>，他一辈子只会爱她一个。放在心底的女生，永远的伤痕。男生都是爱面子的，也许他平<br/>时会活的很潇洒，但在一个人孤独的时候，他会放下所有的尊严，放声痛哭，思念唯一的<br/>她。<br/><br/>男生的爱一辈子只会付出一次。<br/>Tags - <a href="http://zhoujin.com/tags/%25E7%2594%25B7%25E4%25BA%25BA/" rel="tag">男人</a> , <a href="http://zhoujin.com/tags/%25E5%25A5%25B3%25E4%25BA%25BA/" rel="tag">女人</a> , <a href="http://zhoujin.com/tags/%25E7%2588%25B1/" rel="tag">爱</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/11/</link>
<title><![CDATA[笔帘留香]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Tue, 09 May 2006 08:25:48 +0000</pubDate> 
<guid>http://zhoujin.com/post/11/</guid> 
<description>
<![CDATA[ 
	　　自从文，便倾心于散文字里行间的八百里烟波。 <br/>　　良久以来，无数骚人墨客，文者雅士独爱一壶清茗，几缕淡香，或抚琴吟唱、或把酒言欢，或墨笔疾书、或素笺细语，成就散文精品无数。 <br/>　　今夜，恰逢月白风清，却孤于竹窗疏影，思绪难平。遂不自量力，敞扉秉烛相迎，邀有缘人入室而坐，细细品点奉案上的每道清香，共话长短。 <br/><br/>　　1、 禅喻 <br/><br/>　　禅，是平常心，是人心深处的本性柔软，支配人的感性，触发人的理性，生活处处皆禅思。将禅思用于文中，便需突出“境界”二字。 <br/>　　有境界则高，无境界则低。有境界之散文，或寥寥几语，尽述心事，言词精悍，与现代诗歌相得益彰；或洋洋洒洒，以物含喻，凝铸深意，唯有静心细品，方能领悟。 <br/>　　禅理散文中，言词大多凝炼，与文之情调相谐，美得平静且质深，堪可玩味，自古便有诸多佛经诗谒达到了“文章意境足千秋”的韵味，很多文人墨客的生花笔也能让人领略到禅。“一花一世界，一叶一菩提”，众人皆向往美好人生，渴求世间真情真爱，不如先打开心窗容纳世间万物的美好，用滋润柔软的心来面对浮燥红尘。唯有保持干净单纯之心，悟通人生情爱真谛，提升自己积极向上的生命品质，方能行于文字，而淡出于文字。只要有心有情有意有爱，“身在万物中，心在万物上”，心中那朵花和所有花中的世界，便会闪烁一只永远温柔不闭的眼；一片叶和所有叶片的般若，便会包纳着一颗永远清澈不变的心。 <br/><br/>　　2、 古韵 <br/><br/>　　品古韵十足之文章，需明月清风，素茶淡酒，方得满口余香。<br/>　　古文有种极致的风韵，若把它融于散文，便可称作古典之雅。也许古典离人们过于遥远，以至寻找不到，但在散文里，它只是一种细腻、柔和以及和谐。这种和谐让人走进去，被各种膨胀的欲望经久烧烤的心灵稍稍平静下来，将那扇早已锈迹斑驳的心灵之门重新擦亮，并且彻底打开。<br/>　　“清丽”、“典雅”为古韵文章之特点，文字细腻、婉转，文笔别拘一格，行云流水般的行文常令读者产生怀古的遐想。如若在文中适当引诗援典，遣词造句运用大量的文言词语，并以错落有致的长短相间的句式以及排比、对句等的切当穿插，既表现出白话文的流畅、明晰，又有文言文的洗炼、华美的语言，隽永的笔调，定会令人回味无穷。<br/>　　当然，古典散文并非文白相加，首先忌文中断句过多，且未做到笔断意连，自会影响文章整体意境。散文的结构行文，讲求自然天成无迹可求，妙在似无意实有意之间，看似支离散漫，实则浑然一体。散文要“散”得起来，除了选材要有技巧之外，还要在叙写上注意断续的技巧，明于断续，才能使散文的行文上挥洒自如。其次忌文思过于跳跃，令人读时有云里雾里之感。唯有不断加深古典文学修养，把古典文学中的辞章、语汇吸收融化，注入到现代语言中去，做到既凝练明快，又清新婉丽，真正给人以如诗似画的美感。 <br/><br/>　　3、渲墨<br/><br/>　　“文读百遍，其义自现”。有些文章唯有静心细读，才能领悟文中情理。 <br/>　　一篇关于写作的评论文章中，作者用敏锐的文学视角，尖锐犀利的笔锋，一语道破文章“真不在词而在意”，批评“文章如讲机巧，牵强附会，累叠而成，再无气势无意境可言”， 提倡从平凡生活、平凡字词中酿选意味深长的作品，认为“文笔净，爱恨明，道理清。文章可读焉。”文章落笔干净利落，叙述铿锵有力，条理错综有致，具有较高的可读性、可思性。 <br/>　　诚然，多数人写作擅于把玩韵味，主题狭窄，表现手法陈旧单一，阴柔之气有余，大气、崇高、富有思想含量的作品不足。但人生如酒自斟酌，文章似茶随调和。文之好坏，如登高远眺，然，风景怡然。文冗长也罢，简单也好，在于是否引起读者共鸣。或许写者只想借文字表达一种喜悦、激情、刺痛、震动或是晕旋情绪，我们大可不必要求他赋予文字多么高的使命。 <br/>　　写作在于不断地学习和积累，通过观察体味人生百态，沉淀深厚扎实的生活素材，将所思所想真切地融入文字，直指人心；让个性的灵气渗透骨干，启迪良知，诱人向往纯净的精神彼岸。相信不会多久，便可成就妙文佳构。 <br/>　　　　　　　　　　　　　　　　 <br/>　　4、 暗香 <br/><br/>　　文学的艺术是语言的艺术，散文的诗意也有赖于语言的诗意。字间飘香的文章不会只停在观念层面上写作，常常似景喻情，借物抒感，通篇透出灵性，让读者开篇便能闻到其香。 <br/>　　有些作者喜欢亲近自然，感悟自然，剖解自然，皈依自然，故此自然风光、风俗人情在其笔下各呈风貌。同时作者还善于在山水游迹中发现生活的美，发觉生命的真谛，启人生之理于自然之景，在引读者领略山川风光，尽赏花鸟水石时，不动声色的将朴实无华而又真切的领悟“潜移默化”地输入读者的思维，因此这样的散文有诗一样的意境和美。　 <br/>　　如对虚拟景物或现象进行描写时，不妨从现有情节入手，用疏朗的笔致，醇厚的情味，清新自然的文风，营造出诗情画意水乳交融的优美意境，让人仿佛看见月初升映透万籁琼宇，风乍起吹邹一池春水，从而调动广大读者的想像。 <br/>　　总之，散文的诗意是散文一种美丽的景致，哪怕“零落成泥辗作尘”，依然“香如故”。这才是我们真正要追求的意境。 <br/><br/>　　5、 意趣 <br/><br/>　　散文是一种“说话”艺术，似对一个知心挚友，娓娓倾诉、剖析自己的灵魂，行文随意自如，构思亦可不拘一格。所谓的随手拈来，信笔挥去，心有所悟，笔随意走，无须杜撰。一切所思所悟所感皆从心底自由自在地流淌出来。意趣类小品文取材广泛，为人所喜闻乐见，津津乐道。写作中主要注重细节魅力，是否做成色香味俱佳的佳肴，技巧全在火候。<br/>　　我总认为绮丽、豪放、简练、淡远这四种风格比较起来，淡远最难求，平淡的文章不容易写好，因为淡还必须有味。部分文章描述的亲情、家庭等日常琐事，记人叙事文字平谈，不矫情、不文过饰非，像是午后喝茶忆旧，给人一种亲近，踏实的感觉；有些文章满篇清新，好似朋友之间的一场面对面的促膝长谈，低声细语，闲散来去，实乃真趣。 <br/><br/>　　6、唯美 <br/><br/>　　散文假若运用散漫慵懒，缺少华采的语言，既难生成艺术的感染力，也难表达丰富的内涵而达致精美的形式。语言不仅是散文的载体，也是散文的本体。全部语言所传达的是散文的精神韵致，也是散文美学形式的表现。 <br/>　　散文的唯美，主要是靠丰富的想象和耐人寻味的意境，再配从容优雅的笔调，“满蓄着温柔、微带着忧愁”的色彩和委婉含蓄的手法，仿佛面对件件精致的手工艺品，让人禁不住的一再迷恋起汉语。功力深厚者还可一方面着力于内在情感律动的独特创造，另一方面注意外在语言音韵的匠心营构，使散文句句铿锵、音象俱足，令读者获得视觉和听觉上的双重愉悦。 <br/>　　翻读过几篇反响较好的文章，同是风花雪月，或哀婉凄清、或温情脉脉、或清丽典雅、或富于哲理和抒情韵味，却因不同作者的感受，铸就了不同的境界：有的因之喜，有的因之悲，有的因之叹。文章不刻意追求深刻，无论是素材、剪裁，还是组织，都很得体，淡雅而有韵味，抒情而又含蓄。同时不否认，唯美作品有它不可避免的缺陷，即词藻过于华丽、堆彻，飘渺而没有实在意义。<br/>　　然笔者认为，美的散文就是一幅美的画，散文的美在于它的散、它的自由自在、它的不受拘束、它的飘逸。散文的浪漫可能是飘渺的，而这飘渺却因为不顾及世俗而动人，散文的浪漫可能是虚幻的，但这虚幻却因没有框架而唯美。恰恰是这种特质的唯美，成就了散文的浪漫和魅力。 <br/><br/>　　7、感性 <br/><br/>　　散文是有感性的。什么是感性？就是在假定的某一情节中，作者心灵的感受与感想，身心体验感受到的情感，我们称为“感性”。 <br/>　　感性的散文是语言的艺术，结构的艺术，凸现个人意志趣味倾向的艺术，它的内容和形式自由宽阔，容许作者直抒胸臆，较直接地披露个人主观世界，所以它和诗歌一样，字里行间，包含着作者的情感，唯其如此，才能扣人心弦。有些文章尽管没有如大海般壮阔，长江般奔涌的情感描写，其蕴涵的情思万缕却如山间溪流汩汩淙淙，给读者带来一种细泉似的脉脉温情。 <br/>　　有人说散文不需塑造人物性格，不需讲述完整故事，不需编造起伏跌宕的情节，它比小说容易写。的确，感性文章大凡以抒情见长，惯于对片段或是某一情节进行压缩式的概括描写，不象小说有具体、眉目清晰的细节描写。但写作者仍需挣脱个性上的桎梏，做到在文字中从容飘荡，任意东西，找回生活的本来灵性，用独特语言表现独特的思想，感受和想象，然后在绵绵密密的抒情里，轻巧地插入一些心理描绘、人物刻画或是哲理思索，才会使作品产生独特的魅力。<br/><br/>　　8、哲思 <br/><br/>　　饱含哲理耐人寻味的散文方为精品，皆说，文道即人道，文心即人心，文心可以雕龙。意思是，我们可以在文章里看见一个人的心，这种文章，大雅若俗。针头线脑，婚丧情私，风俗物事，酸甜苦辣，五味皆全，不施藻饰，不加雕琢，皆如实闲扯下来。或许文中没有叫人仰止的大思想，没有叫人拍案的绝笔，更没有过于鲜明生动的语言和优美流畅的叙事文字，文中透出的哲思皆得自生活中一缕感触，几丝回想或是些许思索，但它的深度，在于每一处笔墨，每一句言语，读见其人心。<br/>　　当然，我们都盼望欣赏到更高层次的美文，不仅能给我们带来思想上的启迪，心灵上的净化，同样给予美感上的享受，它们能够经历时空变化和岁月冲刷，依然常新于读者心中。<br/>Tags - <a href="http://zhoujin.com/tags/%25E7%25A6%2585/" rel="tag">禅</a> , <a href="http://zhoujin.com/tags/%25E5%2596%25BB/" rel="tag">喻</a> , <a href="http://zhoujin.com/tags/%25E6%25B8%25B2/" rel="tag">渲</a> , <a href="http://zhoujin.com/tags/%25E5%25A2%25A8/" rel="tag">墨</a> , <a href="http://zhoujin.com/tags/%25E5%258F%25A4/" rel="tag">古</a> , <a href="http://zhoujin.com/tags/%25E9%259F%25B5/" rel="tag">韵</a> , <a href="http://zhoujin.com/tags/%25E6%259A%2597/" rel="tag">暗</a> , <a href="http://zhoujin.com/tags/%25E9%25A6%2599/" rel="tag">香</a> , <a href="http://zhoujin.com/tags/%25E6%2584%258F/" rel="tag">意</a> , <a href="http://zhoujin.com/tags/%25E8%25B6%25A3/" rel="tag">趣</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/10/</link>
<title><![CDATA[人生最重大的忠告：男人和女人(哈经典)]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Thu, 20 Apr 2006 09:40:56 +0000</pubDate> 
<guid>http://zhoujin.com/post/10/</guid> 
<description>
<![CDATA[ 
	一、送给女人<br/> &nbsp; &nbsp;工作计划与男友约会档期冲突，取前者……前者不会辜负你，而且越老越不会，除非你目前的工作是当三陪小姐。<br/> &nbsp; &nbsp;只有小女孩才会用吸烟、夜游、多交男友表示成熟，你就不必了。<br/> &nbsp; &nbsp;最好不要让初次约会的男人知道你住所，若对方坚持送，那么到楼下即可……相信我，他不“顺便上去喝杯茶”也不会渴死。<br/> &nbsp; &nbsp; 若连续六个月每月置衫超过十件，考虑买房。<br/> &nbsp; &nbsp; 酒吧里认识的男人就不必留电话了。<br/> &nbsp; &nbsp; 如果没车，不要买白皮鞋。<br/><br/> &nbsp; &nbsp; 若不幸你爱的男人有另一个女人，请不要留恋，随时离开!<br/> &nbsp; &nbsp; &nbsp; 男人对自己的好色就象律师对罪犯：明知有罪也要辩护……你知道就是啦。即使你美若天仙，也要讲道理。<br/> &nbsp; &nbsp; 爱你的工作，但不要爱你的老板。<br/> &nbsp; &nbsp; 浪漫是一袭美丽的晚礼服，但你不能一天到晚都穿着它。<br/> &nbsp; &nbsp; 嫁大款就象抢银行，收益总很大，但后患无穷，若能不试，还是不试为好。<br/> &nbsp; &nbsp; 不要逼男人撒谎，他会恨你。也不要把他的话当真，你会恨他。<br/> &nbsp; &nbsp; 再爱他，也不必为他去隆胸。<br/>二、送给男人<br/> &nbsp; &nbsp;对女朋友要忠诚。如果没有女朋友，不如去打网球，一样可以消磨体力。<br/> &nbsp; &nbsp;太太一定要娶温柔的。<br/> &nbsp; &nbsp;如果你的女朋友的老公是律师、医生、经济人、出版商、电脑高手……不妨请他给自己参考买搂、保险、投资、出书、装软件……但记得每次把你老婆也带上同往。<br/> &nbsp; &nbsp;诚实是一种美德，不必因此就随和女朋友抨击她的老公，或跟同事一起讨伐老板。<br/> &nbsp; &nbsp;在床上超强持久并不是爱她的最好方式，要多给她关心。所谓绅士，就是会用双肘和膝部支撑自己体重的男人。为了避免日后的麻烦，只用最好的安全套。<br/>三、送给所有人<br/> &nbsp; &nbsp;视爱情为奢侈品：有最好，没有也能活。<br/> &nbsp; &nbsp;签任何合同之前至少看三遍……如果是婚约，更要仔细掂量。<br/> &nbsp; &nbsp;随缘，但不是说不努力。为了你的身心健康可养一只宠物，为了宠物的身心健康，就不要养了……据说它们太孤独了也会得忧郁症。<br/> &nbsp; &nbsp;每天吃维生素丸，坚持补钙，否则在浴缸里面一跤摔断腿，即使你能爬出来打急救电话并在医生赶来之前披上衣服，恐怕也得在床上躺3月，一个夏天不能**。<br/> &nbsp; &nbsp;人越少则冰箱越要大，精神空虚可用食物填充。若打开冰箱没有食物，可鼓励你努力工作。食物尽量选择高蛋白、多纤维、低脂肪、少热量的，少食多餐。<br/> &nbsp; &nbsp;要买保险。<br/> &nbsp; &nbsp;在办公室里备一件厚外套，一把伞。<br/> &nbsp; &nbsp;同事的恭维就象香水，可以闻闻，但不要喝。<br/> &nbsp; &nbsp;永远不要问这个问题：“为什么不爱我？”<br/> &nbsp; &nbsp;不要预先说出决心。<br/> &nbsp; &nbsp;没有任何事任何人，会重要到需要你过了半夜12点还苦想不睡。<br/> &nbsp; &nbsp;若没有五位数出场费，不要参加“非常男女”之类的电视节目。<br/> &nbsp; &nbsp;真诚地微笑，别怕皱纹。<br/> &nbsp; &nbsp;元宵节、中秋节、情人节若无节目可主动要求加班……免得出门触景生情或回家独自神伤，而且可以给老板一个好印象。<br/> &nbsp; &nbsp;以前的恋人打电话来问你最近好不好……要说好。<br/> &nbsp; &nbsp;过去，童话故事是以“很久很久以前……”开头的，现在，童话故事是以“如果我还没有结婚……”开头的，<br/> &nbsp; &nbsp;记住你已经过了听童话的年龄了。<br/> &nbsp; &nbsp;学会做几个好菜。周末给自己炖汤。<br/> &nbsp; &nbsp;任何时候都不要喝多，头天晚上吐的东西次日早上还要自己收拾，你会因此吐第二次的。<br/> &nbsp; &nbsp;抽屉里放好必备药品。家里的安眠药不要超过10粒。<br/> &nbsp; &nbsp;想的时候，想想再说。不想的时候，说不。<br/> &nbsp; &nbsp;多赚点钱，但不要多到谁看上你你都要疑心的地步。<br/> &nbsp; &nbsp;有望得到的要努力，无望得到的不介意，这样无论输赢，姿态都会好看。<br/> &nbsp; &nbsp;其实，人生即使有伴也是寂寞的……不如及早培养兴趣，比如中年之后种花养鱼。<br/> &nbsp; &nbsp;有人称赞你年轻，还是应该高兴的。<br/> &nbsp; &nbsp;恋爱就象玩麻将，不认真没乐趣，太认真易伤心……培养点游戏精神。<br/> &nbsp; &nbsp;与任何人，在任何情况下，都不拍欢爱的镜头。<br/> &nbsp; &nbsp;真喜欢一样东西，就买吧。<br/> &nbsp; &nbsp;曾经背叛过你的情人，想要回头，说不。你曾经背叛的情人，请你回头，说不。<br/> &nbsp; &nbsp;答应请求时面带微笑，说不的时候清晰肯定。<br/> &nbsp; &nbsp;保持青春的秘诀，是有一颗不安份的心。<br/> &nbsp; &nbsp;无论蕾丝内衣还是工作报告，简洁都是最好的。<br/> &nbsp; &nbsp;对于一个错误的诺言，你要有勇气违背它。<br/> &nbsp; &nbsp;大事坚持原则，小事学会变通。<br/> &nbsp; &nbsp;任何东西都不能以健康做交换。<br/> &nbsp; &nbsp;一个人是否可靠，全看你用什么样的手段控制他。<br/> &nbsp; &nbsp;一切都不需争论，只需给出结果。<br/> &nbsp; &nbsp;男人总是向不把他放在眼里的女人献殷勤……命运也是。<br/> &nbsp; &nbsp;不要借钱，若一定要借，借银行。不要借给人钱，若一定要借，别打算他还。<br/> &nbsp; &nbsp;学着理财，即使你学的是考古或小提琴。<br/> &nbsp; &nbsp;如果你花心，千万别用恋人的生日做密码……常常换，很烦的。<br/> &nbsp; &nbsp;太在意一个人往往得不到……钱也一样。<br/> &nbsp; &nbsp;床头放一本好书。<br/> &nbsp; &nbsp;每天笑笑对身体好……如果经常有人给你讲笑话，你是很幸运的。<br/> &nbsp; &nbsp;找一项有兴趣的体育活动，坚持下去。<br/> &nbsp; &nbsp;心情失落时不要淋雨，不要听慢歌，不要看悲情电影，不要泡在浴缸里喝红酒。<br/> &nbsp; &nbsp;不要常常计算得失……那是保险公司和你的对手的事。<br/> &nbsp; &nbsp;遇到让你心动的人，不妨喜欢一次。<br/> &nbsp; &nbsp;工作之余，尽量在室外活动。<br/> &nbsp; &nbsp;不要在想让你哭的人面前哭。<br/> &nbsp; &nbsp;老而弥纯是可耻的。<br/> &nbsp; &nbsp;每年做身体检查，了解自己的健康状况。<br/> &nbsp; &nbsp;钥匙一定要在父母或好友家存一套。<br/> &nbsp; &nbsp;如果你的房间越来越雪白素净，访客越来越少，桌面地板不允许有一丝灰尘，听到孩子的吵闹会心烦，每天洗手超过20次……快去看心理医生。<br/> &nbsp; &nbsp;即使你真的不喜欢小孩，也不要说出来。<br/> &nbsp; &nbsp;私人朋友不要常到办公场所找你。<br/> &nbsp; &nbsp;不必好奇别人怎样评价你，想想你是怎样评价他的。<br/> &nbsp; &nbsp;你看，男人从不开口向人请教如何才能让婚姻和事业两全其美的问题。<br/> &nbsp; &nbsp;简单地说，常常让你微笑的人就是好人。<br/> &nbsp; &nbsp;别和道德观和你不同的人有私交。<br/> &nbsp; &nbsp;若再不开始孝敬父母就太迟了!!<br/> &nbsp; &nbsp;尊严如同胸衣，把女人托的很高贵，但若故意显露，则流于粗俗。<br/> &nbsp; &nbsp;你看上去有多大，其实就多大。<br/> &nbsp; &nbsp;不要迷恋包装绚丽的东西。<br/> &nbsp; &nbsp;一个人，从出生到18岁，需要好的家庭。18岁到35岁，需要好的外表。35岁到55岁，需要好的个性。55岁以后，需要好多钱。<br/> &nbsp; &nbsp;当然应该等待那个对的人最终出现……但在漫长的等待中，你也可以先和不对的人聊聊天。<br/> &nbsp; &nbsp;要快乐!<br/> &nbsp; &nbsp; 要记住你只能活一辈子。<br/>Tags - <a href="http://zhoujin.com/tags/%25E4%25BA%25BA%25E7%2594%259F/" rel="tag">人生</a> , <a href="http://zhoujin.com/tags/%25E5%25BF%25A0%25E5%2591%258A/" rel="tag">忠告</a> , <a href="http://zhoujin.com/tags/%25E7%2594%25B7%25E4%25BA%25BA/" rel="tag">男人</a> , <a href="http://zhoujin.com/tags/%25E5%25A5%25B3%25E4%25BA%25BA/" rel="tag">女人</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/9/</link>
<title><![CDATA[用于Java SE的Hibernate]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[HIBERNATE]]></category>
<pubDate>Tue, 18 Apr 2006 00:31:28 +0000</pubDate> 
<guid>http://zhoujin.com/post/9/</guid> 
<description>
<![CDATA[ 
	　　如今，Hibernate正在迅速成为非常流行的（如果不是最流行的）J2EE O/R映射程序/数据集成框架。它为开发人员提供了处理企业中的关系数据库的整洁、简明且强大的工具。但如果外部需要访问这些已被包装在J2EE Web应用程序中的实体又该怎么办？是开发独立但相同的实体来访问数据，还是另外编写Web组件来管理内部访问的数据？<br/><br/>　　在某种程度上，这些问题是一定会发生的，对于我来说，当我的公司要向数据库中加载来自多个供应商的多种文件格式的记录时，就出现了这些问题。我考虑过以前常用的方法：用shell和SQL脚本（甚至存储过程）来加载数据。但由于数据模型过于复杂，我决定尽量利用现有的实体、Spring DAO以及Web应用程序之外的服务，并开发定制的J2SE命令行数据加载程序。 <br/><br/>　　如今，Hibernate正在迅速成为非常流行的（如果不是最流行的）J2EE O/R映射程序/数据集成框架。它为开发人员提供了处理企业中的关系数据库的整洁、简明且强大的工具。但如果外部需要访问这些已被包装在J2EE Web应用程序中的实体又该怎么办？是开发独立但相同的实体来访问数据，还是另外编写Web组件来管理内部访问的数据？<br/><br/>　　在某种程度上，这些问题是一定会发生的，对于我来说，当我的公司要向数据库中加载来自多个供应商的多种文件格式的记录时，就出现了这些问题。我考虑过以前常用的方法：用shell和SQL脚本（甚至存储过程）来加载数据。但由于数据模型过于复杂，我决定尽量利用现有的实体、Spring DAO以及Web应用程序之外的服务，并开发定制的J2SE命令行数据加载程序。 <br/><br/>重要问题：我们是否应该这样做？<br/>　　目前与Hibernate有关的大部分文档和例子都基于在容器中使用Hibernate。无论Hibernate是用于Web应用程序还是内部的“胖应用程序”，总是涉及到一个容器。这样做是有原因：容器支持各种特性，比如事务处理、线程和安全性。现在，要开发中型和企业应用程序，有一些工具是必需的。但当我们需要在容器外部访问实体对象时要怎么做？是使用现有的基础架构和代码呢，还是从另一种角度甚至还可能使用另一种语言去解决问题？当然，这个问题没有正确答案，在本文余下的部分中我将解释我所使用的方法，即，在Spring容器外重用现有的实体/POJO。 <br/><br/>　　脚本语言（如：Perl、Python、Ruby，甚至是Tcl）乍一看都有一些优点。很多时候，脚本语言可以快速开发，并易于获得初始结果，它还可以绕过Hibernate底层的复杂性。有可能在短短数行内就连接到数据库、选择一些结果并将其打印到屏幕或某个日志文件中。但受数据模型的影响，事情可能（通常情况下都会）变得非常复杂。假设有一张person表，其中有一个到address表的外键，在插入数据时，address没有被正确插入，这会导致person也不能被插入：这是典型的事务问题。有人可能会辩解说在脚本语言中这个问题并不难解决，就像在主应用程序中所做的那样。但还是有问题存在：为什么要这样做？如果逻辑已经存在于应用程序中，为什么还要再次进行编码？而且这并不是唯一的问题，我们将需要复制工作和逻辑，还可能由此产生许多错误。<br/><br/>　　有些人可能认为这些都不是大问题，并用自认为是最合适的工具来解决这些问题。也许您已经由于编码之外的原因使用了某种独立的基础架构。也许您事先将数据上传到独立的数据库中并进行充分测试，然后再将数据迁移到生产数据库中。又或者您的数据库维护工作已经外包出去，您只需要将文件发送给合作伙伴公司，由他们来解决这些问题。最后，可能还有许多其他原因造成您并没有使用现有的Hibernate数据层——不管这些原因正确与否。但如果您可以并打算在应用程序之外使用现有的代码库，请继续往下读。我将介绍一些技巧，并解决一些令人头疼的问题。 <br/><br/>配置<br/>　　一旦决定在容器之外使用现有的Hibernate对象，那么首先就必须自己管理所有的配置。下文介绍的方法是使用一个独立的Java命令行应用程序。既然已经设置了Hibernate XML配置文件，那么您应该知道哪些参数是必需的，比如JNDI DataSource名称、实体映射文件以及用于记录SQL的各种属性。如果您决定使用命令行应用程序，那就一定要解决如何分析XML文件并把它添加到新配置中的问题。分析XML文档不是不可能的，但是这有时会带来一些其他的小任务。因此我建议使用常规的属性文件。属性文件的加载非常简单，而且从其中取值也很容易。下面的例子示范了配置Hibernate所需的最小属性集（没有任何实体映射）。 <br/><br/>hibernate.dialect=net.sf.hibernate.dialect.PostgreSQLDialect<br/>hibernate.connection.driver_class=org.postgresql.Driver<br/>hibernate.connection.url=jdbc:postgresql://devserver/devdb<br/>hibernate.connection.username=dbuser<br/>hibernate.connection.password=dbpassword<br/>hibernate.query.substitutions yes 'Y'<br/>　　正如您所看到的，上面的属性指定了数据库的非标准语言，JDBC驱动类、数据库服务器名称、用户名、密码以及是否使用查询替换。一旦定义这些属性并保存到hibernate.properties文件（应该在类路径下）中，就很容易加载它们并传递给Hibernate Configuration对象。 <br/><br/>Properties props = new Properties();<br/>try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;props.load(props.getClass()<br/>&nbsp;&nbsp;&nbsp;&nbsp;.getResourceAsStream("hibernate.properties"));<br/>&#125;catch(Exception e)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Error loading hibernate "+<br/>&nbsp;&nbsp;&nbsp;&nbsp; "properties.");<br/>&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br/>&nbsp;&nbsp;&nbsp;&nbsp;System.exit(0);<br/>&#125;<br/><br/>String driver = <br/>&nbsp;&nbsp;&nbsp;&nbsp;props.getProperty("hibernate.connection." +<br/>&nbsp;&nbsp;&nbsp;&nbsp; "driver_class");<br/>String connUrl =<br/>&nbsp;&nbsp;&nbsp;&nbsp;props.getProperty("hibernate.connection.url");<br/>String username =<br/>&nbsp;&nbsp;&nbsp;&nbsp;props.getProperty("hibernate.connection." +<br/>&nbsp;&nbsp;&nbsp;&nbsp; "username");<br/>String password =<br/>&nbsp;&nbsp;&nbsp;&nbsp;props.getProperty("hibernate.connection.password");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>// In my examples, I use Postgres, but Hibernate <br/>// supports virtually every popular dbms out there.<br/>Class.forName("org.postgresql.Driver");<br/>Connection conn =<br/>&nbsp;&nbsp;&nbsp;&nbsp;DriverManager.getConnection(connUrl, username, <br/>&nbsp;&nbsp;&nbsp;&nbsp; password);<br/><br/>Configuration cfg = new Configuration(); <br/>cfg.setProperties( props );<br/>SessionFactory sessions = cfg.buildSessionFactory();<br/>Session session = sessions.openSession(conn);<br/>　　上面这段代码提供了一个即时可用的Hibernate Session对象。但我们依然需要解决如何使用现有的实体映射的问题。《Hibernate in Action》一书的第2.3.1节说明了如何在实体XML映射文件中进行加载，如下： <br/><br/>Configuration cfg = new Configuration(); <br/>cfg.addResource("hello/Message.hbm.xml"); <br/>cfg.setProperties( System.getProperties() ); <br/>SessionFactory sessions = cfg.buildSessionFactory();<br/>　　这段代码描述了如何从hello包加载Message的实体定义。但这种方式只适用于某些情况，对大部分实体来说这样做是乏味且容易出错的，这些代码必须人工维护，每次增加新的实体都要更新加载程序代码 。真令人厌烦！有一种更容易的发现并加载这些映射的方法，可以使这些映射与.jar一样经常保持最新。 <br/><br/>　　首先，正如在web应用程序或企业应用程序中一样，映射文件必须保存在类路径中，这样Hibernate才能正常工作。这是一件好事，因为只需使用同样的.jar文件并找到这些映射文件名。如果在类路径中有多个.jar文件，则需要指定哪个文件包含映射。下面的代码是寻找映射的方法之一。 <br/><br/>String cp = System.getProperty("java.class.path");<br/>String jarFile = null;<br/>List&nbsp;&nbsp; hbmList = null;<br/><br/>String[] cparr = cp.split("&#92;:");<br/>for(int j=0;j<cparr.length;j++)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;// The following assumes our entities <br/>&nbsp;&nbsp;&nbsp;&nbsp;// are wrapped up in a jar file <br/>&nbsp;&nbsp;&nbsp;&nbsp;// called 'dbobjs.jar'<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(cparr[j].indexOf("dbobjs.jar") != -1)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jarFile=(cparr[j]);<br/>&#125;<br/><br/>if(jarFile != null)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;JarFile jar = new JarFile(new File(jarFile));<br/>&nbsp;&nbsp;&nbsp;&nbsp;Enumeration e = jar.entries();<br/>&nbsp;&nbsp;&nbsp;&nbsp;if(e.hasMoreElements())&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hbmList = new ArrayList();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(e.hasMoreElements())&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// Object comes back<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// as JarFile<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JarEntry entry = <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(JarEntry)e.nextElement();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(entry.getName()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .indexOf(".hbm.xml") != -1)&#123; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hbmList.add(entry.getName());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Error: The entity "+<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"jar dbobjs.jar was not found in " +<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"classpath: " + cp);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/>　　上面这段代码基本上是获取了初始化虚拟机的类路径系统属性，寻找包含实体映射文件的.jar文件，分析文件名，然后将文件名添到ArrayList中。当每个实体映射的全部名称都保存到ArrayList后，就可以传递给如下的Hibernate Configuration对象： <br/><br/>Configuration cfg = new Configuration(); <br/><br/>Iterator iterator = hbmFileNames.iterator();<br/>while(iterator.hasNext())&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;cfg.addResource((String)iterator.next()); <br/>&#125;<br/>　　当Hibernate Session对象设置了正确的映射后，就可以进行下一步：使用实体。 <br/><br/>使用Session<br/>　　关于这方面的具体内容，因为可以找到各种与Hibernate、持久化和查询对象有关的文章、教程或者大量关于使用事务的例子，所以我不再介绍任何细节。而是考虑要用实体作什么，以及它们是如何影响Hibernate Session对象的。能否使用现有的业务对象甚至数据访问对象？在设置数据层时，我使用Spring以及它所提供的一些管理连接、事务和Session的类。这些对象都使用与Spring紧密集成的各种规则和关系定义在XML配置文件中。首先，DAO对象通过Spring的依赖注入（参见Bruce Tate的《Five Things I Love About Spring》）注入到服务中，然后配置服务以捕获特定的DAO异常（在XML配置文件中），这种异常是Spring可以正确处理的。虽然我觉得将Spring集成到数据加载应用程序中的工作量很大，我还是对DAO对象进行了细微的调整。这样，这些对象就可以在web应用程序之外使用了。<br/><br/>　　假设我在PersonDAO中有一个用来保存person对象的方法。由于容器已经设置好了Hibernate Session，我就不能在容器外重用这一DAO方法，因为它需要使用已经存在并完全配置好的Session对象。下面的代码是使用Spring容器所提供的Session支持后的典型PersonDAO： <br/><br/>import org.springframework.orm.hibernate.HibernateTemplate;<br/>import test.pojos.Person;<br/><br/>public class PersonDAO extends HibernateTemplate &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public PersonDAO()&#123;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public Person save(Person aPerson) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(aPerson != null) super.save(person);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return person;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/>　　上面的类扩展了Spring的HibernateTemplate类，该类提供了使用Hibernate的所有基本方法。因为HibernateTemplate管理了大部分普通操作，您只需将注意力集中在特定的持续需求上。当然这里也应该有适当的异常操作，但作为示例来说上面的代码已经足够了。 <br/>现在，要给Session增加在容器外使用的支持方法，只需做少量改动： <br/><br/>import org.springframework.orm.hibernate.HibernateTemplate;<br/>import net.sf.hibernate.Session;<br/>import test.pojos.Person;<br/><br/>public class PersonDAO extends HibernateTemplate &#123;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public PersonDAO()&#123;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public void setExternalSessionFactory(Session aSession)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setSessionFactory(session.getSessionFactory());<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public Person save(Person aPerson) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(aPerson != null) super.save(person);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return person;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/>　　因为HibernateTemplate扩展了HibernateAccessor，我就可以从选中的任何Session对象设置SessionFactory。这是Spring高度灵活的设计之一，可以使代码重用变得更容易。 <br/>也许您现在没有使用Spring，那么就要采取完全不同的方法。假设您没有使用Spring奇妙的依赖注入，那么从JNDI中查找Session对象的代码如下： <br/><br/>import net.sf.hibernate.Session;<br/><br/>public class PersonDAO &#123;<br/><br/>// This example assumes that there is a Hibernate<br/>// Session object at the following JNDI location<br/>// on a Tomcat 5.5 server:<br/>// java:/comp/env/obj/hibernateSession<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;private Session session;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public PersonDAO()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context initCtx = new InitialContext();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context envCtx = (Context) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initCtx.lookup("java:comp/env");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session = (Session)envCtx.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lookup("obj/hibernateSession");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;catch(Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public Person save(Person aPerson) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(aPerson != null) session.save(person);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return person;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/>　　上面的代码依靠应用容器使Hibernate Session对象可用。在容器之外使用这些对象的最简单的方法是再增加一个接收Session对象的构造函数： <br/><br/>import net.sf.hibernate.Session;<br/><br/>public class PersonDAO &#123;<br/><br/>// This example assumes that there is a Hibernate<br/>// Session object at the following JNDI location<br/>// on a Tomcat 5.5 server:<br/>// java:/comp/env/obj/hibernateSession<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;private Session session;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public PersonDAO()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context initCtx = new InitialContext();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Context envCtx = (Context) <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initCtx.lookup("java:comp/env");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session = (Session)envCtx.<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lookup("obj/hibernateSession");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;catch(Exception e) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public PersonDAO(Session aSession)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;session = aSession;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;public Person save(Person aPerson) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(aPerson != null) session.save(person);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return person;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;<br/>　　显然，我们没有处理许多异常和事务问题，或者说我们在许多方法之间共享了Session对象，但根据容器或框架处理对象实例的方式，这可能会引起一些并发问题。但我认为上面的示例清楚地演示了可以重用许多现有的数据层代码，这只需要一点创造性思维。记住，如果打算在应用服务器之外使用实体和DAO，那么就要测试，测试，再测试！<br/><br/>结束语<br/>　　正如我们所看到的，在web容器外使用Hibernate实体和DAO有很多窍门，但是这确实可以做到。最大的挑战是找到实体映射并解决如何重新配置或扩充已有的数据访问对象(DAO)的问题。对于后者，要小心管理自己的事务，因为有可能无法依赖于任何现有的业务服务。但是到最后，您可以访问所有实体以及用于对它们进行持久化的对象，这可以节省重新开发所花费的大量时间。祝您好运！<br/><br/>原文出处: Hibernate for Java SE <a href="http://www.onjava.com/pub/a/onjava/2005/11/16/hibernate-for-java-se.html" target="_blank">http://www.onjava.com/pub/a/onjava/2005/11/16/hibernate-for-java-se.html</a><br/><br/><br/> 作者简介 <br/> Jong Lee是Web Services开发团队的资深软件工程师。他在2000年加入BEA，负责为WebLogic Server 4.5、5.1、6.0及7.0设计和维护IIS 、IPlanet和Apache本机web服务器代理插件。从那时开始，他开发过各种WebLogic服务组件：Servlet、JSP、Deployment、OA&M和Web Services。他最近的任务是推动和实现与WS-Policy和WS-SecurityPolicy相关的规范。在加入BEA之前，他在Innovative Interfaces公司开发一种Swing库应用程序，供全世界各种类型和规模的库使用。他毕业于加利福尼亚大学伯克利分校计算机科学系。<br/>Tags - <a href="http://zhoujin.com/tags/hibernate/" rel="tag">hibernate</a> , <a href="http://zhoujin.com/tags/j2ee/" rel="tag">j2ee</a> , <a href="http://zhoujin.com/tags/j2se/" rel="tag">j2se</a> , <a href="http://zhoujin.com/tags/%25E5%25AF%25B9%25E8%25B1%25A1/" rel="tag">对象</a> , <a href="http://zhoujin.com/tags/spring/" rel="tag">spring</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/8/</link>
<title><![CDATA[酷派728升级方法]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Fri, 14 Apr 2006 08:02:08 +0000</pubDate> 
<guid>http://zhoujin.com/post/8/</guid> 
<description>
<![CDATA[ 
	本人使用酷派728，为了升级到最新版本，经历了200多小时的痛苦磨难，终于在今天凌晨自己升级成功！经过本人数小时的使用，还没有发现问题，功能较以前完善了许多。现将升级方法告诉各位大虾和诸位共享。首先要说明的是宇龙公司在手机升级上，玩弄了酷派728用户的感情，什么必须宇龙配发的专用SD卡！根本不是！而是用一款常用的Ｕ盘格式化软件（我用的是liubenBootU.exe版本，任意大小卡格式工具下载后文未）把普通的SD卡格式化成ＦＤＤ格式即可！ <br/><br/>由于升级后所有用户资料会丢失，所以升级前请务必将手机资料备份到电脑或另一张SD卡中，升级后再恢复！<br/>1、先将SD卡放入读卡器，用liubenBootU将SD卡格成FDD格式（liubenBoot软件中有使用方法）,此时卡中生成两个导引程序（IO.SYS和MSDOS.SYS）不用装任何软件，将手机关闭,把卡插入手机,按住“确认键”和“照相键”,再按住“电源开关键”,数秒钟后手机出现如下画面(见附件图一)信息表示导引成功（显示屏底部显示“Enter Config Mode”），然后释放各键,并关闭手机:<br/><a href="http://zhoujin.com/attachment/1145001589.jpg" target="_blank"><img src="http://zhoujin.com/attachment/1145001589.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a> &nbsp; <br/>2、升级主程序：取出SD卡，放回读卡器，删除上一步生成的两个导引程序（IO.SYS和MSDOS.SYS），然后将NK××.bin（注：这里面的××代表任意版本号） 升级程序拷贝到SD卡根目录并改名为NK.BIN。将SD卡再次插入手机中，装上有足够电量的电池（也可插上充电器），按住“照相键”和“确认键”，再按“开机键”数秒钟后手机会进入升级模式，此时释放各键，系统将自动从SD卡调用NK程序，检测手机内存，格式化手机部分内存，再安装NK程序，当显示如下画面(见附件图二)信息表示主程序已升级成功（显示屏底部显示“Enter Config Mode”）。然后关闭手机。<br/><a href="http://zhoujin.com/attachment/1145001629.jpg" target="_blank"><img src="http://zhoujin.com/attachment/1145001629.jpg" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>3、升级补丁程序：取出手机中的SD卡，删除NK程序，将1.××.×××××××××外部程序测试版本存入SD卡，再放回手机并打开手机，点击“休闲娱乐”---“文件浏览”---“SD”，根据你在卡里的存储位置进入“1.××.×××××××××外部程序测试版本”的文件夹，双击“INSTALL.EXE”就会有一个安装进度显示，完成后关机，再手动开机，到此为止整个升级工作完成！<br/>4 、资料恢复：将存有升级前备份资料的SD卡插入手机，进入“手机设置”-----“SD卡备份”-----“恢复”选中备份内容（升级后有12项），点“备份”即可完成备份！<br/><a href="attachment/1145002317.rar">点击这里下载文件</a><br/>像我现在的版本号是:1.58.060408192.728 (说明:1.58是大版本号，06是指06年，04是指04月，08是指08日，192是指小版本)<br/>Tags - <a href="http://zhoujin.com/tags/728/" rel="tag">728</a> , <a href="http://zhoujin.com/tags/%25E5%258D%2587%25E7%25BA%25A7/" rel="tag">升级</a> , <a href="http://zhoujin.com/tags/%25E9%2585%25B7%25E6%25B4%25BE/" rel="tag">酷派</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/7/</link>
<title><![CDATA[为什么要采用java这个平台？]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Fri, 14 Apr 2006 04:56:56 +0000</pubDate> 
<guid>http://zhoujin.com/post/7/</guid> 
<description>
<![CDATA[ 
	从开发项目的类别角度看java平台 <br/>基于B/S结构的系统，在这个方向上的竞争是激烈的，有专注于此的LAMP（Linux + Apache + Mysql + Php）;也有刚刚兴起的Rails（Ruby Frameworks）甚至是号称快速开发的ASP.NET;当然了java在这个领域里的MVC框架数都数不完，比如Struts . Webwork等，然而即便是如此，选择java作为开发的理由也是不充分的，因为在这个梯队里java顶多排名最后。<br/><br/>基于C/S结构的系统，在这个方面java显然没有考虑周到，面对VB 、DELPHI、vc这些个如狼似虎的快速开发IDE，JAVA实在是显得异常的淡薄，即使你找到了一个可以匹敌这些个ide的工具，面对第三方的组件又会成为一大障碍，所以java在这个方面又一次的输了。<br/><br/><br/>从java所强调的特性角度看java平台 <br/><br/>java的重点是业务逻辑！（我以前也是如此坚信不移）可是谁有能够说别的语言不注重业务逻辑呢，业务逻辑只是一个抽象的概念，java只是依靠ejb提出了业务组件而已，其他的语言在实现业务逻辑的时候也可以包装成POJO的形式，看来这个观点也是失败的。<br/><br/>java强调的是跨平台的优势！这可以理解为初级的、商业的、忽悠人的词汇，面对众多动态语言如Python，在若干平台上的表现，java又如何来强调自己这方面的优势呢？失败<br/><br/>java支持分布式应用的项目！可笑的言论，分布式根本不是值得炫耀的资本，在java之前的c/s项目中何尝不是分布式的应用呢？失败<br/><br/><br/>既然没有了这些个优势，我们看看java到底还剩下些什么？对了其实就是应用服务器！然而看过J2EE WITHOUT EJB的读者肯定知道Spring所希望达到的目的，也就是脱离应用服务器概念上的J2EE体系实现，既然在作者的眼里APPLICATION SERVER只不过是一个忽悠人的词汇，那么任何项目都选择java作为开发的依据显然就是自找苦吃，<br/><br/><br/>那么什么情况下改选择java作为开发的平台呢？<br/><1> 如果你真的遇到了大型的系统开发任务，恭喜你，你终于可以看到分布式对象、集群的优势了。<br/><2> 客户是一个java的忠实fans或者是sun、ibm的金牌合作伙伴之类的，选择java是不得已的，但记住并不能证明java是最好的实现方式<br/><3> 如果你只想关心业务逻辑的实现，对于事务、缓存、查找等服务的实现没有兴趣的话，倒是不妨考虑采用ejb的形式，当然前提是你不愿意在寻找合适的替代品的情况下。<br/><4> 如果项目迫切的寻找某种框架的支持，选择java就是对的，你有众多优秀的、免费的、可扩展的、天才的框架可以选择，更多的时候你是出于尴尬的境地，因为任何一个都让你心动、而这样的选择往往是最痛苦、和快乐的。<br/><br/><br/>正确的选择 <br/><1> <br/>条件: 如果项目仅仅只是一个小型的网站系统<br/>选择: LAMP、Rails<br/><br/><2> <br/>条件: 项目规模中等<br/>并且项目的时间比较紧，<br/>项目可以架构在windows的系统之上，<br/>选择: .Net&nbsp;&nbsp;/ Delphi <br/><br/><3><br/>条件: 大型的系统，有支持分布式对象、集群的要求；或者SUN / IBM的金牌合作伙伴 ; 想要寻找某种优秀的框架来解决问题<br/>选择: java是不二的选择，可是我想问一下，在现实中你能遇到这样的项目吗？<br/><br/>所以，从实际的角度出发，我们面对的99％可能都是一些符合条件1，2的系统，而选择java实在是得不偿失的。最后以一段Code Complete中的话来作为结束语<br/><br/>每个程序员都有很多的工具，但并不存在任何一个能够适用于所有工作的工具，因地制宜的选择正确工具是成为能有效编程的程序员的关键。<br/>Tags - <a href="http://zhoujin.com/tags/java/" rel="tag">java</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/6/</link>
<title><![CDATA[Redhat收购JBoss]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[瓜哇天地]]></category>
<pubDate>Fri, 14 Apr 2006 03:32:09 +0000</pubDate> 
<guid>http://zhoujin.com/post/6/</guid> 
<description>
<![CDATA[ 
	Redhat同意收购JBoss，这一业界最热的开源公司之一。交易达到4亿2千万美元的现金和股票。JBoss是一家私有公司。在宣布这一消息后，Redhat的股票当日上升$2.37，涨了8.6%。<br/>之前也一直传出Oracle要收购JBoss的风声。开来还是文化的认同和商业模式的匹配更为重要。<br/>Redhat一直以来都是微软Windows的未来竞争者，对于这场操作系统的竞争目前还刚刚开始。<br/>这次收购也继续加剧基础架构软件市场的竞争。IBM和Oralce帮助Redhat在美国建立了垄断性的市场地位，用Linux策略来对抗微软和Sun。这次收购显然让IBM和Oracle引火烧身。自己搞了个竞争对手出来。<br/>所以市场是千变万化的，竞争与合作无处不在。看得准(Vision)，多借力(Leverage)，看来多学学孙子兵法是没错的。<br/>Tags - <a href="http://zhoujin.com/tags/jboss/" rel="tag">jboss</a> , <a href="http://zhoujin.com/tags/redhat/" rel="tag">redhat</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/5/</link>
<title><![CDATA[62-63=1？移动一个数字使得等式成立]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[鸡零狗碎]]></category>
<pubDate>Wed, 12 Apr 2006 08:46:50 +0000</pubDate> 
<guid>http://zhoujin.com/post/5/</guid> 
<description>
<![CDATA[ 
	62-63=1？移动一个数字使得等式成立 <br/><br/>62-63=1？移动一个数字使得等式成立？在博客公社生产大队长看到这个有意思的数学题目，转过来也让大家看看，你是不是个缺少灵感的人呢？其实我也是看了答案的了，你还是先忍住不要看下面的答案吧。<br/><br/>条件准确描述如下：<br/>一、只能移动数字，即不能去掉一个数字，不能加入数字，不能移动符号，不能改变运算符号。<br/>二、只能移动一个数字，不能移动两个，调换两个数字算是移动了两个。<br/><br/><br/>用鼠标选中下面一行就能看到答案：<br/><span style="color: #FFFFFF;">答案：把第一个6移到2的指数位置上去，变成2^6-63=64-63=1，2^6表示2的六次方。</span><br/>Tags - <a href="http://zhoujin.com/tags/%25E7%25AD%2589%25E5%25BC%258F/" rel="tag">等式</a> , <a href="http://zhoujin.com/tags/%25E7%2581%25B5%25E6%2584%259F/" rel="tag">灵感</a> , <a href="http://zhoujin.com/tags/%25E8%25BF%2590%25E7%25AE%2597/" rel="tag">运算</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/3/</link>
<title><![CDATA[IE中不用ActiveX的情况下实现AJAX]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[JAVASCRIPT]]></category>
<pubDate>Wed, 05 Apr 2006 02:42:42 +0000</pubDate> 
<guid>http://zhoujin.com/post/3/</guid> 
<description>
<![CDATA[ 
	发现这篇文章：<br/><a href="http://verens.com/archives/2005/08/12/ajax-in-ie-without-activex" target="_blank">http://verens.com/archives/2005/08/12/ajax-in-ie-without-activex</a><br/><br/>提供以下代码：<br/>/*<br/>/*<br/>coded by Kae - <a href="http://verens.com/" target="_blank">http://verens.com/</a><br/>use this code as you wish, but retain this notice<br/>*/<br/><br/>function XMLHttpRequest() &#123;<br/>var i=0;<br/>var url='';<br/>var responseText='';<br/>this.onreadystatechange=function()&#123;<br/>return false;<br/>&#125;<br/><br/>this.open=function(method,url)&#123;<br/>//TODO: POST methods<br/>this.i=++kXHR_instances; // id number of this request<br/>this.url=url;<br/>var iframe=document.createElement('<iframe id="kXHR_iframe_'+this.i+'" type="text/plain" style="display:none"></iframe>');<br/>document.body.appendChild(iframe);<br/>&#125;<br/><br/>this.send=function(postdata)&#123;<br/>//TODO: use the postdata<br/>var el=document.getElementById('kXHR_iframe_'+this.i);<br/>el.src=this.url;<br/>kXHR_objs[this.i]=this;<br/>setTimeout('XMLHttpRequest_checkState('+this.i+')',500);<br/>&#125;<br/><br/>return true;<br/>&#125;<br/><br/>function XMLHttpRequest_checkState(inst)<br/>&#123;<br/>var el=document.getElementById('kXHR_iframe_'+inst);<br/>if(el.readyState=='complete')&#123;<br/>var responseText=window.frames['kXHR_iframe_'+inst].document.body.childNodes[0].data;<br/>kXHR_objs[inst].responseText=responseText;<br/>kXHR_objs[inst].readyState=4;<br/>kXHR_objs[inst].status=200;<br/>kXHR_objs[inst].onreadystatechange();<br/>el.parentNode.removeChild(el);<br/>&#125;else&#123;<br/>setTimeout('XMLHttpRequest_checkState('+inst+')',500);<br/>&#125;<br/>&#125;<br/><br/>var kXHR_instances=0;<br/>var kXHR_objs=[];<br/><br/><br/><br/>通过创建iFrame来提交数据，代替用ActiveX组件创建XmlHttp对象。<br/>这样的实现方法，还真想不到。<br/>Tags - <a href="http://zhoujin.com/tags/ajax/" rel="tag">ajax</a> , <a href="http://zhoujin.com/tags/javascript/" rel="tag">javascript</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/2/</link>
<title><![CDATA[我们做web2.0的口号就是：不求最好，但求最2]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[歪布天地]]></category>
<pubDate>Tue, 04 Apr 2006 08:57:09 +0000</pubDate> 
<guid>http://zhoujin.com/post/2/</guid> 
<description>
<![CDATA[ 
	一定得选最好的托管中心 &nbsp;<br/>全套Cisco的网络设备加SUN的服务器 &nbsp;<br/>建就建最酷的用户体验 &nbsp;<br/>免费注册帐户 &nbsp;<br/>每个帐户存储空间最少也得两个G &nbsp;<br/>什么AJAX呀、Tag呀、Rss呀 <br/>能给他整地全部给他整上 &nbsp;<br/>社区附带一个VIP区，有牛人7x24小时蹲点帮你解惑 <br/>Blog上常驻一个叫Keso的家伙 &nbsp;<br/>留小辫儿，特大牛的那种 &nbsp;<br/>只要一打开页面，甭管有事没事都得用Skype跟人家说 &nbsp;<br/>“你丫赶紧给我注册！” &nbsp;<br/>一口地道的京片子 &nbsp;<br/>倍儿有面子 &nbsp;<br/>网站里还要建一个wiki系统 &nbsp;<br/>全部翻译自维基百科 &nbsp;<br/>每天翻译量起码百兆计算吧 &nbsp;<br/>再建一个站内搜索 &nbsp;<br/>支持所有内容全文检索 &nbsp;<br/>文本呀、RSS呀、Blog呀，你要搜什么我给你找出什么 &nbsp;<br/>就是一个字——快 &nbsp;<br/>全站搜一次才用0.00001秒 &nbsp;<br/>在这里注册用户的不是CEO就是网络精英 &nbsp;<br/>你要是分不清Blog和WebLog &nbsp;<br/>你都不好意思去TrackBack人家 &nbsp;<br/>你说这样的网站，VC会投多少？ &nbsp;<br/>我觉得怎么着也得两千万美金吧？ &nbsp;<br/>两千万美金？那是成本 &nbsp;<br/>四千万美金起 &nbsp;<br/>你别嫌贵，我还挑东家呢 &nbsp;<br/>你得研究VC的投资心理 &nbsp;<br/>能掏起两千万的主儿 &nbsp;<br/>根本不在乎再掏两千万 &nbsp;<br/>什么叫Blogger，你知道吗？ &nbsp;<br/>Blogger挑服务商都用最2.0的，不用最好的 &nbsp;<br/>所以，我们做web2.0的口号就是： &nbsp;<br/>不求最好，但求最2
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/1/</link>
<title><![CDATA[Web 2.0 已经过时 Web 3.0初露端倪]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[歪布天地]]></category>
<pubDate>Tue, 04 Apr 2006 05:03:23 +0000</pubDate> 
<guid>http://zhoujin.com/post/1/</guid> 
<description>
<![CDATA[ 
	互联网的发展总是让人瞠目结舌。当人们身处web1.0，讨论着博客，SNS（社会性网络）等这些web2.0概念的时候，笔者不禁想问：web3.0时代，世界将会怎样？Web1.0，是以编辑为特征，网站提供给用户的内容是网站编辑进行编辑处理后提供的，用户阅读网站提供的内容。这个过程是网站到用户的单向行为，web1.0时代的代表站点为新浪，搜狐，网易三大门户。<br/><br/>Web2.0则是以加强了网站与用户之间的互动，网站内容基于用户提供，网站的诸多功能也由用户参与建设，实现了网站与用户双向的交流与参与,web2.0不同于web1.0的最大之处在于它的交互性。这个时期的典型代表有：博客中国(Bokee.com)、领袖周刊(leaderweek.com)等。<br/><br/>无论是web1.0还是web2.0，它们都是在窄带互联网这样一个大环境下，基于内容与交互的信息模式，只是web2.0在表现形式上比web1.0丰富一些，加强了用户的参与度。然而，随着网络基础设施的建设和信息技术的深入发展，互联网会更深层次的进入到人们的日常生活。笔者认为，web3.0是以主动性（Initiative）、数字最大化（max-Digitalizative）、多维化（multi-dimension）等为特征的，以服务为内容的第三代互联网系统。<br/><br/>主动性（Initiative）<br/><br/>web 3.0最明显的特征就是主动性，即强调网站对用户需求的主动提取，并加以分析处理，然后给出用户所需要的资源。这点类似于新浪网7月份推出的智能交互式搜索引擎iask，用户可以将自己的需求通过问题的形式提出，然后借助iask的海量知识库和用户回答两种形式给出答案。再譬如, 世界经理人问吧(ask.icxo.com), 对生意人经理人的问题有问必答! 但是搜索引擎仅仅是解决了一个问题而已，它无法直接解决用户生活或者工作中所遇到的具体的困难，这就需要更为专业的服务型站点来提供一站式服务。这样，用户不仅通过互联网获取答案，还能直接接受服务以便解决更为复杂的需求。<br/><br/>目前网上已经出现具有明显web3.0特征的网站了，如：世界经理人问吧(ask.icxo.com)，它有15大大门类，175个小门类，让用户能实现对目标对象的直接定位，可实现目标客户准确定位，客户服务，客户管理，营销等一系列经营环节。 <br/><br/>数字最大化（max-Digitalizative）<br/><br/>web3.0另外一个主要特征为数字最大化。无论是商品还是服务的交易，对商家来说都会涉及时间效率和空间成本的问题。而通过互联网按照一定规则将商品和服务数字化，可以同时解决时空上的矛盾。国内目前云网在商品数字化方面探索相当成功，云网是一家主要经营游戏点卡、电信卡等数字商品的一家专业电子商务公司，其看准了点卡容易数字化的特点而取得了巨大成功。而随着信息化程度的不断加深，会有更多的商品以数字化的方式出现，比如电子票，电子书，电子书包等。<br/><br/>服务类的数字化方面，另一个例子是世界经营者(bosslink.com) 。世界经营者对部分服务领域如教育培训、咨询等领域提供视频模块，实现线上服务，从而达到服务数字化的目的，从而使得服务的主要过程可以在网络环境下进行。<br/><br/>多维化（multi-dimension）<br/><br/>近几年随着网络资源的丰富，多媒体技术在互联网上的应用愈来广泛。但主要集中在一些娱乐领域，比如在线视频电影，网络游戏等。实际上web3.0时代将会出现信息多维化的趋势。比如目前拍卖网站的商品描述主要通过图片和文字的形式表现，如果为部分高端商品提供视频描述，或者三维动画不仅为消费者提供更全面的信息，而且也会提升该商品的品质，从而更有利于商品的出售。譬如, 华尔街电讯(wswire.com)就是把财经报纸、杂志、电视、广播、网络等全部捆绑在一起了! 总之，互联网领域时刻会出现新的元素，但以服务为中心的网络新贵们必将引领下一代互联网的潮流。<br/><br/>Web 1.0是指只读的Web，那是从实验室出来的东西。在Web 1.0时代，我们所能做的，就是各处瞎逛，并美其名曰——冲浪。Web 2.0带给我们的，是一个可以读写的互联网，代表性的事物就是blog、Wiki等。Gillmor所描述的Web 3.0，是一个全新的人机对话时代，借助开放的API，Web成为一个操作系统。我对于开放API是否真的能带来一个时代，持怀疑态度。而且我也不太清楚，Gillmor所说的Web 3.0，跟Web Services的异同是什么
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/93/</link>
<title><![CDATA[数据库设计三大范式]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[HIBERNATE]]></category>
<pubDate>Fri, 31 Mar 2006 18:40:46 +0000</pubDate> 
<guid>http://zhoujin.com/post/93/</guid> 
<description>
<![CDATA[ 
	第一范式（1NF）：数据库表中的字段都是单一属性的，不可再分。这个单一属性由基本类型构成，包括整型、实数、字符型、逻辑型、日期型等。 <br/><br/>第二范式（2NF）：数据库表中不存在非关键字段对任一候选关键字段的部分函数依赖（部分函数依赖指的是存在组合关键字中的某些字段决定非关键字段的情况），也即所有非关键字段都完全依赖于任意一组候选关键字。 <br/><br/>第三范式（3NF）：在第二范式的基础上，数据表中如果不存在非关键字段对任一候选关键字段的传递函数依赖则符合第三范式。所谓传递函数依赖，指的是如果存在"A → B → C"的决定关系，则C传递函数依赖于A。<br/><br/><span style="color: #FF0000;">三大范式简单总结一句就是消除冗余，单纯依赖关系。不允许数据库表出现冗余字段，不允许表之间多重依赖，因此符合三大范式设计的数据库模型其实和你按照面向对象思想去建模得到的数据库模型是一样的。 </span><br/>Tags - <a href="http://zhoujin.com/tags/%25E8%258C%2583%25E5%25BC%258F/" rel="tag">范式</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/4/</link>
<title><![CDATA[好东西：Prototype JavaScript Framework]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[BUFFALO]]></category>
<pubDate>Wed, 15 Mar 2006 02:45:55 +0000</pubDate> 
<guid>http://zhoujin.com/post/4/</guid> 
<description>
<![CDATA[ 
	这个东西，越看越喜欢：<br/><br/>Prototype JavaScript framework<br/><a href="http://prototype.conio.net/" target="_blank">http://prototype.conio.net/</a><br/><br/>英文文档<br/><a href="http://wiki.script.aculo.us/scriptaculous/show/Prototype" target="_blank">http://wiki.script.aculo.us/scriptaculous/show/Prototype</a><br/><br/>prototype.js开发笔记<br/><a href="https://compdoc2cn.dev.java.net/prototype/html/prototype.js.cn.html" target="_blank">https://compdoc2cn.dev.java.net/prototype/html/prototype.js.cn.html</a><br/><br/>prototype 源码解读 之 prototype.js<br/><a href="http://www.railscn.com/about40.html" target="_blank">http://www.railscn.com/about40.html</a><br/><a href="http://www.zeali.net/blog/entry.php?id=296" target="_blank">http://www.zeali.net/blog/entry.php?id=296</a> （以上链接之转载，更易读）<br/><br/>发现很多常用的，自己喜欢用的JavaScript都被包装得好好的，而且很精巧。<br/>Tags - <a href="http://zhoujin.com/tags/ajax/" rel="tag">ajax</a> , <a href="http://zhoujin.com/tags/html/" rel="tag">html</a> , <a href="http://zhoujin.com/tags/javascript/" rel="tag">javascript</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/23/</link>
<title><![CDATA[Kiss The Rain]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣人生]]></category>
<pubDate>Sun, 26 Feb 2006 03:16:06 +0000</pubDate> 
<guid>http://zhoujin.com/post/23/</guid> 
<description>
<![CDATA[ 
	《Kiss The Rain》,《雨的印记》之意,它是出自韩国最擅长描会爱情的音乐家YIRUMA之手.在一个繁星点点的夜晚，忽然间下起了一场雨，于是YIRUMA有感而发写下了"Kiss The Rain"这首曲子.24岁的钢琴家与作曲家---Yiruma，在韩国出生英国长大。曾就学于英国伦敦“The Purcell School”特别音乐学校， 后来毕业于“King‘s College of London University”，主修作曲 。在他的音乐作品里，展现了兼融东方的抒情与西方的典雅细致的音乐风格。因主修古典钢琴与作曲，Yiruma展现他傲人的古典才情与欧洲人善感的特质；同时，纯净与清新的东方特色也呈现在他的音色里。藉由细致的音乐性探触，他精致的演奏技巧，予人一种非凡艺术家的深刻印象。 <br/><br/>Hello <br/>Can you hear me? <br/>Am I gettin‘ through to you? <br/>Hello <br/>Is it late there? <br/>There‘s a laughter on the line <br/>Are you sure you‘re there alone? <br/>Cause I‘m <br/>Tryin‘ to explain<br/>Somethin‘s wrong <br/>Ya just don‘t sound the same <br/>Why don‘t you <br/>Why don‘t you <br/>Go outside <br/>Go outside <br/>Kiss the rain <br/>Whenever you need me <br/>Kiss the rain <br/>Whenever I‘m gone, too long. <br/>If your lips <br/>Feel lonely and thirsty <br/>Kiss the rain <br/>And wait for the dawn. <br/>Keep in mind <br/>We‘re under the same sky <br/>And the nights <br/>As empty for me, as for you <br/>If ya feel <br/>You can‘t wait till morinin‘ <br/>Kiss the rain <br/>Kiss the rain <br/>Kiss the rain <br/>Hello<br/>Do you miss me?<br/>I hear you say you do<br/>but not the way I‘m missin‘ you<br/>Whats new?<br/>Hows the weather?<br/>Is it stormy where you are?<br/>Cause I‘m so close but it feels like you‘re so far<br/>Oh would it mean anything<br/>If you knew<br/>What I‘m left imagining<br/>In my mind<br/>In my mind<br/>Would you go<br/>Would you go<br/>Kiss the Rain<br/>And you‘d fall over me<br/>Think of me<br/>Think of me<br/>Think of me<br/>Only me<br/>Kiss the rain<br/>Whenever you need me<br/>Kiss the rain<br/>Whenever I‘m gone too long<br/>if you‘re here<br/>feel hungry and tempted<br/>Kiss the rain<br/>and wait for the dawn<br/>Keep in mind<br/>We‘re under the same skies<br/>and the nights<br/>as empty for me, as for you<br/>if you feel<br/>You can‘t wait till morning<br/>Kiss the rain <br/>Kiss the rain <br/>Kiss the rain (drag)<br/>Kiss the rain <br/>Kiss the rain <br/>Ooooooooooooh<br/>Kiss the rain <br/>Ooooooooooooh<br/>Kiss the rain <br/>Hello<br/>Can you hear me?<br/>Can you hear me?<br/>Can you hear me?<br/>Tags - <a href="http://zhoujin.com/tags/kiss/" rel="tag">kiss</a> , <a href="http://zhoujin.com/tags/rain/" rel="tag">rain</a> , <a href="http://zhoujin.com/tags/%25E9%259B%25A8%25E7%259A%2584%25E5%258D%25B0%25E8%25AE%25B0/" rel="tag">雨的印记</a> , <a href="http://zhoujin.com/tags/%25E9%259F%25A9%25E5%259B%25BD/" rel="tag">韩国</a> , <a href="http://zhoujin.com/tags/yiruma/" rel="tag">yiruma</a>
]]>
</description>
</item><item>
<link>http://zhoujin.com/post/52/</link>
<title><![CDATA[思念在圣诞之夜]]></title> 
<author>chirs &lt;&gt;</author>
<category><![CDATA[蝶衣生活]]></category>
<pubDate>Sat, 24 Dec 2005 14:00:41 +0000</pubDate> 
<guid>http://zhoujin.com/post/52/</guid> 
<description>
<![CDATA[ 
	　　突然地下了决定，一个人过圣诞节的决定。拒绝了两三个热情的邀请。<br/>　　想象中有都市里热闹的繁华情景，霓虹如水，人流如潮。不喜欢那种感觉。只想让自己一个人沉浸在深深的思念里。<br/>　　人去楼空。寂静很容易噬空耐心，孤独很容易失控，泛滥成沉重的叹息。<br/>　　一个怪癖的习惯，越是热闹快乐的日子越是喜欢一个人孤独度过。其实也不尽然，举杯邀明月，对影成三人。我还有我的灵魂。<br/>　　千不该万不该，她不该在那个时候给我来电话，她欲言又止，我欲言说不出口。沉默有时候是一种默契，有时候却是一柄利剑。电波不停地传达着彼此的默契还是伤害？电话里的声音听起来虽然苍白，呼吸的声音却将感情的色彩表露无遗。甚至连我喝着浓浓的咖啡，她都能闻得到咖啡在我喉咙里肆掠的声音。<br/>　　电话挂断之后的寂静，我和我的灵魂同时沉默，还有手中的咖啡热气，独自把玩自己婀娜的身姿…… 别离的后遗症是思念吗？我疑惑的问自己。<br/>Tags - <a href="http://zhoujin.com/tags/%25E5%259C%25A3%25E8%25AF%259E%25E5%25A4%259C/" rel="tag">圣诞夜</a>
]]>
</description>
</item>
</channel>
</rss>
