<?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/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;zh
