in

SDT Community Server

SDT Forums, Blogs, Photos server.

Floating Heart

No description is bad.

September 2008 - Posts

  • 华为软件编程规范和范例

    please refer to attached file.

     

    Posted Sep 28 2008, 05:23 PM by wicky with no comments
    Filed under:
  • dotNET设计模式系列文章

    http://www.cnblogs.com/Terrylee/archive/2006/07/17/334911.html

    最初写探索设计模式系列的时候,我只是想把它作为自己学习设计模式的读书笔记来写,可是写到今天,设计模式带给我的震撼,以及许多初学者朋友的热心支持,让我下定决心要把这个系列写完写好,那怕花上再多的时间也无所谓。本部分内容不断更新中。

    目录计划:

    第Ⅰ部分 开篇

    开篇

    第Ⅱ部分 创建型模式篇

    1 单件模式(Single Pattern

    2 抽象工厂模式(Abstract Factory

    3 建造者模式(Builder Pattern

    4 工厂方法(Factory Method

    5 原型模式(Protype Pattern

    6 创建型模式专题总结

    第Ⅲ部分 结构型模式篇

    7 适配器模式(Adapter Pattern

    8 桥接模式(Bridge Pattern

    9 装饰模式(Decorator Pattern

    10 组合模式(Composite Pattern

    11 外观模式(Façade Pattern

    12 享元模式(Flyweight Pattern

    13 代理模式(Proxy Pattern

    14 结构型模式专题总结

    第Ⅳ部分 行为型模式篇

    15 模版方法模式(Template Method

    16 命令模式Command Pattern

    17 迭代器模式(Iterator Pattern

    18 观察者模式(Oberver PatternNew

    19 中介者模式(Mediator Pattern

    20 备忘录模式(Memento Pattern

    21 解释器模式(Interpreter Pattern

    22 状态模式(State Pattern

    23 策略模式(Strategy Pattern

    24 职责链模式(Chain of Responsibility

    25 访问者模式(Visitor Pattern

    26 行为型模式专题总结

    第Ⅴ部分 综合篇

    27 从设计原则到设计模式

    28 如何合理的使用设计模式

    29 从灵活性与重用性看设计模式

    30 设计模式与实践

    作者:TerryLee
    出处:http://terrylee.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
     
    Posted Sep 28 2008, 04:27 PM by wicky with no comments
    Filed under:
  • MochaUI

    http://mochaui.com/
    http://mochaui.com/demo/

    MochaUI is a web applications user interface library built on the Mootools JavaScript framework.

    Uses

    • Web Applications
    • Web Desktops
    • Web Sites
    • Widgets
    • Standalone Windows and Modal Dialogs

    Getting Started

    1. Download the latest stable release.
    2. Upload the files to your server. If your server has PHP installed you can use mocha.js.php to concatenate your source files. Otherwise use mocha.js in your header instead or individually list the source files you are using.
    3. Modify as needed.
    4. Compress your source file(s).

    Resources

    Mootools

    Mootools is an Object-Oriented JavaScript framework designed for the intermediate to advanced JavaScript developer.

    ExplorerCanvas

    Firefox, Safari and Opera 9 support the canvas tag to allow 2D command-based drawing. ExplorerCanvas is a javascript file that brings the same functionality to Internet Explorer.

     

  • Simple Assembly Explorer Build 2008.09.21

    + Plugins support
    + Customized Tools menu

    Get it at Simple.Net.

     

    Posted Sep 22 2008, 08:36 AM by wicky with no comments
    Filed under:
  • 质检总局奶粉检测结果

    草

    Posted Sep 17 2008, 08:51 AM by wicky with no comments
    Filed under:
  • 爸爸的烦恼

    http://www.cnemag.com.cn/fenxplun/newsfx/2008-09-08/174400.shtml

       爸爸今年84岁,他1984年在东北长春市退休,至今已经25年了。尽管退休时工资很低,但这些年国家不断给涨工资,加之孩子们经常给他“财政补助”,他和妈妈这些年从来没有为钱发过愁。  

        2006年我回家,爸爸跟我说:“我和你妈这些年一共攒了快二十万元钱了。你妈总希望我能再多活几年,她的目标是攒到三十万元,到我们走时给你们三个子女每人分十万元遗产。”我听了之后,又笑,又恼,又无可奈何。爸妈过惯了穷日子,二人不仅从不下饭馆,就是买菜也总挑最便宜的买。他们这二十万元真是一分钱一分钱省出来的。  

        2008年5月,我又回家。爸爸偷偷跟我说:“你妈的目标看来实现不了啦,我们的积蓄变成十二万元了。”原来妈妈为了提前实现三十万的目标,2007年6月份,在妹妹的怂恿下,拿了十万元进入股市。现在账面只剩两万多。  

        爸爸的烦恼  

       “你千万不要跟她提这事,一说炒股她就不给我做饭了。”爸爸笑着说。爸爸笑完,马上又说:“不过现在的情况还真让我有点担心,如果你有时间,我倒想跟你探讨一下。”  

        嘿,这可是爸爸少见的态度。我爸爸虽然只读过小学三年,但天性聪敏好学,十三岁做过会计学徒,十六岁做过日本劳工队的书记员,解放后还当过报纸主编。尽管后来被打成右派,但他五十年里从未间断过学习——每天读《参考消息》,手边总放着一本字典。  

        爸爸是一个真正有学问的人,知道术业有专攻,所以尽管面对的是儿子,他仍然拿出请教的态度,因为我毕竟有着两个经济类的硕士学位。有学位的人,往往不太把学位当回事,因为学位最大的价值莫过于让人知道自己无知;可是没有受过正规教育的爸爸,对学位往往保留着一丝敬畏。  

        我惊喜之余,还有点担心,希望爸爸的问题别太难,能让我不辜负我的学位。不知怎么回事,我53岁了,爸爸84岁,可是我还总像小孩子一样,依然渴望得到他更多的承认。  

        爸爸问:“什么叫滞胀?”  

        爸爸总是关心时髦问题,我笑了。  

       “就是经济增长慢了,物价反而增长快了。”我轻松地说。  

       “那我们长春现在是不是滞胀?”爸爸又问。  

        我说:“这个不一定,这要看综合经济数据,比如GDP增长速度、零售物价指数、失业率等等。”  

        爸爸说:“我看不懂那些数据,但我有几个指标,你看能不能说明问题。长春猪肉,2年前7元,现在15元;大米两年前1元钱,现在1元5;每天站在我们院外十字路口,挂牌子打零工的人,去年二三十人,今年增加到四五十人;我们家保姆,去年工资500元,今年你妈给涨到700元。”  

        我有点没把握地说:“这可能就是滞胀的一些苗头。”  

       “那在滞胀的情况下,我和你妈这样年龄人的积蓄怎么才能保值?我们不想赚大钱,只是想在死前,这些积蓄能保证我们的生活水平不下降,不至于给你们添麻烦。我和你妈还算好的,每月还能领到退休工资,这个院子里有些人就靠吃原来的积蓄,所以大家每天都在讨论怎样才能让自己的金融资产不贬值。”  

        爸爸嘴里总是与时俱进的词,说完后,他还刻意盯了我一下,好像是说:别以为老头什么也不知道。  

        完了,图穷匕首见!爸爸的真问题才露出来。我一下子懵住了,因为没想过。  

        儿子与父亲的PK  

        现在的股市情况,谁敢向他推荐股票投资?  

        稍有经济常识的人都知道,股票投资是战胜通货膨胀的最有效武器,从长期看,股票回报率一定优于债券、现金。其实股票投资也是战胜经济紧缩的有效武器,美国有个经济学家作了一个统计研究,他假设一个投资者,在上个世纪最严重的经济大萧条前的股市最高峰——1929年9月3日,买入美国道琼斯成份股,他的股票价值在随后的大熊市损失90%。可是如果他坚持25年不卖,当1954年道琼斯指数终于渡过历史上最长的熊市,重新回到1929年最高水平时,这个投资者的股票年投资回报率在扣除物价因素后仍然可以达到6%,远远高过同期美国经济的增长率。为什么会是如此,他的解释令人信服:经济紧缩,万物萧条,股票也便宜;如果股票投资者用股票产生的红利再投资,就会拥有更多股票;一旦经济走出萎缩,这些股票就身价不菲。正是因为如此,股票投资也是成功地战胜经济萎缩的法宝。  

        可惜,不论经济通胀、萎缩还是滞胀,股票投资必胜的前提是长期,这恰恰不适合我爸爸,他已经84岁了。  

        买黄金呢?尽管最近有本好像发现新大陆的书——《货币战争》,让不少中国人开始储藏黄金,可是真正的事实是:黄金价钱过去200年扣除通胀才涨了37%。19世纪初,一盎司黄金值30多美元,如果一个投资者1808年用35美元买了一盎司黄金,2008年8月他的重重重孙子,把这一盎司黄金传家宝卖掉,仅值800多美元。200年才涨了22倍!可是我爸爸吃的猪肉,2年就涨了1倍,再傻的投资顾问,也不能让我爸买黄金呀!  

        那就买房子吧,都说房地产保值。可是房地产变现能力差不说,房地产租金回报率太低,只比银行存款利率高一两个百分点;再加上当前房地产商好像奥运会的运动员一样,比着打折卖房子,让人总担心明天房价会更低。即使真有投资专家敢大胆地说:房价三年后有70%的可能会走出低谷,可是我爸爸的情况能承担那30%的不可能吗?  

        我更不能说:“你把钱放在银行吃利息和买点国库券吧。”因为他们的钱已经在银行存款和国库券上。如果是简单的经济萎缩,谁都知道持有现金是最好的投资,因为物价下降,同数量的现金会买更多的商品。这就是为什么上个世纪90年代,日本经济萎缩时银行曾向存款人反收利息的原因。可滞胀是经济萧条了,物价不萧条。正是每天的物价上涨,才让爸爸担心他的存款和国库券会贬值的。  

        可是我的学位,很难让我在爸爸面前轻易投降,因为我不想让他感到供我读学位的钱也滞胀了。于是,我所答非所问地说:“你那点钱就别再考虑什么金融资产投资保值的了,该怎么花,你就花吧。花光了,贬没了,你不还有三个孩子嘛?谁都会保证你晚年衣食不愁的。”  

        爸爸说:“你没有回答我的问题,其实十万元和十亿元是一个道理。我这十万元,你不知道怎么保值,给你十亿元,你也照样不知道。”  

        我当然不承认。我说:“金融资产保值问题,同你的年龄相连;因为你岁数太大了,很难有好办法。”  

        爸爸是个得理不让人的人,八十多岁依然不改。他一下子露出我太熟悉的那种较真不服好斗的神情,说:“快死的人的钱就不是钱吗?这种钱就只能眼看着变成纸?我看你这个经济学硕士也不怎么样!”  

        我看爸爸开始喘粗气,他有肺气肿。我马上投降,说:“爸,你这问题其实是经济学的大难题,我是真不知道怎么办。不仅我不知道,其实绝大多数专家也不知道怎么办,说知道怎么办的那少数几个,也是不懂装懂。”  

        爸爸笑了,他对成功挑战了我这个经济学硕士很高兴。然后,他眨眨眼告诉我说:“你知道你妈妈的方法是什么吗?咱家里本来有个大冰箱,我们两人根本用不了。结果她又买回一个大冰柜。在里面冻了五只鸡,十斤猪肉,十斤牛肉,五斤涮羊肉,五斤带鱼。不仅如此,还买回我一年吃的药;再加上一百斤大米和三十斤豆油。”  

        爸爸又说:“你妈妈真是个傻瓜。这些东西最多够我们俩吃半年的,根本解决不了我们积蓄贬值的问题。我跟她说过,如果吃的东西要涨价,你不应该去买股票,而应该买粮食期货。上个世纪30年代,东北闹粮荒时,你大伯父在哈尔滨炒大豆期货,就曾赚了一个车皮的大豆。结果有钱后,把乡下的媳妇扔了,找了个城里的小姐。”  

        我瞪大了眼睛问:“什么?你想让我妈去当国际炒家?你知不知道现在国际粮价飙升,就有人认为是国际炒家利用期货买空卖空兴风作浪!?”  

        爸爸说:“什么国际炒家?再笨的人都知道,地球上的粮食产量赶不上人吃的,现在城里人每天都要吃肉,听说生产一斤肉要消耗五斤粮食。不仅人消耗粮食多了,狗也多了,我们这个院子现在有二十几家养狗,狗吃的都比30年前人吃的好。因此,粮价一定会涨,可是最近我看报纸,怎么玉米期货又降价了,听说很多炒期货的人又亏钱了。因此,我也不敢再跟你妈说了,怕她真去炒期货,把这十万元再炒成两万。你妈前天还跟我嘀咕,说:老二要回来了,他是经济学硕士,又在香港做过生意,你问问他咱们这点积蓄怎么办?”  

        爸爸停顿一下,然后又自嘲地说:“人真有意思。以前没有积蓄,也没有这个烦恼;现在有点钱了,就开始为钱烦恼。”  

        国际难题  

        带着爸爸的难题,我2008年8月回到澳洲。经历了十年高速增长的澳洲也开始感到了滞胀。失业率开始抬头,汽油和食品价格的快速飙升已经让工薪阶层感到压力。受影响最大的自然也是没有继续赚钱能力的退休老人。  

        澳洲退休保险是强制的,雇主必须把雇员收入的9%作为退休金存起来,一人一户。这些退休金大都由政府认可的投资基金打理,当人们退休后就从此支取生活费。从2008年1月到现在,澳洲退休金整体缩水了10%,因为退休金有很大一部分投资在澳洲和世界股市上,所以澳洲老人的钱跟我爸爸的一样也少了。  

        春江水暖鸭先知,澳洲电视有一种中国见不到的广告,在滞胀的今天几乎见不到了,那就是专门针对老人的葬礼保险广告。“你每天只要付出一元钱,你就会有一个体面的葬礼,而且不会给你后人带来任何财务负担。”接着出现一个葬礼结束的酒会场面,你的后代端着酒杯,在你的遗像面前体面地招待那些送你最后一程的朋友和亲戚。我相信卖葬礼广告的保险公司,一定是发现今年买葬礼保险的澳洲老人比原来少了。这是常理,人今天都过不去,谁还管死的事?  

        我以前从来没有思考过滞胀下财产保值的问题,因为没有遇到过。于是,我开始向Google和百度请教,当我把“滞胀”、“投资策略”、“stagnation”和“investment strategy”敲进键盘,上百万搜索结果冒出来,选了几篇研究一番,没有一个观点让我信服能解决老人积蓄在滞胀下减少的问题。于是,我又向那些正在第一线帮人理财的专家们请教,我咨询了一个澳洲的持牌资深投资顾问,一个中国的基金经理,一个香港的投资银行家和一个在美国大学教金融的教授。结果四人的招法尽管有些不同,但最后都强调一点“目前的投资环境做什么都危险!现在的经济形势太诡异了,谁都看不懂!还是持有现金和流通性好的短期债券稳当一些!”  

        我又打电话给一个香港的老朋友,他是香港第一代持牌股票经纪人,他从上个世纪70年代开始做股票生意。  

       “什么看不懂!是当代人没有遇到过。”这位快60岁了,至今还做股票经纪的朋友,在电话里大声跟我说:“今天的经济形势同70年代石油危机引起的滞胀很相似,72年香港刚入行做股票经纪的新人,年底奖金就能发36个月的;73年股市从1700点跌到150点,经济萧条,可是物价却飞涨;股票几乎没有交易了,很多经纪人为了维生都跑到制衣厂剪线头去了。我告诉你吧,在滞胀情况下,没有避风港,谁的钱都要少,别说你爸那点积蓄,就是巴菲特的投资组合和中国政府那上万亿的外汇储备也得缩水呀。”  

        放下电话,我好半天没说出话来。难道爸爸的烦恼是个无解之题——滞胀下,金融财产无法保值?  

    如果是这样,妈妈的冰柜、澳洲老人不买葬礼保险真就是没有办法的办法。老人资产同年轻人的不同,老人资产投资期短,经不起大风雨;今天亏了,就是亏了,只有今天节衣缩食;因为老人没有明天。任何人如果不死,从理论上都有可能成为比尔·盖茨;如果知道自己能成为世界首富,谁还会节衣缩食?  

        所以伟大的凯恩斯留下那句永远挑战投资者的名言:“从长期看我们都会死的。”  

        记得一个朋友曾同我探讨过财富问题。  

        他问我:“什么叫富有?”  

        我说:“就是钱多。”  

        “多少钱算富有?”他又问。  

        “越多越好。”我回答。  

        他说:“不对,准确地说:一个人是否富有,不是看他死的时候银行存折上有多少钱,而是看他活的时候花了多少钱。”我觉得他的道理挺新鲜,有一次回家看到爸妈那么节省,就把这个道理讲给他们听。爸爸听完后说:“他知道个屁!他到我这个岁数就知道了,我现在担心的不是生前花多少钱,而是把钱花完了,我还没死!”  

        以前听人说:“人越老越贪财。”不理解。现在懂了,是因为恐惧。  

        文章写到此,电视新闻刚好传来刘翔退出比赛的消息。太意外了!人都以为能掌握命运,其实命运是天定的。此时此刻,外面正下大雨,从奥运会开幕到现在,墨尔本已连续下了11天雨,真希望大雨不停,结束澳洲百年大旱,让小麦大大丰收,降低世界粮价,舒缓经济滞胀,减轻爸爸的烦恼。  

    Posted Sep 16 2008, 07:44 PM by wicky with 1 comment(s)
    Filed under:
  • 如何有效地报告Bug


    http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html

    作者:Simon Tatham 专业的自由软件程序员

    翻译:Dasn

    [ English | Português | 简体中文 | Česky | Dansk | Deutsch | Español | Français | Magyar | Italiano | Nederlands | Polski | Русский | 繁體中文 ]

    引言

    为公众写过软件的人,大概都收到过很拙劣的bug(计算机程序代码中的错误或程序运行时的瑕疵——译者注)报告,例如:

    在报告中说“不好用”;

    所报告内容毫无意义;

    在报告中用户没有提供足够的信息;

    在报告中提供了错误信息;

    所报告的问题是由于用户的过失而产生的;

    所报告的问题是由于其他程序的错误而产生的;

    所报告的问题是由于网络错误而产生的;

    这便是为什么“技术支持”被认为是一件可怕的工作,因为有拙劣的bug报告需要处理。然而并不是所有的bug报告都令人生厌:我在业余时间维护自由软件,有时我会收到非常清晰、有帮助并且“有内容”的bug报告。

    在这里我会尽力阐明如何写一个好的bug报告。我非常希望每一个人在报告bug之前都读一下这篇短文,当然我也希望用户在给报告bug之前已经读过这篇文章。

    简单地说,报告bug的目的是为了让程序员看到程序的错误。您可以亲自示范,也可以给出能导致程序出错的、详尽的操作步骤。如果程序出错了,程序员会收集额外的信息直到找到错误的原因;如果程序没有出错,那么他们会请您继续关注这个问题,收集相关的信息。

    在bug报告里,要设法搞清什么是事实(例如:“我在电脑旁”和“XX出现了”)什么是推测(例如:“我问题可能是出在……”)。如果愿意的话,您可以省去推测,但是千万别省略事实。

    当您报告bug的时候(既然您已经这么做了),一定是希望bug得到及时修正。所以此时针对程序员的任何过激或亵渎的言语(甚至谩骂)都是与事无补的——因为这可能是程序员的错误,也有可能是您的错误,也许您有权对他们发火,但是如果您能多提供一些有用的信息(而不是激愤之词)或许bug会被更快的修正。除此以外,请记住:如果是免费软件,作者提供给我们已经是出于好心,所以要是太多的人对他们无礼,他们可能就要“收起”这份好心了。

    “程序不好用”

    程序员不是弱智:如果程序一点都不好用,他们不可能不知道。他们不知道一定是因为程序在他们看来工作得很正常。所以,或者是您作过一些与他们不同的操作,或者是您的环境与他们不同。他们需要信息,报告bug也是为了提供信息。信息总是越多越好。

    许多程序,特别是自由软件,会公布一个“已知bug列表”。如果您找到的bug在列表里已经有了,那就不必再报告了,但是如果您认为自己掌握的信息比列表中的丰富,那无论如何也要与程序员联系。您提供的信息可能会使他们更简单地修复bug。

    本文中提到的都是一些指导方针,没有哪一条是必须恪守的准则。不同的程序员会喜欢不同形式的bug报告。如果程序附带了一套报告bug的准则,一定要读。如果它与本文中提到的规则相抵触,那么请以它为准。

    如果您不是报告bug,而是寻求帮助,您应该说明您曾经到哪里找过答案,(例如:我看了第四章和第五章的第二节,但我找不到解决的办法。)这会使程序员了解用户喜欢到哪里去找答案,从而使程序员把帮助文档做得更容易使用。

    “演示给我看”

    报告bug的最好的方法之一是“演示”给程序员看。让程序员站在电脑前,运行他们的程序,指出程序的错误。让他们看着您启动电脑、运行程序、如何进行操作以及程序对您的输入有何反应。

    他们对自己写的软件了如指掌,他们知道哪些地方不会出问题,而哪些地方最可能出问题。他们本能地知道应该注意什么。在程序真的出错之前,他们可能已经注意到某些地方不对劲,这些都会给他们一些线索。他们会观察程序测试中的每一个细节,并且选出他们认为有用的信息。

    这些可能还不够。也许他们觉得还需要更多的信息,会请您重复刚才的操作。他们可能在这期间需要与您交流一下,以便在他们需要的时候让bug重新出现。他们可能会改变一些操作,看看这个错误的产生是个别问题还是相关的一类问题。如果您不走运,他们可能需要坐下来,拿出一堆开发工具,花上几个小时来好好地研究一下。但是最重要的是在程序出错的时候让程序员在电脑旁。一旦他们看到了问题,他们通常会找到原因并开始试着修改。

    “告诉我该怎么做”

    如今是网络时代,是信息交流的时代。我可以点一下鼠标把自己的程序送到俄罗斯的某个朋友那里,当然他也可以用同样简单的方法给我一些建议。但是如果我的程序出了什么问题,我不可能在他旁边。“演示”是很好的办法,但是常常做不到。

    如果您必须报告bug,而此时程序员又不在您身边,那么您就要想办法让bug重现在他们面前。当他们亲眼看到错误时,就能够进行处理了。

    确切地告诉程序员您做了些什么。如果是一个图形界面程序,告诉他们您按了哪个按钮,依照什么顺序按的。如果是一个命令行程序,精确的告诉他们您键入了什么命令。您应该尽可能详细地提供您所键入的命令和程序的反应。

    把您能想到的所有的输入方式都告诉程序员,如果程序要读取一个文件,您可能需要发一个文件的拷贝给他们。如果程序需要通过网络与另一台电脑通讯,您或许不能把那台电脑复制过去,但至少可以说一下电脑的类型和安装了哪些软件(如果可以的话)。

    “哪儿出错了?在我看来一切正常哦!”

    如果您给了程序员一长串输入和指令,他们执行以后没有出现错误,那是因为您没有给他们足够的信息,可能错误不是在每台计算机上都出现,您的系统可能和他们的在某些地方不一样。有时候程序的行为可能和您预想的不一样,这也许是误会,但是您会认为程序出错了,程序员却认为这是对的。

    同样也要描述发生了什么。精确的描述您看到了什么。告诉他们为什么您觉得自己所看到的是错误的,最好再告诉他们,您认为自己应该看到什么。如果您只是说:“程序出错了”,那您很可能漏掉了非常重要的信息。

    如果您看到了错误消息,一定要仔细、准确的告诉程序员,这确实很重要。在这种情况下,程序员只要修正错误,而不用去找错误。他们需要知道是什么出问题了,系统所报的错误消息正好帮助了他们。如果您没有更好的方法记住这些消息,就把它们写下来。只报告“程序出了一个错”是毫无意义的,除非您把错误消息一块报上来。

    特殊情况下,如果有错误消息号,一定要把这些号码告诉程序员。不要以为您看不出任何意义,它就没有意义。错误消息号包含了能被程序员读懂的各种信息,并且很有可能包含重要的线索。给错误消息编号是因为用语言描述计算机错误常常令人费解。用这种方式告诉您错误的所在是一个最好的办法。

    在这种情形下,程序员的排错工作会十分高效。他们不知道发生了什么,也不可能到现场去观察,所以他们一直在搜寻有价值的线索。错误消息、错误消息号以及一些莫名其妙的延迟,都是很重要的线索,就像办案时的指纹一样重要,保存好。

    如果您使用UNIX系统,程序可能会产生一个内核输出(coredump)。内核输出是特别有用的线索来源,别扔了它们。另一方面,大多数程序员不喜欢收到含有大量内核输出文件的EMAIL,所以在发邮件之前最好先问一下。还有一点要注意:内核输出文件记录了完整的程序状态,也就是说任何秘密(可能当时程序正在处理一些私人信息或秘密数据)都可能包含在内核输出文件里。

    “出了问题之后,我做了……”

    当一个错误或bug发生的时候,您可能会做许多事情。但是大多数人会使事情变的更糟。我的一个朋友在学校里误删了她所有的Word文件,在找人帮忙之前她重装了Word,又运行了一遍碎片整理程序,这些操作对于恢复文件是毫无益处的,因为这些操作搞乱了磁盘的文件区块。恐怕在这个世界上没有一种反删除软件能恢复她的文件了。如果她不做任何操作,或许还有一线希望。

    这种用户仿佛一只被逼到墙角的鼬(黄鼠狼、紫貂一类的动物——译者注):背靠墙壁,面对死亡的降临奋起反扑,疯狂攻击。他们认为做点什么总比什么都不做强。然而这些在处理计算机软件问题时并不适用。

    不要做鼬,做一只羚羊。当一只羚羊面对料想不到的情况或受到惊吓时,它会一动不动,是为了不吸引任何注意,与此同时也在思考解决问题的最好办法(如果羚羊有一条技术支持热线,此时占线。)。然后,一旦它找到了最安全的行动方案,它便去做。

    当程序出毛病的时候,立刻停止正在做的任何操作。不要按任何健。仔细地看一下屏幕,注意那些不正常的地方,记住它或者写下来。然后慎重地点击“确定” 或“取消”,选择一个最安全的。学着养成一种条件反射——一旦电脑出了问题,先不要动。要想摆脱这个问题,关掉受影响的程序或者重新启动计算机都不好,一个解决问题的好办法是让问题再次产生。程序员们喜欢可以被重现的问题,快乐的程序员可以更快而且更有效率的修复bug。

    “我想粒子的跃迁与错误的极化有关”

    并不只是非专业的用户才会写出拙劣的bug报告,我见过一些非常差的bug报告出自程序员之手,有些还是非常优秀的程序员。

    有一次我与另一个程序员一起工作,他一直在找代码中的bug,他常常遇到一个bug,但是不会解决,于是就叫我帮忙。“出什么毛病了?”我问。而他的回答却总是一些关于bug的意见。如果他的观点正确,那的确是一件好事。这意味着他已经完成了工作的一半,并且我们可以一起完成另一半工作。这是有效率并有用的。

    但事实上他常常是错的。这就会使我们花上半个小时在原本正确的代码里来回寻找错误,而实际上问题出在别的地方。我敢肯定他不会对医生这么做。“大夫,我得了Hydroyoyodyne(真是怪病——译者),给我开个方子”,人们知道不该对一位医生说这些。您描述一下症状,哪个地方不舒服,哪里疼、起皮疹、发烧……让医生诊断您得了什么病,应该怎样治疗。否则医生会把您当做疑心病或精神病患者打发了,这似乎没什么不对。

    做程序员也是一样。即便您自己的“诊断”有时真的有帮助,也要只说“症状”。“诊断”是可说可不说的,但是“症状”一定要说。同样,在bug报告里面附上一份针对bug而做出修改的源代码是有用处的,但它并不能替代bug报告本身。

    如果程序员向您询问额外的信息,千万别应付。曾经有一个人向我报告bug,我让他试一个命令,我知道这个命令不好用,但我是要看看程序会返回一个什么错误(这是很重要的线索)。但是这位老兄根本就没试,他在回复中说“那肯定不好用”,于是我又花了好些时间才说服他试了一下那个命令。

    用户多动动脑筋对程序员的工作是有帮助的。即使您的推断是错误的,程序员也应该感谢您,至少您去帮助他们,使他们的工作变的更简单。不过千万别忘了报告“症状”,否则只会使事情变得更糟。

    “真是奇怪,刚才还不好用,怎么现在又好了?”

    “间歇性错误”着实让程序员发愁。相比之下,进行一系列简单的操作便能导致错误发生的问题是简单的。程序员可以在一个便于观察的条件下重复那些操作,观察每一个细节。太多的问题在这种情况下不能解决,例如:程序每星期出一次错,或者偶然出一次错,或者在程序员面前从不出错(程序员一离开就出错。——译者)。当然还有就是程序的截止日期到了,那肯定要出错。

    大多数“间歇性错误”并不是真正的“间歇”。其中的大多数错误与某些地方是有联系的。有一些错误可能是内存泄漏产生的,有一些可能是别的程序在不恰当的时候修改某个重要文件造成的,还有一些可能发生在每一个小时的前半个小时中(我确实遇到过这种事情)。

    同样,如果您能使bug重现,而程序员不能,那很有可能是他们的计算机和您的计算机在某些地方是不同的,这种不同引起了问题。我曾写过一个程序,它的窗口可以蜷缩成一个小球呆在屏幕的左上角,它在别的计算机上只能在 800x600 的解析度工作,但是在我的机器上却可以在 1024x768 下工作。

    程序员想要了解任何与您发现的问题相关的事情。有可能的话您到另一台机器上试试,多试几次,两次,三次,看看问题是不是经常发生。如果问题出现在您进行了一系列操作之后,不是您想让它出现它就会出现,这就有可能是长时间的运行或处理大文件所导致的错误。程序崩溃的时候,您要尽可能的记住您都做了些什么,并且如果您看到任何图形,也别忘了提一下。您提供的任何事情都是有帮助的。即使只是概括性的描述(例如:当后台有EMACS运行时,程序常常出错),这虽然不能提供导致问题的直接线索,但是可能帮助程序员重现问题。

    最重要的是:程序员想要确定他们正在处理的是一个真正的“间歇性错误”呢,还是一个在另一类特定的计算机上才出现的错误。他们想知道有关您计算机的许多细节,以便了解您的机器与他们的有什么不同。有许多细节都依仗特定的程序,但是有一件东西您一定要提供——版本号。程序的版本、操作系统的版本以及与问题有关的程序的版本。

    “我把磁盘装进了 Windows……”

    表意清楚在一份bug报告里是最基本的要求。如果程序员不知道您说的是什么意思,那您就跟没说一样。我收到的bug报告来自世界各地,有许多是来自非英语国家,他们通常为自己的英文不好而表示歉意。总的来说,这些用户发来的bug报告通常是清晰而且有用的。几乎所有不清晰的bug报告都是来自母语是英语的人,他们总是以为只要自己随便说说,程序员就能明白。

    • 精确。如果做相同的事情有两种方法,请说明您用的是哪一种。例如:“我选择了‘载入’”,可能意味着“我用鼠标点击‘载入’”或“我按下了‘ALT+L’”,说清楚您用了哪种方法,有时候这也有关系。
    • 详细。信息宁多毋少!如果您说了很多,程序员可以略去一部分,可是如果您说的太少,他们就不得不回过头再去问您一些问题。有一次我收到了一份bug报告只有一句话,每一次我问他更多事情时,他每次的回复都是一句话,于是我花了几个星期的时间才得到了有用的信息。
    • 慎用代词。诸如“它”,“窗体”这些词,当它们指代不清晰的时候不要用。来看看这句话:“我运行了FooApp,它弹出一个警告窗口,我试着关掉它,它就崩溃了。”这种表述并不清晰,用户究竟关掉了哪个窗口?是警告窗口还是整个FooApp程序?您可以这样说,“我运行FooApp程序时弹出一个警告窗口,我试着关闭警告窗口,FooApp崩溃了。”这样虽然罗嗦点,但是很清晰不容易产生误解。
    • 检查。重新读一遍您写的bug报告,觉得它是否清晰?如果您列出了一系列能导致程序出错的操作,那么照着做一遍,看看您是不是漏写了一步。

    小结:

    • bug报告的首要目的是让程序员亲眼看到错误。如果您不能亲自做给他们看,给他们能使程序出错的详细的操作步骤。
    • 如果首要目的不能达成,程序员不能看到程序出错。这就需要bug报告的第二个目的来描述程序的什么地方出毛病了。详细的描述每一件事情:您看到了什么,您想看到什么,把错误消息记下来,尤其是“错误消息号”。
    • 当您的计算机做了什么您料想不到的事,不要动!在您平静下来之前什么都别做。不要做您认为不安全的事。
    • 尽量试着自己“诊断”程序出错的原因(如果您认为自己可以的话)。即使做出了“诊断”,您仍然应该报告“症状”。
    • 如果程序员需要,请准备好额外的信息。如果他们不需要,就不会问您要。他们不会故意为难自己。您手头上一定要有程序的版本号,它很可能是必需品。
    • 表述清楚,确保您的意思不能被曲解。
    • 总的来说,最重要的是要做到精确。程序员喜欢精确。

    声明:我从没有真的看见过鼬和羚羊,我的比喻可能不恰当。

    版权所有 Simon Tatham 1999

    本文属于OPL(OpenContent License),请在复制和使用本文时自觉遵守OPL。

    对本文的任何意见和批评请发送至:

    英文版:anakin@pobox.com
    中文版:dasn@users.sf.net

    Posted Sep 12 2008, 12:01 PM by wicky with no comments
    Filed under:
  • 提问的智慧

     经常有人问我:
    为什么XX程序出错不能运行了?  为什么连接不到XX数据库了?  为什么XX网站不能连接了? 为什么XX网页出错了?  ...

    通常,我静默5秒钟,在发现对方没有任何意图继续阐述更加具体的状况时,我不得不反问:
    顶!问得专业一点好不好?(这一句一般只在心里说)有什么错误现象?

    我承认我很烦很多时候必须做这个无谓的反问,作为一个“专业”的开发人员,我们必须学会提问的技巧,学会简要清晰单刀直入地描述问题。

    Copyright (C) 2001 by Eric S. Raymond
    中文版Copyleft 2001 by D.H.Grand(nOBODY/Ginux)

    英文版:http://www.tuxedo.org/~esr/faqs/smart-questions.html
    感谢Eric的耐心指点和同意,本文才得以完成并发布,本指南
    英文版版权为Eric Steven Raymond所有,
    中文版版权由D.H.Grand[nOBODY/Ginux]所有。
    CCF修改版版权由CCF论坛所有。


    在技术世界里,当提出一个技术问题时,你能得到怎样的回答?这取决于挖出答案的难度,同样取决于你提问的方法。本指南旨在帮助你提高发问技巧,以获取你最想要的答案。

    首先你必须明白,论坛的高手们一般比较偏爱艰巨的任务,或者能激发他们思维的好问题。如若不然,我们还来干吗?如果你有值得我们反复咀嚼玩味的好问题,我们自会对你感激不尽。好问题是激励,是厚礼,可以提高我们的理解力,而且通常会暴露我们以前从没意识到或者思考过的问题。对高手而言,“问得好!”是发自内心的大力称赞。

    尽管高手们有蔑视简单问题和不友善的坏名声,有时看起来似乎我们对新手,对知识贫乏者怀有敌意,但其实不是那样的。我们不想掩饰对这样一些人的蔑视--他们不愿思考,或者在发问前不去完成他们应该做的事。这种人只会谋杀时间--他们只愿索取,从不付出,无端消耗我们的时间,而我们本可以把时间用在更有趣的问题或者更值得回答的人身上。我们称这样的人为“失败者”(由于历史原因,我们有时把它拼作“lusers”)。

    我们在很大程度上属于志愿者,从繁忙的生活中抽出时间来解惑答疑,而且时常被提问淹没。所以我们无情的滤掉一些话题,特别是抛弃那些看起来象失败者的家伙,以便更高效的利用时间来回答胜利者的问题。

    如果你觉得我们过于傲慢的态度让你不爽,让你委屈,不妨设身处地换个角度来想想。我们并没有要求你向我们问问题--事实上,我们中的大多数人最喜欢公平一点罢了,只要你付出小小努力来做到最基本的要求,我们就会欢迎你的问题。但让我们帮助那些不愿意帮助自己的人是没有
    意义的。如果你不能接受这种“歧视”,我们建议你花点钱找家商业公司签个技术支持协议得了,别向义务的技术高手乞求帮助。

    如果你决定向我们求助,当然不希望被视为失败者,更不愿成为失败者中的一员。立刻得到有效答案的最好方法,就是象胜利者那样提问--聪明、自信、有解决问题的思路,只是偶尔在特定的问题上需要获得一点帮助。


    ========
    【提问之前】
    ========


    在到本论坛提出技术问题前,检查你有没有做到:
    1. 通读技术文档,试着自己找答案。
    2. 在FAQ里找答案(一份维护得好的FAQ可以包罗万象:)。
    3. 在网上搜索(个人推荐google~~~)。

    当你提出问题的时候,首先要说明在此之前你干了些什么,不要问那些能够能从文档上直接找到的答案,因为高手不应该总为你去查文档,你的问题应该集中到文档上没有的经验型的问题!

    注意树立你的形象:你不是一个妄图不劳而获的乞讨者,不愿浪费别人的时间,这也让大家看到了你的努力和曾经的尝试,从很多方面可以简化别人试图解决问题的尝试次数。如果提问者能从答案中学到东西,我们更乐于回答他的问题。

    周全的思考,准备好你的问题,草率的发问只能得到草率的回答,或者根本得不到任何答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。

    小心别问错了问题。如果你的问题基于错误的假设,普通黑客(J. Random Hacker)通常会用无意义的字面解释来答复你,心里想着“蠢问题...”,希望着你会从问题的回答(而非你想得到的答案)中汲取教训。 还有就是很多人看了太多的这类愚蠢的问题肯定会变的愤怒而用冷嘲热讽的方式来打击你,甚至更有带着脏话的谩骂。。

    决不要自以为够资格得到答案,你没这种资格。毕竟你没有为这种服务支付任何报酬。你要自己去“挣”回一个答案,靠提出一个有内涵的,有趣的,有思维激励作用的问题--一个对社区的经验有潜在贡献的问题,而不仅仅是被动的从他人处索要知识--去挣到这个答案。

    另一方面,表明你愿意在找答案的过程中做点什么,是一个非常好的开端。“谁能给点提示?”、“我这个例子里缺了什么?”以及“我应该检查什么地方?”比“请把确切的过程贴出来”更容易得到答复。因为你显得只要有人指点正确的方向,你就有完成它的能力和决心。


    ========
    【怎样提问】
    ========


    ------------
    【谨慎选择论坛】
    ------------

    小心选择提问的场合。如果象下面描述的那样,你很可能被忽略掉或者被看作失败者:
    1. 在风马牛不相及的论坛贴出你的问题
    2. 在探讨高级技巧的论坛张贴非常初级的问题;反之亦然
    3. 一贴多发是严禁的

    ----------------------------
    【用辞贴切,语法正确,拼写无误 】
    ----------------------------

    我们从经验中发现,粗心的写作者通常也是马虎的思考者(我敢打包票)。 仔细的描述你的问题的环境,和发生的时间,次数等,精确的粘贴错误信息,所有这些都是你得到答案的必要帮助,回答粗心大意者的问题很不值得,我们宁愿把时间耗在别处。

    正确的拼写,标点符号和大小写很重要。更一般的说,如果你的提问写得象个半文盲,你很有可能被忽视。

    ----------------------------
    【使用含义丰富,描述准确的标题 】
    ----------------------------

    在论坛中,带有分类的大约20字以内的清晰主题标题是抓住高手注意力的黄金时机。别用喋喋不休的“帮帮忙”(更别说“救命啊!!!!!”这样让人反感的话)来浪费这个机会。不要妄想用你的痛苦程度来打动我们,别用空格代替问题的描述,哪怕是极其简短的描述。

    引用:
    蠢问题:
    救命啊!我的膝上机不能正常显示了!

    聪明问题:
    XFree86 4.1下鼠标光标变形,Fooware MV1005的显示芯片。

    ------------------
    【精确描述,信息量大】
    ------------------

    1. 谨慎明确的描述症状。
    2. 提供问题发生的环境(机器配置、操作系统、应用程序以及别的什么)。
    3. 说明你在提问前是怎样去研究和理解这个问题的。
    4. 说明你在提问前采取了什么步骤去解决它。
    5. 罗列最近做过什么可能有影响的硬件、软件变更。

    尽量想象一个高手会怎样反问你,在提问的时候预先给他答案。

    Simon Tatham写过一篇名为《如何有效的报告Bug》的出色短文。强力推荐你也读一读。

    --------
    【话不在多】
    --------

    你需要提供精确有效的信息。这并不是要求你简单的把成吨的出错代码或者数据完全转储摘录到你的提问中。如果你有庞大而复杂的测试条件,尽量把它剪裁得越小越好。

    这样做的用处至少有三点。第一,表现出你为简化问题付出了努力,这可以使你得到回答的机会增加;第二,简化问题使你得到有用答案的机会增加;第三,在提炼你的bug报告的过程中,也许你自己就能找出问题所在或作出更正。

    ------------------
    【只说症状,不说猜想】
    ------------------

    告诉高手们你认为问题是怎样引起的没什么帮助。(如果你的推断如此有效,还用向别人求助吗?),因此要确信你原原本本告诉了他们问题的症状,不要加进你自己的理解和推论。让高手们来诊断吧。

    引用:
    蠢问题:
    我在内核编译中一次又一次遇到SIG11错误,我怀疑某条飞线搭在主板的走线上了, 这种情况应该怎样检查最好?

    聪明问题:
    我自制的一套K6/233系统,主板是FIC-PA2007 (VIA Apollo VP2芯片组),256MB
    Corsair PC133 SDRAM,在内核编译中频频产生SIG11错误,从开机20分钟以后就有这种情况,开机前20分钟内从没发生过。重启也没有用,但是关机一晚上就又能工作20分钟。所有
    内存都换过了,没有效果。相关部分的典型编译记录如下...。


     

    引用:
    蠢问题:
    我的ASP程序突然不工作了?救命呀

    聪明问题:
    今天开始调试ASP程序的时候突然显示错误,错误信息是“你没有足够的权限来执行这个文件操作,错误代码0X0008045,在行45”,我已经搜索过MSDN,错误可能发生的原因已经检查过了,但没有搞明白为什么,行45的程序是这样的。。我的环境是Win2000Server, IIS5, NTFS文件系统,这个程序的源程序如下。。

    ------------------
    【按时间顺序列出症状】
    ------------------

    对找出问题最有帮助的线索,往往就是问题发生前的一系列操作,因此,你的说明应该包含操作步骤,以及电脑的反应,直到问题产生。

    如果你的说明很长(超过四个段落),在开头简述问题会有所帮助,接下来按时间顺序详述。这样黑客们就知道该在你的说明中找什么。

     

    Posted Sep 12 2008, 11:38 AM by wicky with no comments
    Filed under:
  • Web Application Stress Tool

    http://www.microsoft.com/downloads/details.aspx?FamilyID=E2C0585A-062A-439E-A67D-75A89AA36495&displaylang=en

    The Microsoft WAS web stress tool is designed to realistically simulate multiple browsers requesting pages from a web site. You can use this tool to gather performance and stability information about your web application. This tool simulates a large number of requests with a relatively small number of client machines. The goal is to create an environment that is as close to production as possible so that you can find and eliminate problems in the web application prior to deployment.

    Posted Sep 11 2008, 07:15 PM by wicky with 1 comment(s)
    Filed under:
  • Silverlight: A few thoughts on minimizing CPU usage

    http://blogs.msdn.com/seema/archive/2007/08/09/silverlight-a-few-thoughts-on-minimizing-cpu-usage.aspx

    The first two suggestions will have the most drastic improvement on the performance of your Silverlight application, and can affect CPU usage, framerate, and application responsiveness.

     

    1.       IsWindowless=false is faster

    Do not turn on isWindowless unless your design requires overlay of other HTML content on top of Silverlight content.

     

    2.       Opaque Background is faster

    Do not set a transparent channel in the Silverlight HTML control background property. Setting the background to a transparent or semi-transparent value will add tremendous cost as each render call is forced through the blending pipeline, regardless if the transparency has any visual effect. (A background of 0, transparent, #11aabbcc, etc. will cause blending)

     

    If you simply want to set the control’s background property to match that of the HTML, background:document.body.style.backgroundColor will suffice.

     Note: I am referring to the background of the Silverlight HTML control. Setting an opacity on elements within your Silverlight app has relatively minimal cost. Note: if you do decide to use transparency, please make sure to test the performance on Mac:Safari. 

    3.       Only offer the quality that is needed for your design.

    -          Framerate: you can set the max framerate for the entire contents of the control in properties. Many websites run all animations and media at ~15fps, and most users do not notice.
    Note: I set the value of the
    framerate property below.

    -          Media: When encoding your media file, remember that the average media file on the web is roughly encoded at 320x230, with ~15fps.

    4.       Test & Debug

    -          Quality and performance vary on different machines, and even on different OS/browser configurations.

    -          The below onLoadHandler shows how to display the framerate, for debugging purposes, in IE or Safari’s status bar. If your desired framerate is out of reach, you should set the framerate property lower so as not to peg the user’s CPU.

     
    Sys.Silverlight.createObjectEx({source: "xaml/Scene.xaml",parentElement: document.getElementById("SilverlightControlHost"),id: "SilverlightControl",properties: {width: "500",height: "500",background: "black", //NO ALPHA =)version: "0.9",framerate: 15    //only as much as needed},

    events: { onLoad:onLoadHandler} });

     function onLoadHandler() {/* To see the framerate displayed in the browser status bar */agControl = document.getElementById("SilverlightControl");agControl.settings.EnableFrameRateCounter = true;} 
  • 残奥会点火