<?xml version="1.0" encoding="gb2312"?>

<rss version="2.0">
    <channel>
    <title>-=疯子=-（私人重地）</title>
    <link>http://fengziblog.blog.tianya.cn/</link>
    <description>这是我的第一个会认真对待的BLOG`希望大家多多鼓励`多多帮助`谢谢`
    </description>

    <item>
      <title><![CDATA[一个三流学校程序员的奋斗!]]></title>
	  <author>fengziblog</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2007-7-1星期日(Sunday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=10158987&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>一个三流学校程序员的奋斗!<BR><BR><BR><BR>看完了有3个感触：<BR><BR>1.中国的教育很失败，这么勤奋的人只配上3流学校。<BR><BR>2.中国的IT很畸形。象我们在外企干些极度肤浅的东西却收入比这些真正称得上搞技术的人多的多。说白了就是米国老愚化中国的牺牲品<BR><BR>3.在加拿大更是，浪费多少人的精力去烤什么认证。不都是那些公司的商业垃圾？<BR><BR>用意<BR><BR>这些日子我一直在写一个实时操作系统内核，已有小成了，等写完我会全部公开，希望能够为国内IT的发展尽自己一份微薄的力量。最近看到很多学生朋友和我当年一样没有方向，所以把我的经历写出来与大家共勉，希望能给刚如行的朋友们一点点帮助。一转眼我在IT行业学习工作已经七年多了，这期间我做过网页，写过MIS、数据库，应用程序，做过通信软件、硬件驱动、协议栈，到现在做操作系统内核和IC相关开发，这中间走了很多弯路，也吃了不少苦。<BR><BR>我的程序学习之路<BR><BR>我上的是一个三流的高校，就连同一个城市的人多数都不知道。因为学校不好也就没有指望能靠学校名气找一个好工作。所有的希望都寄托在自己的努力上了，大一开学前的假期我就开始了学习，记得我买的第一本书是《计算机基础DOS3.0》，大家别吓着了，其实当时已经普及了DOS6.22了，只是我在书店里看到了DOS4.0，5.0，6.0的书，以为像英语那样是第四、五、六册，记得当时到处找DOS1.0，现在想想也幸好我没有找到：）开学前我学完了PASCAL，那时既没有计算机也没有人可以请教，我连程序是什么的概念都没有，只好死记硬背代码，然后拿纸写，我一直到大三才有了一台486，在这之前用纸写了多少程序我也记不清楚了，只知道最长的一个我拿A4大小的草稿纸写了30多页，我的C语言、C++、VC都是在这样的条件下入门的。所以说条件是可以克服的，希望我的经历多少给条件艰苦的同学们一点信心。第一次上机是在我姐夫的机房，我的心情激动的无与伦比，但是一上机我立刻傻了眼，他们用的是英文版的Win3.1，我的那点DOS知识都见了鬼，上机提心吊胆的一阵瞎摸，一不小心把Word弄成了全屏，怎么都还不了原，当时真是心急如焚，我以为机器被我弄坏了。第一个C语言程序，就是那个经典的HelloWorld，我调了几个星期，上机机会非常少，也没有书告诉我开发环境（TC2.0）需要设置，而且开始我都不知道有编译器，我甚至自作聪明把写好的程序扩展名从.c改成.exe，结果可想而知。大一学完了C、X86的汇编、数据结构、C++。由于精力都花在自学上了，大一下四门课挂了彩，三类学校就是这点好，挂上一二十门也照样毕业。不过扯远点说，我那么刻苦都及不了格，可见我们国家的计算机教育有多死板。<BR><BR>大二准备学VC和BC，当时难以取舍，后来选了VC，不为别的，只为书店里两本书，VC那本便宜6块钱。我的努力在班上无人能及，学的日夜不分，大三有了计算机后更是如此，很多次父亲半夜教训我说我不要命了，我一直觉得自己基础差，记忆又不行，条件也不好，所以觉得只有多花点时间才能赶上别人。居然后来有许多朋友说我有学计算机的天赋，让我哭笑不得。我用的是486，16M内存，1G硬盘，当时同学们的配置都是P166MMX，我安装一个WindowsNT4.0需要一个通宵，编译一个BC5.0向导生成的程序需要近两个小时，我的显示器是个二手的，辐射非常大，开机屏幕冒火花，看起来很酷的：），有一次程序写的太久，觉得怎么白色的编辑器背景变成了紫色，以为显示器坏了，后来才发现眼睛不行了，不过说来也奇怪，到今天我的视力还能保持1.5，真是个奇迹。但是就是那台破机器陪伴了我两年，让我学会了VC、Delphi、SQLServer等。后来那台机器给我阿姨打字用，据她说一天她正打的开心，一股青烟夹着火苗从显示器钻出来，之后它才寿终正寝。<BR><BR>大三假期找了个机会在一个计算机研究所实习，与其说实习不如说是做义工，工作了两个月一分钱没有拿。但是这两个月对我的发展帮助很大，让我早一步了解了社会，刚去的时候我当然是一窍不通，在那里我熟悉了网络，学会了Delphi和Oracle。由于工作很认真，得到了比较好的评价，在一位长者的引荐下，我开始和他们一起做项目，这使我在大三大四就有了自己的收入，大四又找了两家MIS公司兼职，虽然钱不多，但是在学生期间有1000多的收入我已经非常满足了，我终于用自己赚的钱把计算机换了。大四下开始找工作，这时我的工作经验已经比较多（当然现在想想非常幼稚），开始听父母的想去那个研究所，实习过那个部门也希望我能去，但是不知道为什么最后不了了之，这种单位就是比较官僚，我一气之下就到了我兼职的一个公司做MIS的TeamLeader。在大三到毕业一年的时间，做过了各种MIS，从煤气、烟厂、公安、铁路、饮食到高校，什么有钱做什么，工作也很辛苦，经常加班和熬通宵，从跟客户谈需求到设计、编码、测试、交付都要上。那时觉得很有成就感，觉得自己还不错，现在想想真是很肤浅。<BR><BR>开始工作旅途<BR><BR>刚走上工作岗位的学生很容易被误导，各种开发工具让人眼花缭乱，同时也觉得很受公司器重，但这样工作永远是一个低层次的开发者。不要跟我说什么系统分析有多么多么重要，多么多么难。你以为自己跟用户谈需求做设计就是系统分析和设计了吗，国内又有几个公司能够做的很到位很规范？我是ISO9000内审员，也在Rational公司受过多次培训，拿了4个证书，还有一个公司让我去做CMM。这些我听过很多，但是很多事情到国内就变了性质，一个公司不是通过了ISO9000或者CMM就能规范了，我现在在一家有几十年历史的外企工作，里面的管理不是一般国内企业能及的。作为一个毕业不久以前没有步入过社会的学生，几乎不可能在很短的时间掌握系统分析和设计，面向对象、UML只是一个工具，关键是人本身的思想，不是说你熟悉了C++、Rose就能够做出好的设计，相反如果你具备了很高的素质，你可以用C写出比别人用C++更加模块化的程序。<BR><BR>话说远一些，国内软件开发行业有一个怪圈，很多人觉得VC>Delphi>VB，真是很搞笑。这几个软件我都做过开发，说白了他们都是工具，应该根据应用的需要选择采用哪个，而不是觉得哪个上层次。如果你因为用某个开发工具很有面子而选择的话，只能说明你很浅薄。如果说层次，那么这些工具都不上层次，因为它们用来用去都是一些系统的API，微软的朋友不会因为你记住他们多少个API或者多少个类就会觉得你很了不起，你永远只是他们的客户，他们看重的是你口袋里的银子。我也做过系统内核，我也封装过很多API，同样我也不会看重那些使用这些API做二次开发的客户，除非他能够作出自己独到的设计。<BR><BR>至于有人认为C++>C那更是让人笑掉大牙，不妨你去打听一下，现在有几个操作系统内核是用C++写的，又有几个实时系统用的是C++，当然我也不是说C++不好，但是目前的内核和实时系统中C++还无法与C匹敌，至于说C++适合做应用系统的开发那是另外一回事。所以我的观点是不在于你用什么工具和语言，而在于你干什么工作。你的设计体现了你的技术层次。<BR><BR>这样干了一年我觉得非常苦闷，做的大多数都是熟练工种的活，个人技术上没有太多的提高也看不到方向。所以决定离开这个城市去上海，寻求更好的发展，并且打算放弃我以前的MIS转到通信行业。<BR><BR>写到这里不能不提到我女朋友，我们是在来上海前半年认识的，她大四在我公司实习，公司派她给我写文档，我们的感情发展的很快。她告诉我很多事情，她家原本是改革开放的第一批暴发户，她母亲爱打牌，输掉了几百万，还欠了很多债，她有男朋友，但是她对他没有感情，只因为他给了她母亲两万多块钱，后来还强迫她写了四万块的借条，她男朋友背叛过她并且不止一次打她，现在逼她结婚不然就要她还钱。这人居然还是一个高校的老师！她母亲把父亲给她的学费花了，因为拖欠学费她没有办法拿到毕业证。她母亲现在有病需要钱，我拿出了自己的一点积蓄并且跟朋友们借了一些，替她交了学费并给她母亲看病（后来才知道看病的钱又不知所终，就连她母亲是不是有病我都不知道，但她也是没有办法）。这个时候我家知道了一些事情，坚决反对我和她在一起，她原来的男朋友也极力破坏。无奈之下我们决定早一定离开这个伤心的城市，并且瞒着我们家。由于时间仓促，我只准备了4000块钱，她仅有的几百块钱也被她母亲要去了，我买了三张票，一张是中午的，两张是晚上的，中午我的家人把我送上船，他们一离开我就下了船，我和她乘坐晚上的船离开了这个我和她生活了很多年的城市，带走的只是一身债务。没有来过上海的我们两个性倔强，都不愿意去麻烦同学和朋友。来到上海是傍晚6点半，我们都不知道该去哪里，我们找了一个20块钱的旅馆，这个房间连窗户都没有，7月份的天气酷热难耐，房间里非常闷热。第二天我们开始租房子，因为身上的钱不多，我们基本都是步行，花了一个星期时间，不知道在浦东转了多少圈后找到了一个400块的房子，但是我们都不了解上海是付三压一，还要付半个月的中介费，买了一些锅碗瓢盆后，我们身上只有800块钱了，工作都还没有着落，这800块钱要支持到我们拿到第一个月工资，为了省钱我们自己做饭，每天买菜只花两块钱，她非常喜欢吃（也可能她在大学经常挨饿的愿意），看到她现在这样省吃俭用我真的很不忍心。她以前的男朋友也没有放过她，经常打电话来骚扰，并且来上海看她，还说了不少恐吓她的话，她过于善良，说他以前毕竟帮助过她，叫我不要与他一般见识。以后的每天在家就是苦等面试通知，原本我想迅速找一家MIS公司解决眼前的困难，但是她坚持让我不要放弃自己的理想，终于功夫不负有心人，我找到了一家通信公司，4000块的工资虽然赶不上MIS公司给我开出的价位，但也够在上海生存。她也找到了工作，第一天上班她哭了，这是她来上海第一次流泪，我心里很难受也很感动。<BR><BR>由于是全新的行业，我把自己降到了零点，我学的VC、Delphi、数据库派不上用场，摆在我面前的是嵌入式、协议、信令一些我从未接触过的知识。我知道我没有退路，于是拼命的学习，我把自己当做一个应届毕业生一样，一分努力一分收获，半年过去我终于熟悉了工作，并且得到了公司的表彰，薪水也加了一级。后面的日子里我们省吃俭用，把欠朋友的1万多块钱还了，日子终于上了正轨。这时女朋友告诉我她想考研究生，我也很支持，于是她辞职在家备考。<BR><BR>另外，在这里我要感谢我的ProjectManager，他原来是一个大通信公司的产品经理，对人非常和善，我从他那里学到了很多知识，而且他也给了我许许多多无私的帮助。在工作上他给我充分的空间和信任。记得公司安排我维护一个接入服务器软件，由于代码量不算太小（5万行），资料和文档都不齐全，我维护起来非常吃力，所以想重新把它做一遍，公司领导不太支持，可能觉得工作量太大，但是他极力支持我，私下里他让我放手去做，我的维护工作他挤时间做。在他的支持下，我花了半年时间完成了接入服务器的软件，并且实现了一个相对完整的TCP/IP协议栈。在这里我学会了嵌入式系统设计、驱动开发、TCP/IP和很多通信的知识，我花了一年时间终于使自己从MIS开发转到了通信行业，并且站稳了脚跟。我的开发大量是对硬件的直接操作，不再受微软的操作系统，VC、Delhpi这些开发工具的约束，我终于看到了另外一片天空。<BR><BR>我做事情喜欢追根问底，随着开发的深入，软件开发与硬件联系越来越紧密，硬件知识的匮乏又对我的发展产生了障碍，而且芯片技术基本上掌握在国外公司的手里，这对做系统级设计是一个非常大的制约，一个新产品出来，第一道利润（也往往是最丰厚的利润）常常都被IC公司如Intel、Motorola赚去了，国内的厂商只能喝点汤。所以我决心解决自己的硬件技术障碍，并打算离开通信行业，进入IC设计相关领域。<BR><BR>接触硬件知识<BR><BR>当然我明白如果我对硬件了解的非常少，没有哪家IC公司会仁慈到招我这样一个一窍不通的人来培训。所以我必须努力打好基础，学一些相关知识为以后做准备。就像我开始从MIS转到通信一样，我看过大量通信方面的书，并且给一个ISP做过RADIUS计费分拣台，在这样的背景下这家通信公司才给了我这个机会。我在的通信公司是做系统设计的，有不少PCBLayout硬件人员，平常我就注意向他们学习，由于我做的是软件，在公司看硬件资料不好意思，所以开始只好在家看，刚来上海工作我连续一年都在加班，后来不加了，因为我要挤出时间学习，通常我12点左右睡，第二天5点半起，我上班比较早，地铁上如果人不多我也用来看书。学习当然不会是一帆风顺的，有些实在不懂的问题就积累起来问硬件人员，他们的帮助使我学习进度快了很多，因为在没有人点拨的情况下自学，我的一半时间是花在解决疑难问题上，但这种问题经常是别人的一句话就可以让我豁然开朗，我非常庆幸我有这样的学习环境。在后面的一年里，我学会了看硬件原理图，学会了简单的硬件设计（模拟电路方面还有不小的差距），事情就是这样的，当你安安份份做软件，别人永远认为你是软件开发人员，在你开始学习硬件时别人未必会认同，有位中兴通讯的朋友还对我说过，一个人不可能把所有东西都学完。我也明白这一点，但我希望自己做的更好。但当你熟悉硬件后大家又会觉得你好像原本就是软硬件都懂的，同事们也都习以为常了。这个时候我可以把硬件资料堂堂正正的拿到公司看，没有人再大惊小怪了。让我比较自豪的是我通过自己的努力做了一个IAD（软交换的终端设备）系统方案，包含软硬件的选型、设计等内容，这个方案得到了公司和同事们的认同，让我感到非常欣慰。<BR><BR>技术是相辅相成的，当我的硬件有了一定的进步后，我的软件设计也有了很大的提高，我可以从更深层次理解问题，我做的接入服务器CPU是MotorolaPowerPC860，熟悉的朋友都知道860QMC与软件的批量数据传输通常采用BD表的方式，硬件人员做驱动的时候习惯采用固定BD表，每接收或发送数据都将数据从BD表拷贝到用户Buffer，或从用户Buffer拷贝到BD表，由于理解的比较深入，我自己重新实现了这个过程，采用动态BD表的方式，驱动从一个网口接收数据，提交给我的软件进行三层交换，直至从另外的接口发送出去，没有进行一次拷贝。这样的设计大大提高了性能，使系统的指标接近理论值。软硬件的结合使我的设计水平上了一个台阶。我现在写的这个操作系统，编译后我把程序反编译成汇编，找出其中不优化的代码，然后在C程序中进行调整。举个例子，很多CPU没有专门的乘法指令，这个大家应该都知道，在这种CPU上进行一个乘法操作常常会花费大量的指令周期，有的朋友会说这个我知道，我会尽量避免采用×号，但是事情往往不是那么简单，你知道<BR><BR>C语言中数组的下标操作是怎么实现的吗？仔细看看反汇编的代码你就会明白，同样是通过下标的定位操作，C编译器会有时候会产生位移指令，但有时候会用乘法实现，两者效率往往是天壤之别，所以明白这些问题你才能将系统性能提升到极致。?<BR><BR>些问题就不多说了，有兴趣的话以后可以共同探讨。<BR><BR>话说远一点，我由衷的希望在软件上做的比较深入的朋友们有机会学学硬件以及其它相关知识，尤其是做底层开发和嵌入式设计的。这对软件技术的提高有非常大的帮助，否则很多事情你只知道该这样但不会明白为什么该这样。我这个观点在我现在的IC公司ProjectManager那里也得到了验证。他告诉我们公司现在的802.11芯片产品的软件经理原本是做该芯片硬件设计的，某某某原本是做软件的，现在在做IC，类似的例子还有很多，只是在国内这样的风气不是非常流行。<BR><BR>生活的抉择<BR><BR>我有一些心得体会与大家分享，只有当我干好本职工作后，我才会学习与工作关系不大的技术，这样公司的上司才不至于反感，在入门阶段的问题我通常不去问那些资深人士，而是问一些资历比较浅的朋友，比如刚毕业不久的学生，因为他们往往会跟你详细的讲解，而资深人士通常觉得你的问题太简单，所以回答的也很简单，我又不好意思多问。等技术上了一定的层次后我才会问他们，他们也能给你比较深入的回答。另外，有些朋友说我机会比较好，他们也希望能从事新的工作可惜没有机会，我听了只有苦笑，我的机会了解的人都应该知道，我没有出生在什么IT世家：）也没有谁一路提拔我，所有的路都是自己走出来的，我母亲去世比较早，我的后母（我叫她阿姨）看着我努力过来的，一次她看我大年30还在写程序，她说像我这样努力木头都能学出来。<BR><BR>我的最终目的是IC而不是PCB，所以我下一步的准备开始学习IC设计的知识。公司的同事没有懂IC设计的，后面的路又要靠自己了，我买了不少相关的书，在网上也查了很多的资料，我花了大量的时间去学习VHDL，并且用软件进行了一些简单的设计和仿真（没有设计ASIC，只是针对FPGA），随着学习的深入，我渐渐明白了IC设计的基本流程，同时也明白了这条路的艰辛。这个时候我已经做好了跳槽的准备，我向一家业界又一定知名度的IC设计公司投了简历，并通过了漫长的面试（4个多小时）。其他的一切我都比较满意，唯独薪资差强人意，我也明白原因，因为我是这个行业的新人，我没有经验，我再一次将自己清零了。公司老板问我6000多一个月能不能接受，我知道他也是照章办事。想想我通信行业的朋友们，基本上都是年薪10万以上，月薪过万的也比比皆是，朋友们也帮我介绍了不少待遇不错的公司，我该怎么选择，当时我很犹豫，我热爱我的事业，我向往我的追求，但我也是一个普通的人，我也需要养家糊口，我也想早一点买房买车。生活给我出了一道难题。<BR><BR>爱因斯坦在63岁时说过“一个人没有在30岁以前达成科学上的最大成就，那他永远都不会有。”这句话给了我很大的压力和震动，我马上就26岁了，离30只有四年时间，我必须抓紧这几年宝贵的时间，努力达到我技术上的最高峰。为了这个理想，为了能离自己的梦更近一些，我选择了这家IC公司，我明白自己的薪资和公司刚进来的硕士研究生相差无几，但为了今后的发展只能忍受，一切又得重新开始。换行业是一个非常痛苦的过程，尤其从一个春风得意的位置换到一个陌生的岗位，感觉象从温暖的被子里钻出来跳进冰水中，让人难以接受。在原来那家通信公司，我是唯一两年时间涨了五次工资的员工，公司和同事都给了我极大的认可，工作上也常常被委以重任。但现在这一切都成了过去，在新的公司我只是一个新人,没有人知道也没有人在意我过去的成绩。我决定重新开始，我把自己看作新毕业的学生，我要用自己的努力得到公司的认可。进入新的行业是非常痛苦的，我告诉自己必须忍受这一切，虽然外面有很多诱惑，但是既然作出了选择我就不允许自己轻易放弃。<BR><BR>我现在已经在这家新公司上了一个多月的班，开始非常艰难，现在慢慢适应了。第一个月结束时，TeamLeader找我谈话，说我是新进员工中最优秀的一个，我心里很欣慰，这也算对我努力的一个肯定吧。在这里还要感谢我的女朋友，她给了我很大的支持和鼓舞，每次在我动摇的时候她都在鼓励我，让我坚持自己的理想，刚来上海是她让我不要勉强去做MIS，这次也是她让我顶住了月薪过万的诱惑，没有她我可能不会有今天的成绩。现在的公司有自己的操作系统，自己的CPU、DSP和其它芯片，在这里我能学到世界上最先进的技术，我们的设计开发不再完全依赖别人的硬件和系统，这让我很开心。我打算等工作步入正轨后，全力学习新的知识，实现我的理想。<BR><BR>在后面的两年里我给自己定下了几个目标：<BR><BR>一.努力做好本职工作，在工作上得到公司和同事们的认同；<BR>    二.努力学习IC硬件设计知识，多向同事请教，并利用一切机会多实践；<BR>    三.实现我的实时操作系统的主要部分，完成TCP/IP协议栈模块，并免费发布源代码；<BR>    四.和我女朋友结婚并买一套小房子，这是最重要的，因为我明白事业是可以重来的，但是珍贵的感情很难失而复得。<BR><BR>在这里提一下我现在开发的操作系统，它是一个实时嵌入式系统，目前支持以下特性：<BR><BR>a.支持时间片轮转调度和基于优先级调度，最多64个优先级；<BR>    b.抢占式实时内核；<BR>    c.为了便于移植，主体用标准C实现；<BR>    d.汇编代码非常少，不到100行；<BR>    e.支持任务管理，各任务有独立的堆栈；<BR>    f.进程同步和通信目前完成了Semaphore，MessageQueue正在调试；<BR>    g.实现了定时系统调用；<BR>    h.可以在windows上仿真调试<BR><BR>我还打算下一步实现优先级反转保护，EventFlag，DataPipe，内存管理（以前实现过）、驱动接口等。在这之后我还会努力完善它，比如加入文件系统，协议栈、调试接口等。希望朋友们提出自己的意见和建议，在此不胜感激！<BR><BR>后记：<BR><BR>就像有的朋友说的，我的经历或许会给一些朋友产生误导，在这里我必须说明一下。我来上海以前学习过于拼命，常常晚上只睡3个多小时，我身高1米71，那时只有108斤（我现在130多），家人也说我这样拼命活不过60岁，但是当时的我太固执，我对他们说只要能实现理想活50岁我就够了。那时的拼命使我的身体受到了影响，有一次早上突然腰肌剧痛难忍，痛的我倒在床上站不起来。虽然我现在已经比较注意，但有时候还会隐隐作痛。后来在女朋友说服了我，来上海以后我不再如此。我经常引用父亲的一句话“身体是革命的本钱”。<BR><BR>而且我也发现拼命不是办法，我可以熬一两个通宵，最多的一次我连续工作了三天三夜，但是我半个月都没有恢复过来，这样是不是得不偿失？学习工作应该是一个长期的过程，像马拉松而不是百米冲刺。我现在非常注意调整学习和工作的强度，我要保证每天尽量有相对充沛的精力，一些年轻的朋友觉得自己也应该拼命努力，这让我多少有些担心，如果我的故事能让你在学习工作上多一点兴趣，我会感到很开心，但如果误导了某些朋友，让你做一些不值得的付出，我会感到很内疚。<BR><BR>技术没有贵贱之分，我以前换行业是因为自己的兴趣所致，而不是对哪个行业有什么偏见。我希望我的经历不要给朋友一个错误的导向，觉得我始终向更高的技术发展。其实各行各业做到顶尖都是很困难的。话又说回来虽然技术没有贵贱，但是门槛是有高低的，无论如何，做IC的门槛要比做网页的高，这一点无可否认。国家各种人才都是需要的，但是作为个人奋发向上的想法还是应该有的，努力在自己喜欢的行业上做的更好，而不应该停留在比较肤浅的层次上。<BR><BR>我是一个自己觉得比较有自知之明的人，或许我最大的优点就是知道自己有很多缺点：）。我的故事中很多的曲折和错误都是由我的缺点造成的，希望大家用审慎的眼光看待我的经历，不要被我的“花言巧语”所迷惑。我学习有些随心所欲，这给我带来了无尽的麻烦，也大大阻碍的我的发展。记得我小时候成绩比较出色，但是后来学习严重偏科，导致我中学成绩一再滑坡，也没有考上什么好的学校，小时候的一个朋友，当时的成绩和我相仿，但是没有我这个缺点，她上了清华，后来在去了美国深造，在一个著名导师手下研究理论科学，这未尝不是一条更好的出路。另外我的学习方法也是在不断改善中的，过去的学习过于讲究数量和时间，那样学习既苦而已效率不高，现在我非常注意学习的效率和技巧，这样才是学习的捷径（当然不是指投机取巧），比如说学一相对陌生的技术，如果有条件，不妨问一问有经验的人，不需要问很多，往往他不经意的几句话会给你非常大的帮助，甚至超过你看一个星期的书。带着这样的思想再去学习你会节省很多时间，这样何乐不为呢？这些年中我学了不少的东西，由于开始非常盲目，所以学的东西杂乱无章，现在回想起来让我啼笑皆非，我把大量的时间浪费在一些没有必要深入了解的知识上，毕竟一个人的精力是有限度的。很多朋友很我一样都背过五笔字形，的确它是个不错的输入法，但是对一个研发人员它绝对不值得你去背，你的时间应该花在有价值的地方。我这样的事情还做过很多，我背过CCED、WPS的命令和快捷键，在dBase基本退出历史舞台后我还花了很多时间去学习它的使用。所以我的学习在前期缺乏规划，没有明确的短期目的、中期目标，只有一个虚无飘渺的长期的理想。这就像做设计一样，好的设计是从需求抽象到代码有很多过程，而不能得到了需求就立刻开始开始编码。<BR><BR>当然这么些年的学习和工作多多少少有些收获，下面我说说我的一些学习的心得，这些方法未必正确，我也在不断探索和改进中。我的学习和工作有相对明确的目标，我不会一时心动而去学习某一技术，在下决定之前我会考虑很多，包括长期的发展，个人路线的规划，需要付出的代价、可能遇到的困难及解决的办法等等，在决定后还会制定更加明确的计划，包括短期、中期和长期的，身边可以利用到的资源（包括好的书籍、资料、软硬件环境，也包括有经验的朋友或者师长），以及每一个阶段是怎么过渡到高一阶段的计划，往往在一个学习阶段一旦上路后会走的相对顺利，但是跨阶段通常比较麻烦，比如从学习基础知识转到实践。另外我买书也有自己的方法，现在世面上高质量的书远不如低质量书多，对于一个陌生的技术，往往在第一次买书会选择错误，即使买到一本好书但是它的方向也未必适合你，所以我通常会先在网上查找一些该技术的介绍，有了一点点概念后再去买一本比较薄、相对便宜并且内容相对泛泛而谈的书，这是国内作者最善于写的书：），再把它浏览一遍后我就会基本明白这门技术的要点，后面买书和制定计划就会明确的多。否则一开始就想找本好书往往比较困难，而且买回来后努力学习，有时候学了一半才发现是本低质量的书或者是相对过时技术，让人非常懊恼。另外让有经验的人帮你介绍，通常也是一个不错的选择。<BR><BR>有些朋友想学通信、嵌入式开发，但总觉得自己没有软硬件环境，我就按我的了解给大家介绍一下怎么建立这样的环境，当然我了解的只是我学习和工作的方向。通信我做的是数据网方面的工作，包括TCP/IP、二三层交换、对接入网、H.323和软交换也有一点认识。这些软硬件环境都是可以在PC上构建的。你甚至可以在一个没有网卡的PC上建立一个包含多个路由器、接入服务器、VoIP网关、网守、主机等的仿真网络环境，而且与实际的网络相当接近，当然这需要你有清晰的网络概念和一定的网络知识，我一直在努力开发一套软件将这个过程简化，目前试验已经做完，我可能会将它融入我的操作系统外围扩展软件中。这样的方法我无法用简单的语句讲的很清楚，我可以说一下大概的思想，就是在PC上实现仿真网卡，（知道Windows怎么在没有网卡的机器实现虚拟网卡技术的朋友都应该会明白），然后每一个仿真网卡对应一个虚拟设备，如路由器或者主机。你也可以借助第三方工具完成部分工作，如VmWare等。我现在就是利用一个仿真网卡做自己的开发的。<BR><BR>至于嵌入式开发环境更加容易实现，PC就是一个非常大的硬件平台，现有的嵌入式操作系统通常都支持X86，你可以在上面做开发，通过软盘Boot或者使用虚拟机装载，我用VxWorks做了试验，在一台PC上跑Windows和VxWorks两个系统。另外Windows上的兼容DOS的16位仿真X86环境也为很多操作系统提供了绝佳的试验环境，我的操作系统在Windows上就是这样实现的。Linux在嵌入式中应用也比较广泛，它在网上有大量的资料，而且也相对比较容易实践。同时很多完善的嵌入式开发环境支持软件仿真，如Tornado、WinCE等。<BR><BR><BR><BR><BR>                                           看了有很大的感触`<BR>                                      仅以此转帖`<BR>                                                鼓动自己`<BR>]]></description>
	  <comments>2007-7-1 19:26:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=10158987&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[servlet]]></title>
	  <author>fengziblog</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2007-6-18星期一(Monday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=10014160&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/> Servlet是用Java编写的Server端程序，它与协议和平台无关。Servlet运行于Java－enabled Web Server中。Java Servlet可以动态地扩展Server的能力，并采用请求－响应模式提供Web服务。 <BR><BR>　　最早支持Servlet技术的是JavaSoft的Java Web Server。此后，一些其它的基于Java的Web Server开始支持标准的Servlet API。<BR><BR>一、Servlet的特点<BR><BR>      Servlet是Java技术对CGI编程的回答。Servlet程序在服务器端运行，动态地生成Web页面。与传统的CGI和许多其他类似CGI的技术相比，Java Servlet具有更高的效率，更容易使用，功能更强大，具有更好的可移植性，更节省投资（更重要的是， Servlet程序员收入要比Perl程序员高:-）<BR><BR>      高效<BR>      在传统的CGI中，每个请求都要启动一个新的进程，如果CGI程序本身的执行时间较短，启动进程所需要的开销很可能反而超过实际执行时间。而在Servlet中，每个请求由一个轻量级的Java线程处理（而不是重量级的操作系统进程）。在传统CGI中，如果有N个并发的对同一CGI程序的请求，则该CGI程序的代码在内存中重复装载了N次；而对于Servlet，处理请求的是N个线程，只需要一份Servlet类代码。在性能优化方面，Servlet也比CGI有着更多的选择，比如缓冲以前的计算结果，保持数据库连接的活动，等等。<BR><BR>      方便<BR>      Servlet提供了大量的实用工具例程，例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。<BR><BR>      功能强大<BR>      在Servlet中，许多使用传统CGI程序很难完成的任务都可以轻松地完成。例如，Servlet能够直接和Web服务器交互，而普通的CGI程序不能。Servlet还能够在各个程序之间共享数据，使得数据库连接池之类的功能很容易实现。<BR><BR>      可移植性好<BR>      Servlet用Java编写，Servlet API具有完善的标准。因此，为I-Planet Enterprise Server写的Servlet无需任何实质上的改动即可移植到Apache、Microsoft IIS或者WebStar。几乎所有的主流服务器都直接或通过插件支持Servlet。<BR><BR>      节省投资<BR>      不仅有许多廉价甚至免费的Web服务器可供个人或小规模网站使用，而且对于现有的服务器，如果它不支持Servlet的话，要加上这部分功能也往往是免费的（或只需要极少的投资）。<BR><BR>二、Servlet的主要功能<BR><BR>      Servlet的主要功能在于交互式地浏览和修改数据，生成动态Web内容。这个过程为： <BR><BR>　　客户端发送请求至服务器端； <BR><BR>　　服务器将请求信息发送至Servlet <BR><BR>　　Servlet生成响应内容并将其传给Server。响应内容动态生成，通常取决于客户端的请求 <BR><BR>　　服务器将响应返回给客户端 <BR><BR>　　Servlet看起来像是通常的Java程序。Servlet导入特定的属于Java Servlet API的包。因为是对象字节码，可动态地从网络加载，可以说Servlet对Server就如同Applet对Client一样，但是，由于Servlet运行于Server中，它们并不需要一个图形用户界面。从这个角度讲，Servlet也被称为Faceless Object。 <BR><BR>三、JAVA Servlet的优势<BR><BR>　　Servlet可以和其他资源(文件、数据库、Applet、Java应用程序等)交互，以生成返回给客户端的响应内容。如果需要，还可以保存请求－响应过程中的信息。 <BR><BR>　　采用Servlet，服务器可以完全授权对本地资源的访问(如数据库)，并且Servlet自身将会控制外部用户的访问数量及访问性质 <BR><BR>　　Servlet可以是其它服务的客户端程序，例如，它们可以用于分布式的应用系统中，可以从本地硬盘，或者通过网络从远端硬盘激活Servlet。 <BR><BR>　　Servlet可被链接(chain)。一个Servlet可以调用另一个或一系列Servlet，即成为它的客户端。 <BR><BR>　　采用Servlet Tag技术，可以在HTML页面中动态调用Servlet。 <BR><BR>　　Servlet API与协议无关。它并不对传递它的协议有任何假设。 <BR><BR>　　像所有的Java程序一样，Servlet拥有面向对象Java语言的所有优势 <BR><BR>　　Servlet提供了Java应用程序的所有优势——可移植、稳健、易开发。使用Servlet 的Tag技术，Servlet能够生成嵌于静态HTML页面中的动态内容。 <BR><BR>　　一个Servlet被客户端发送的第一个请求激活，然后它将继续运行于后台，等待以后的请求。每个请求将生成一个新的线程，而不是一个完整的进程。多个客户能够在同一个进程中同时得到服务。一般来说，Servlet进程只是在Web Server卸载时被卸载。 <BR><BR>四、Servlet生命周期<BR><BR>　　装载Servlet。这项操作一般是动态执行的。然而，Server通常会提供一个管理的选项，用于在Server启动时强制装载和初始化特定的Servlet。 <BR><BR>　　Server创建一个Servlet的实例 <BR><BR>　　Server调用Servlet的init()方法 <BR><BR>　　一个客户端的请求到达Server <BR><BR>　　Server创建一个请求对象 <BR><BR>　　Server创建一个响应对象 <BR><BR>　　Server激活Servlet的service()方法，传递请求和响应对象作为参数 <BR><BR>　　service()方法获得关于请求对象的信息，处理请求，访问其他资源，获得需要的信息 <BR><BR>　　service()方法使用响应对象的方法，将响应传回Server，最终到达客户端。service()方法可能激活其它方法以处理请求，如doGet()或doPost()或程序员自己开发的新的方法 <BR><BR>　　对于更多的客户端请求，Server创建新的请求和响应对象，仍然激活此Servlet的service()方法，将这两个对象作为参数传递给它。如此重复以上的循环，但无需再次调用init()方法。一般Servlet只初始化一次 ,当Server不再需要Servlet时(一般当Server关闭时)，Server调用Servlet的Destroy()方法。 <BR><BR>　　在美国，EJB+Servlet+JSP几乎成为电子商务的开发标准。本来 ASP 也很有希望，但微软最近可能把精力都集中在打官司和Win2000上， 因此电子商务发展得太少。PHP由于其模式和一些天生缺陷，毫无希望。 在美国，很少有商业站点用PHP的。 <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>摘自:http://www.itisedu.com/phrase/200603091005185.html<BR>]]></description>
	  <comments>2007-6-18 10:31:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=10014160&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[DIV+CSS`布局`]]></title>
	  <author>fengziblog</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2007-1-19星期五(Friday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=8271998&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>这是在网上看到的一篇文章，很适合入门div＋css布局的人看，转了过来收藏，hoho～～<BR><BR>你正在学习CSS布局吗？是不是还不能完全掌握纯CSS布局？通常有两种情况阻碍你的学习：<BR><BR>第一种可能是你还没有理解CSS处理页面的原理。在你考虑你的页面整体表现效果前，你应当先考虑内容的语义和结构，然后再针对语义、结构添加CSS。这篇文章将告诉你应该怎样把HTML结构化。<BR><BR>另一种原因是你对那些非常熟悉的表现层属性(例如：cellpadding,、hspace、align="left"等等)束手无策，不知道该转换成对应的什么CSS语句。当你解决了第一种问题，知道了如何结构化你的HTML，我再给出一个列表，详细列出原来的表现属性用什么CSS来代替。<BR><BR>结构化HTML<BR>我们在刚学习网页制作时，总是先考虑怎么设计，考虑那些图片、字体、颜色、以及布局方案。然后我们用Photoshop或者Fireworks画出来、切割成小图。最后再通过编辑HTML将所有设计还原表现在页面上。<BR><BR>如果你希望你的HTML页面用CSS布局(是CSS-friendly的)，你需要回头重来，先不考虑“外观”，要先思考你的页面内容的语义和结构。<BR><BR>外观并不是最重要的。一个结构良好的HTML页面可以以任何外观表现出来，CSS Zen Garden是一个典型的例子。CSS Zen Garden帮助我们最终认识到CSS的强大力量。<BR><BR>HTML不仅仅只在电脑屏幕上阅读。你用photoshop精心设计的画面可能不能显示在PDA、移动电话和屏幕阅读机上。但是一个结构良好的HTML页面可以通过CSS的不同定义，显示在任何地方，任何网络设备上。<BR><BR>开始思考<BR>首先要学习什么是"结构"，一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块，以及每块内容服务的目的，然后再根据这些内容目的建立起相应的HTML结构。<BR><BR>如果你坐下来仔细分析和规划你的页面结构，你可能得到类似这样的几块：<BR><BR>标志和站点名称 <BR>主页面内容 <BR>站点导航(主菜单) <BR>子菜单 <BR>搜索框 <BR>功能区(例如购物车、收银台) <BR>页脚(版权和有关法律声明) <BR>我们通常采用DIV元素来将这些结构定义出来，类似这样：<BR><BR><div id="header"></div><BR><BR><div id="content"></div><BR><BR><div id="globalnav"></div><BR><BR><div id="subnav"></div><BR><BR><div id="search"></div><BR><BR><div id="shop"></div><BR><BR><div id="footer"></div> <BR><BR>这不是布局，是结构。这是一个对内容块的语义说明。当你理解了你的结构，就可以加对应的ID在DIV上。DIV容器中可以包含任何内容块，也可以嵌套另一个DIV。内容块可以包含任意的HTML元素---标题、段落、图片、表格、列表等等。<BR><BR>根据上面讲述的，你已经知道如何结构化HTML，现在你可以进行布局和样式定义了。每一个内容块都可以放在页面上任何地方，再指定这个块的颜色、字体、边框、背景以及对齐属性等等。<BR><BR>使用选择器是件美妙的事<BR>id的名称是控制某一内容块的手段,通过给这个内容块套上DIV并加上唯一的id,你就可以用CSS选择器来精确定义每一个页面元素的外观表现,包括标题、列表、图片、链接或者段落等等。例如你为#header写一个CSS规则，就可以完全不同于#content里的图片规则。<BR><BR>另外一个例子是：你可以通过不同规则来定义不同内容块里的链接样式。类似这样：#globalnav a:link或者 #subnav a:link或者#content a:link。你也可以定义不同内容块中相同元素的样式不一样。例如，通过#content p和#footer p分别定义#content和#footer中p的样式。从结构上讲，你的页面是由图片、链接、列表、段落等组成的，这些元素本身并不会对显示在什么网络设备中(PDA还是手机或者网络电视)有影响，它们可以被定义为任何的表现外观。<BR><BR>一个仔细结构化的HTML页面非常简单，每一个元素都被用于结构目的。当你想缩进一个段落，不需要使用blockquote标签，只要使用p标签，并对p加一个CSS的margin规则就可以实现缩进目的。p是结构化标签，margin是表现属性，前者属于HTML，后者属于CSS。(这就是结构于表现的相分离.)<BR><BR>良好结构的HTML页面内几乎没有表现属性的标签。代码非常干净简洁。例如，原先的代码<table width="80%" cellpadding="3" border="2" align="left">，现在可以只在HTML中写<table>，所有控制表现的东西都写到CSS中去，在结构化的HTML中，table就是表格，而不是其他什么(比如被用来布局和定位)。<BR><BR>亲自实践一下结构化<BR>上面说的只是最基本的结构，实际应用中，你可以根据需要来调整内容块。常常会出现DIV嵌套的情况，你会看到"container"层中又有其它层，结构类似这样：<BR><BR><div id="navcontainer"><BR><BR><div id="globalnav"><BR><BR><ul>a list</ul><BR><BR></div><BR><BR><div id="subnav"><BR><BR><ul>another list</ul><BR><BR></div><BR><BR></div> <BR><BR>嵌套的div元素允许你定义更多的CSS规则来控制表现，例如：你可以给#navcontainer一个规则让列表居右，再给#globalnav一个规则让列表居左，而给#subnav的list另一个完全不同的表现。<BR><BR>用CSS替换传统方法<BR>下面的列表将帮助你用CSS替换传统方法：<BR><BR>HTML属性以及相对应的CSS方法<BR>HTML属性  CSS方法  说明 <BR>align="left"<BR><BR>align="right"  float: left; <BR><BR>float: right;  使用CSS可以浮动 任何元素:图片、段落、div、标题、表格、列表等等 <BR><BR>当你使用float属性，必须给这个浮动元素定义一个宽度。<BR><BR>marginwidth="0" leftmargin="0" marginheight="0" topmargin="0" margin: 0;  使用CSS, margin可以设置在任何元素上, 不仅仅是body元素.更重要的，你可以分别指定元素的top, right, bottom和left的margin值。<BR><BR>vlink="#333399" alink="#000000" link="#3333FF" a:link #3ff;<BR><BR>a:visited: #339;<BR><BR>a:hover: #999;<BR><BR>a:active: #00f; <BR>在HTML中，链接的颜色作为body的一个属性值定义。整个页面的链接风格都一样。使用CSS的选择器，页面不同部分的链接样式可以不一样。<BR><BR>bgcolor="#FFFFFF" background-color: #fff;  在CSS中，任何元素都可以定义背景颜色，不仅仅局限于body和table元素。<BR><BR>bordercolor="#FFFFFF" border-color: #fff; 任何元素都可以设置边框(boeder)，你可以分别定义top, right, bottom和left<BR><BR>border="3"<BR><BR>cellspacing="3"  border-width: 3px;  用CSS，你可以定义table的边框为统一样式，也可以分别定义top, right, bottom and left边框的颜色、尺寸和样式。 <BR><BR>你可以使用 table, td or th 这些选择器. <BR><BR>如果你需要设置无边框效果，可以使用CSS定义： border-collapse: collapse;<BR><BR><br clear="left"><BR><BR><br clear="right"><BR><BR><br clear="all"> <BR>clear: left;<BR><BR>clear: right;<BR><BR>clear: both; <BR>许多2列或者3列布局都使用 float属性来定位。如果你在浮动层中定义了背景颜色或者背景图片，你可以使用clear属性.<BR><BR>cellpadding="3"<BR><BR>vspace="3"<BR><BR>hspace="3"  padding: 3px;  用CSS，任何元素都可以设定padding属性，同样，padding可以分别设置top, right, bottom and left。padding是透明的。<BR><BR>align="center" text-align: center;<BR><BR>margin-right: auto; margin-left: auto; <BR>Text-align 只适用于文本. <BR><BR>象div，p这样的块级怨毒可以通过margin-right: auto; 和margin-left: auto;来水平居中<BR><BR><BR>一些令人遗憾的技巧和工作环境<BR>由于浏览器对CSS支持的不完善，我们有时候不得不采取一些技巧(hacks)或建立一种环境(Workarounds)来让CSS实现传统方法同样的效果。例如块级元素有时侯需要使用水平居中的技巧，盒模型bug的技巧等等。所有这些技巧都在Molly Holzschlag的文章《Integrated Web Design: Strategies for Long-Term CSS Hack Management》中有详细说明。<BR><BR>另外一个关于CSS技巧的资源站点是Big John和Holly Bergevin的“Position is Everything”。<BR><BR>理解浮动行为<BR>Eric Meyer的《Containing Floats》将帮助你掌握如何使用float属性布局。float元素有时候需要清除(clear)，阅读《How To Clear Floats Without Structural Markup》将非常有帮助。<BR><BR>更多帮助<BR>已有的《CSS Discussion》列表是很好的资源，它收集了一个WiKiA讨论组的信息，其中包括CSS布局总结(css-discuss.incutio.com/?page=CssLayouts)，CSS 技巧总结 (css-discuss.incutio.com/?page=CssHack) 以及更多  ]]></description>
	  <comments>2007-1-19 21:02:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=8271998&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[造JPopupMenu组件:]]></title>
	  <author>fengziblog</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2007-1-19星期五(Friday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=8271981&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/> 构造JPopupMenu组件: <BR><BR><BR><BR>由一表中我们可以知道JPopupMenu的构造方法并不复杂,两种构造方法的差异只在于是否赋予JPopupMenu一个标题文字.我们马上来<BR>看下面这个范例,了解如何应用JPopupMenu.<BR>import javax.swing.*;<BR>import java.awt.*;<BR>import java.awt.event.*;<BR>import javax.swing.event.*;<BR>import javax.swing.border.*;<BR>import java.util.*;<BR>import com.incors.plaf.alloy.*;<BR>import com.incors.plaf.alloy.themes.glass.*;<BR><BR>public class JPopupMenu1 extends JFrame{<BR><BR>        JTextArea theArea = null;<BR>        static final String ComboStr[] = {"Times New Roman","Dialog","宋体","黑体","楷体"};<BR>    JPopupMenu Popup = null;//声明一个全局(Global)并设置初始值为null的JPopupMenu组件.<BR><BR>        public JPopupMenu1(){<BR>          <BR>          super("JPopupMenu1");<BR>          theArea = new JTextArea();<BR>          theArea.setEditable(false);<BR>          this.getContentPane().add(new JScrollPane(theArea),BorderLayout.CENTER);<BR>          JMenuBar MBar = new JMenuBar();<BR>          MBar.setOpaque(true);<BR>          JMenu mfile = buildFileMenu();<BR>          JToolBar theBar = buildToolBar();<BR>      this.getContentPane().add(theBar,BorderLayout.NORTH);<BR>          PopupPanel pp = new PopupPanel();//new一个PopupPanel组件来放置JPopupMenu.<BR>      this.getContentPane().add(pp,BorderLayout.SOUTH); //将PopupPanel组件放置到窗口中.<BR>          <BR>          MBar.add(mfile);  <BR>          setJMenuBar(MBar);<BR>        }//end of JPopupMenu1()<BR>    /*****************begin**********************<BR>       分别建立程序中菜单,工具栏和事件处理模式的部份,我们在此不再加以说明.<BR>    ****************************************/<BR>        public JMenu buildFileMenu() {<BR>          <BR>          JMenu thefile = new JMenu("File");<BR>          thefile.setMnemonic('F');<BR><BR>          JMenuItem newf = new JMenuItem("New",new ImageIcon("icons/new24.gif"));<BR>          JMenuItem open = new JMenuItem("Open",new ImageIcon("icons/open24.gif"));<BR>          JMenuItem close= new JMenuItem("Close",new ImageIcon("icons/close24.gif"));    <BR>          JMenuItem quit = new JMenuItem("Exit",new ImageIcon("icons/exit24.gif"));<BR><BR>          newf.setMnemonic('N');<BR>          open.setMnemonic('O');<BR>          close.setMnemonic('L');<BR>          quit.setMnemonic('X');<BR>          <BR>          newf.setAccelerator( KeyStroke.getKeyStroke('N', java.awt.Event.CTRL_MASK, false) );<BR>          open.setAccelerator( KeyStroke.getKeyStroke('O', java.awt.Event.CTRL_MASK, false) );<BR>          close.setAccelerator( KeyStroke.getKeyStroke('L', java.awt.Event.CTRL_MASK, false) );<BR>          quit.setAccelerator( KeyStroke.getKeyStroke('X', java.awt.Event.CTRL_MASK, false) );<BR><BR>          newf.addActionListener(new ActionListener() {<BR>                                        public void actionPerformed(ActionEvent e) {<BR>                                                  theArea.append("- MenuItem New Performed -\n");<BR>                                        }});<BR><BR>          open.addActionListener(new ActionListener() {<BR>                                        public void actionPerformed(ActionEvent e) {<BR>                                                  theArea.append("- MenuItem Open Performed -\n");<BR>                                        }});<BR>                                    <BR>          close.addActionListener(new ActionListener() {<BR>                                      public void actionPerformed(ActionEvent e) {<BR>                                                   theArea.append("- MenuItem Close Performed -\n");<BR>                                         }});<BR><BR>          quit.addActionListener(new ActionListener() {<BR>                                        public void actionPerformed(ActionEvent e) {<BR>                                                  System.exit(0);<BR>                                              }});<BR><BR>          thefile.add(newf);                  <BR>          thefile.add(open);<BR>          thefile.add(close);        <BR>          thefile.addSeparator();<BR>          thefile.add(quit);<BR><BR>          return thefile;<BR>        }//end of buildFileMenu()<BR>        <BR>        public JToolBar buildToolBar() {<BR>          <BR>          JToolBar toolBar = new JToolBar();<BR>      toolBar.setFloatable(true);<BR>    <BR>          ToolBarAction tba_new   = new ToolBarAction("new",new ImageIcon("icons/new24.gif"));<BR>          ToolBarAction tba_open  = new ToolBarAction("open",new ImageIcon("icons/open24.gif"));<BR>          ToolBarAction tba_close = new ToolBarAction("close",new ImageIcon("icons/close24.gif"));<BR>    <BR>          JButton JB;<BR>          JB = toolBar.add(tba_new);<BR>          JB.setActionCommand("#TooBar_NEW performed!");<BR>          JB.setToolTipText((String)tba_new.getValue(Action.NAME));<BR>          JB = toolBar.add(tba_open);<BR>          JB.setActionCommand("#ToolBar_OPEN performed!");<BR>          JB.setToolTipText((String)tba_open.getValue(Action.NAME));<BR>          JB = toolBar.add(tba_close);<BR>          JB.setActionCommand("#ToolBar_CLOSE performed!");<BR>          JB.setToolTipText((String)tba_close.getValue(Action.NAME));<BR>    <BR>          toolBar.addSeparator();<BR>        <BR>          ToolBarAction tba_B  = new ToolBarAction("bold",new ImageIcon("icons/bold24.gif"));<BR>          ToolBarAction tba_I  = new ToolBarAction("italic",new ImageIcon("icons/italic24.gif"));<BR>          ToolBarAction tba_U  = new ToolBarAction("underline",new ImageIcon("icons/underline24.gif")); <BR>          JB = toolBar.add(tba_B);<BR>          JB.setActionCommand("#ToolBar_Bold performed!");<BR>          JB.setToolTipText((String)tba_B.getValue(Action.NAME));<BR>          JB = toolBar.add(tba_I);<BR>          JB.setActionCommand("#ToolBar_Italic performed!");<BR>          JB.setToolTipText((String)tba_I.getValue(Action.NAME));    <BR>          JB = toolBar.add(tba_U);<BR>          JB.setActionCommand("#ToolBar_Underline performed!");<BR>          JB.setToolTipText((String)tba_U.getValue(Action.NAME));<BR>   <BR>          toolBar.addSeparator();    <BR>          JLabel JLfont = new JLabel("Font Type");<BR>          toolBar.add(JLfont);<BR>          toolBar.addSeparator();<BR>          JComboBox jcb = new JComboBox(ComboStr);<BR>          jcb.addActionListener(new ActionListener() {<BR>                                      public void actionPerformed(ActionEvent e) {<BR>                                                   theArea.append("*Combobox "+((JComboBox)e.getSource()).getSelectedItem()+"<BR>                                    performed!\n");<BR>                                       }});<BR>          toolBar.add(jcb);<BR>        <BR>          return toolBar;<BR>        }//end of buildToolBar()<BR>    /*****************End**********************<BR>       分别建立程序中菜单,工具栏和事件处理模式的部份,我们在此不再加以说明.<BR>    ****************************************/<BR>        <BR>        public static void main(String[] args){<BR>       SwingUtil.setLookAndFeel();<BR>          JFrame F = new JPopupMenu1();<BR>          F.setSize(430,200);<BR>          F.addWindowListener(new WindowAdapter() {<BR>            public void windowClosing(WindowEvent e) {<BR>              System.exit(0); <BR>            }<BR>          });//end of addWindowListener<BR>          F.setVisible(true); <BR>        } // end of main<BR>        <BR>        class ToolBarAction extends AbstractAction{<BR><BR>      public ToolBarAction(String name,Icon icon){<BR>        super(name,icon);<BR>      }<BR><BR>      public void actionPerformed(ActionEvent e){<BR>    <BR>        try{<BR>          theArea.append(e.getActionCommand()+"\n");<BR>        }catch(Exception ex){}<BR>      }<BR>    }//end of inner class ToolBarAction<BR>    <BR>   /*本方法建立inner class PopupPanel.这个类继承JPanel并实作MouseListener,PopupMenuListener,ActionListener和<BR>    *ActionListener等3个Listener.MouseListener为处理鼠标事件的Listener,PopupMenuListener为Popup菜单事件的Listener,<BR>    *ActionListener则是大家最熟悉用来处理JMenuItem事件的Listener.<BR>    */<BR>    class PopupPanel extends JPanel implements MouseListener,PopupMenuListener,ActionListener{<BR>      <BR>      public PopupPanel(){<BR>        <BR>        Popup = new JPopupMenu();//new 一个新的JPopupMenu.<BR>      <BR>        JMenuItem theItem;<BR>       <BR>      //分别建立四个JMenuItem和其事件处理模式将将JMenuItem加入JPopupMenu中.<BR>        Popup.add(theItem = new JMenuItem("Cut",new ImageIcon("icons/cut24.gif")));//建立JMenuItem组件.<BR>        theItem.addActionListener(this);//将JMenuItem组件加入事件处理模式.<BR>        Popup.add(theItem = new JMenuItem("Copy",new ImageIcon("icons/copy24.gif")));<BR>        theItem.addActionListener(this);<BR>        Popup.add(theItem = new JMenuItem("Paste",new ImageIcon("icons/paste24.gif")));<BR>        theItem.addActionListener(this);<BR>        Popup.addSeparator();//在JPopupMenu中加入分隔线,我们在前面有提到JPopupMenu和Menu大致上的性质是一样的,所以<BR>                             //在JPopupMenu中一样是以JMenuItem来当作选项的组件.<BR>        Popup.add(theItem = new JMenuItem("Page Setup..."));<BR>        theItem.addActionListener(this);<BR>        <BR>        //利用setBorder()方法将BevelBorder类当作参数传入,使JPopupMenu产生立体边框浮起的效果.我们也可以将参数设置改<BR>        //为BevelBorder.LOWERED使得JPopupMenu产生立体边框凹陷的效果.<BR>        Popup.setBorder(new BevelBorder(BevelBorder.RAISED));<BR>      <BR>        Popup.addPopupMenuListener(this); //将JPopupMenu组件加入PopupMenu事件处理模式中. <BR>        addMouseListener(this);//将PopupPanel类加入Mouse事件处理模式中.<BR>        theArea.addMouseListener(this);//后面有说明<BR>      <BR>      }//end of PopupPanel()<BR>      <BR>      /*由于PopupPanel这个inner class中实作了MouseListener,因此需要覆写mouseClicked(),mousePressed(),<BR>       *mouseReleased(),mouseEntered()和mouseExited()等5个方法.在这个范例里当mouseClicked(),mousePressed()<BR>       *和mouseReleased()等3个方法被触发时会调用checkPopup()方法来判断是否要将PopupMenu输出来.<BR>       */<BR>          public void mouseClicked(MouseEvent me){ checkPopup(me);}<BR>             public void mousePressed(MouseEvent me){ checkPopup(me);}<BR>            public void mouseReleased(MouseEvent me){ checkPopup(me);}<BR>          public void mouseEntered(MouseEvent me){}<BR>          public void mouseExited(MouseEvent me){}<BR>          /*checkPopup()方法.其中,在程序中利用isPopupTrigger()方法判断PopupMenu是否已经输出.若没有,则在程序中利用<BR>       *show()方法将PopupMenu输出目前鼠标指针(利用getX()和getY()方法得知)的位置上.<BR>       */<BR>          private void checkPopup(MouseEvent me){<BR>            if(me.isPopupTrigger()){<BR>              Popup.show(me.getComponent(), me.getX(), me.getY());<BR>            }<BR>          }//end of checkPopup() <BR>        <BR>      /*由于PopupPanel这个inner class实作了PopupMenuListener,因此需要覆写popupMenuWillBecomeVisible(),<BR>       *popupMenuWillBecomeInvisible()方法和popupMenuCanceled()等3个方法.在这个范例里当这3个方法被触<BR>       *发后会在JTextArea中加入一个信息.<BR>       */<BR>          public void popupMenuWillBecomeVisible(PopupMenuEvent pme){<BR>            theArea.append("-PopupMenu Visibel!\n");<BR>          }<BR>          public void popupMenuWillBecomeInvisible(PopupMenuEvent pme){<BR>            theArea.append("-PopupMenu Invisibel!\n");<BR>          }<BR>          public void popupMenuCanceled(PopupMenuEvent pme){<BR>            theArea.append("-PopupMenu Hidden!\n");<BR>          }<BR><BR>          //当某个JMenuItem被触发后会在JTextArea中加入一个信息.<BR>          public void actionPerformed(ActionEvent ae){<BR>             theArea.append("+Popup "+ae.getActionCommand()+" performed!\n");<BR>          }<BR>    }//end of inner class PopupPanel<BR>}//end of class JPopupMenu1<BR><BR>class SwingUtil{<BR>  public static final void setLookAndFeel() {<BR>          try{<BR>            Font font = new Font("JFrame", Font.PLAIN, 12);<BR>            Enumeration keys = UIManager.getLookAndFeelDefaults().keys();<BR><BR>            while (keys.hasMoreElements()) {<BR>               Object key = keys.nextElement();<BR>               if (UIManager.get(key) instanceof Font) {<BR>                  UIManager.put(key, font);<BR>                }<BR>            } <BR>                AlloyLookAndFeel.setProperty("alloy.isLookAndFeelFrameDecoration", "true");<BR>                AlloyTheme theme = new GlassTheme();<BR>                LookAndFeel alloyLnF = new AlloyLookAndFeel(theme);<BR>            UIManager.setLookAndFeel(alloyLnF);<BR>          }catch(UnsupportedLookAndFeelException ex){<BR>            ex.printStackTrace();        <BR>          }<BR>}<BR>} <BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR><BR>(网上看的`转了`)<BR> ]]></description>
	  <comments>2007-1-19 20:59:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=8271981&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[I  believe  ```]]></title>
	  <author>fengziblog</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2007-1-4星期四(Thursday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=8076408&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>相信自己`<BR><BR>过去的就让它过去吧`<BR>再怎么后悔也是徒然`<BR><BR>重要的是想想现在该做些什么`<BR>记住`<BR><BR>重要的既不是后悔以前` <BR>```也不是空想未来`<BR>而是寻找到自己的目标`<BR>```来把握现在`<BR>要知道`：<BR>```最重要的```<BR>“今天”`<BR>]]></description>
	  <comments>2007-1-4 12:06:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=8076408&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[告别 My game`]]></title>
	  <author>fengziblog</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2007-1-4星期四(Thursday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=8076335&amp;idWriter=0&amp;Key=0</link>
      <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>6年的时间`<BR>初中`高中`<BR>人生最没好的时光就这样被我白白浪费`<BR>现在补救`<BR>希望还来的急`<BR>祈祷吧`<BR>我的朋友们`<BR>为我祈祷吧`<BR>我会好好的`<BR>反省过去`<BR>珍惜现在`<BR>开创未来`<BR><BR>     Believe me`<BR>           Believe myself`]]></description>
	  <comments>2007-1-4 11:59:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=8076335&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

    <item>
      <title><![CDATA[别想太多]]></title>
	  <author>fengziblog</author>
	  <category><![CDATA[未分类]]></category> <pubDate>2006-11-30星期四(Thursday)晴</pubDate> 
      <link>http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=7645207&amp;idWriter=0&amp;Key=0</link>
      <description><![CDATA[<br/>这个天涯的BLOG已经是我申请的第2个天涯的BLOG了`<BR>以前申请咯一个一直没用它`<BR>到现在早忘玩咯`<BR>呵呵`<BR>今天朗沃的“叶老”喊我们弄撒子电梯系统`<BR>做需求分析`<BR>弄半天结果才听他说原来用文字叙述`<BR>热`<BR>郁闷`<BR>我们还讨论撒子“类”不“类”的`<BR>郁闷惨咯哇`<BR>不过还好哈`<BR>现在还轻松`<BR>但是两周后就不知道会怎么样咯`<BR>等进入主题咯`<BR>就喊HOHO`<BR>哦豁咯`<BR>忽忽`<BR>算咯`<BR>今天就到这里吧`<BR>呵呵`<BR>祝天天开心`<BR>`]]></description>
	  <comments>2006-11-30 21:30:00<a href="http://blog.tianya.cn/blogger/post_show.asp?BlogID=744007&amp;PostID=7645207&amp;idWriter=0&amp;Key=0" target="_blank">(0)</a></comments>
    </item>

  </channel>
</rss>
