Scratz's profileScratz 的小果园PhotosBlogListsMore Tools Help

Blog


    4/23/2007

    处理文本字段事件

      这次的客户端程序,按照上头的意思,不要对原版作过多的修改,所以参数设置组件几乎全部在主窗体上,尽管我不赞成这种做法。带来的一个问题就是,如何适当处理文本字段(JTextField)的事件?
      在普通的程序中,文本字段基本上都位于单独的对话框中,通过单击“确定”按钮提交更改。但我这次却不能在主窗体中添加一个按钮来处理,一是美观问题,二是一共 6 个文本字段,3 行 2 列,也没有按钮的容身之处。
      首先想到的是,向文本字段添加操作事件侦听器(ActionListener),这样就可以通过按下回车键提交更改,也正好在此时检查输入的有效性,如果无效就给出提示并恢复到输入前的值。这里顺便说一下有效性检查,除了我这样,也可以用格式化的文本字段(JFormattedTextField)限制输入。
      但是 6 个文本字段都修改就要按 6 次回车键,好像很不方便,于是又想到了焦点侦听器(FocusListener),在当前编辑的文本字段失去焦点时提交更改。写好后,发现还是和预期有差距:要使文本字段失去焦点,不能单纯在外面点一下鼠标,而必须在另外的可获取焦点的组件(例如文本字段、组合框等)上或整个程序窗口外单击。这应该能通过适当的编程修正,但目前还没想出来。
      现在有了两个侦听器,也算差强人意了。但在添加右键菜单时又出问题了,因为鼠标一放在右键菜单上,文本字段就失去焦点并提交更改了,所以最后还是忍痛去掉了右键菜单。
      今天折腾下来,只能算凑合,再想想看吧。
    4/22/2007

    街上很多伸手要钱的人

      一般的乞丐少了,如今到处都是“不治之症”、“哭诉无门”、“全家横祸”……人或昂首挺胸或低头不语,身前是打印或者用粉笔写在地上的“个人简历”,奢侈一点的还有个放音机重复着不痛不痒的“哀告”。
      目前的部分结论是:如果里面有小孩(多半神志昏迷),那是被不良分子所控制逼迫;如果有老人,那是老江湖;如果有惨不忍睹的残疾人,那是化装;如果是健康的年轻人,还有什么好说的呢?可是有人明知道是骗子甚至歹徒还要给钱充好人,这就叫助纣为虐。
      要整治打击不是不可能,但更要防止死灰复燃,教育“好心人”明辨是非。还有个昏招就是像某些西方国家一样把乞讨职业化,但不大可能在中国实施。
      因此,问题最关键的地方还是在于,他们的目的只是钱,如果没人“施舍”,也就自然消亡了。
    4/17/2007

    《三国志》和《三国演义》的 100 个差别

    网上找到的,重新整理排版。
    1. 桃源结义:正史并无写到三人有结拜,只提到情若兄弟(关羽年龄比刘备大)。
    2. 温酒斩华雄:华雄死于江东猛虎孙坚刀下,《三国演义》反把孙坚写成是华雄的手下败将,这对孙坚太不公平了。
    3. 三英战吕布:吕布实被孙坚击退。公孙瓒没有参加讨董联盟,所以刘、关、张也未曾参加,也就不会有虎牢关三英战吕布。
    4. 十八路诸侯讨董卓:只有后将军袁术、冀州牧韩馥、豫州刺史孔伷、衮州刺史刘岱、河内太守王匡、勃海太守袁绍、陈留太守张邈、东郡太守桥瑁、山阳太守袁遗、济北相鲍信、广陵太守张超、长沙太守孙坚和曹操。只有这十三家,孔融当时正忙于对付黄巾贼,不可能分身去讨董;陶谦当时只贡献了一些金钱,并无参加战役;马腾当时尚未接受招安,怎可以参加讨董行列?当时公孙瓒正要对付乌桓,亦不可能参加讨董行列;至于张杨当时和刘备一样,只是义勇军,而刘备当时亦只是跟随出证。
    5. 斩颜良、诛文丑:斩颜良确有其事,诛文丑却是曹操的部下所为。
    6. 张飞鞭督邮:实乃刘备所为。
    7. 徐州诛车冑、古城斩蔡阳:此乃刘备所为。
    8. 土山约三事:那次战役关羽是战败被擒,并非有“土山约三事”如此堂皇之事。
    9. 曹操献刀杀董卓:曹操认为卓终必败,不领董卓情,逃归乡里。曹操献刀,不见正史,应是虚构。
    10. 连环计:无记载有貂蝉之人;吕布与董卓争夺一婢女而起。
    11. 关羽降曹:无特别记载应为自愿。《三国演义》所编造的关羽投降的一个重要原因,是为了“保护二皇嫂”,但这是与史实不符的。根据史书记载,刘备到徐州后,屯兵小沛,命关羽守下邳。刘备的妻子应该随刘备住在小沛,而不是住在下邳。曹兵进攻小沛时,刘备战败逃走,妻子在小沛被俘,而不是随关羽在下邳投降的。也就是说,关羽在投降时,身边并没有什么“二皇嫂”。
    12. 过五关斩六将:此五关相距甚远,也无联系,虚构剧情。关羽离开曹操后,直接从许昌南下往汝南投奔刘备,并未发生过五关斩六将之事。
    13. 被斩的六将:三演说被斩的六将是孔秀、孟坦、韩福、卞喜、王植和秦琪,而这几个人都不见史书记载,连名字也是虚构的。他们的出场只有一个任务,就是挨关老爷一刀。
    14. 孙坚之死:孙坚死于砚山。由于单骑轻出,只带几名随从,遭黄祖设伏以落石及流矢射死。
    15. 孙策之死:实乃遭刺客暗算,不治。在攻打陈登的途中亦是单骑轻出,不过更夸张,只有自己一个人去打猎,无巧不巧被许贡的三名家客给盯上(许贡死于孙策之手),即使孙策骁勇,但脸上一箭受创极深,虽有黄盖等人后来极力抢救,但仍回天乏术。
    16. 徐庶之智:徐庶在正史上记载太少,无名过客而已。
    17. 徐庶进曹营:曹操南征,刘备和诸葛亮、徐庶等南逃,乱军中,徐母被俘,于是徐庶告别刘备,进曹营。
    18. 火烧博望:非诸葛实乃刘备手笔。发生在建安七年,而直到建安十二年,诸葛亮才出山。
    19. 糜夫人伤重跳井自杀、超云推倒土墙盖井:正史记载,甘夫人和糜夫人在当阳皆安然无恙,故也没有超云推倒土墙盖井的事情啦。
    20. 长板坡七进七出:赵云护送家小撤退,十分平淡。
    21. 怒吼长坂桥:曹军夏侯杰肝胆俱裂被吓死,是小说的夸张手法。
    22. 苦肉计:正史上确有黄盖诈降曹操一事,但苦肉计置疑。
    23. 舌战群儒:无此事,诸葛面见孙权而已。诸如舌战群儒、智激周瑜、群英会、苦肉计、连环计等均为虚构。
    24. 孙夫人投江:孙夫人与刘备的婚事,本来只是历史上无数次政治性联姻之一。是孙夫人去荆州,并没有刘备跑到东吴去娶亲。这里并没有多少男欢女爱的色彩。二人成婚之时,刘备已年近半百,而孙夫人不过二十上下,年龄相差约三十多岁。一个是贪图皇位的枭雄,另一个是任性而为的骄女,彼此互不信任,何来欢爱?所以,刘备入益州不久,孙权就“大遣舟船迎妹”,而孙夫人也毫不犹豫地回了娘家,还差点带走了刘备的宝贝儿子阿斗。从此,她一去不返,杳无音信,与刘备恩断情绝。后孙夫人投江自尽是假,没有此事。刘备呢?占据益州之后便娶了寡居的吴氏(吴懿之妹,刘璋之嫂),也看不出对孙夫人有什么留恋。正因为这样,在《三国志·蜀书·二主妃子传》中竟没有一句话提到孙夫人!史书上没有记载孙夫人的最后结局,但可以肯定,她是绝不会为了刘备而殉情自尽的。
    25. 智激周瑜:此诗(锁二乔)后来出于曹植之手,当时还未出现。
    26. 周瑜智算蒋干:实蒋干赤壁后游说周瑜,不成。历史上的蒋干没有说服周瑜,就回来了,称赞周瑜雅量高致;并没有中计,而且这件事发生在赤壁之战后。
    27. 庞统连环:并无记载。连环是曹操之决策,庞统未曾参与过赤壁之战。
    28. 草船借箭:无此事。此乃孙坚、孙权父子所为,分别发生在跨江击刘表和濡须之战。《三国演义》之祖《三国志平话》中借箭的是公瑾。
    29. 草船借箭:在唐代时,张巡在安史之乱中,曾在夜间用草人垂下城墙赚了令狐潮几十万只箭,综合上面就变成了草船借箭。
    30. 乞求东风:纯属虚构。冬至时日,多有东南风,此乃曹操之天灾,非人为。
    31. 华容道关羽义释曹操:这是作者为丑化曹操,树立关羽的高大形象而虚构的。在华容道拦截曹操的是刘备,但是他去晚了,所以被曹操跑掉了。
    32. 战长沙:刘备南征荆南四郡,四郡守望风而降,黄忠便随长沙太守韩玄同降,并未发生战斗。
    33. 刮骨疗伤:此时华佗已经死了两年,因此并非华佗所为,似乎只是一般的军医所为。
    34. 诸葛三气周瑜:周瑜当时并未注意过诸葛亮,极少碰面。从赤壁之战结束到周瑜病逝的两年间,诸葛亮一直在零陵一带搞后勤工作,根本没有和周瑜见过面。至于周瑜病逝后,蜀国吊唁的代表是庞统,而不是诸葛亮。
    35. 征汉中:征汉中时的前线总指挥是刘备,诸葛亮留守成都搞后勤工作。
    36. 赔了夫人又折兵:单纯的政治婚姻,无他。
    37. 周瑜之死:周瑜死于巴丘,操劳过度。
    38. 计借荆州:实乃鲁肃之计,以刘抵曹。
    39. 马腾讨董卓:马腾和董卓等是一路人马,不但没有参加讨董联盟,而且还帮助董卓镇守长安。
    40. 马超兴兵:实乃背父叛乱。至于马腾之死,并非马腾谋诛曹操被杀,马超起兵报仇;而是马超起兵反曹,所以马腾被杀。
    41. 取蜀攻略:由法正、庞统完成。
    42. 张松献地图:刘备入蜀后,拉拢法正与张松,并询问蜀中的兵马粮钱等情况,于是张松绘制了《西蜀地形图》。
    43. 乔国老:应是“桥国老”,还有和乔玄并不是同一人。
    44. 貂蝉:存在置疑,但王允的确有个导致董卓与吕布反目的侍女。
    45. 刘岱:正史有两个刘岱,反董卓联盟的刘岱和曹操手下的刘岱并不是同一人。
    46. 韩遂年龄:演义中,曹操问韩遂年龄,韩逐答四十,此处错误,此时韩遂已经七十多岁了。
    47. 关羽单刀会:按照《三国志·鲁肃传》和韦曜《吴书》的记载,并不是关羽到鲁肃那里去赴会,而是鲁肃到关羽那里去赴会;“单刀赴会”的孤胆英雄不是关羽,而是鲁肃。《三国演义》本末倒置。“单刀”乃军士之兵器佩刀,而非大刀。
    48. 关羽与同僚:关羽与同僚的关系很不和谐:
      马超:听说马超归附,对其不服,写信给诸葛亮,问“马超的才能可与什么人相比?”(《三国志·马超传》)
      黄忠:听说黄忠为后将军,愤怒地说:“大丈夫终不与老兵同列!”(《三国志·费诗传》)
      糜芳:“为南郡太守,与关羽共事,而私好携贰(私人关系不和),叛迎孙权。”(《三国志·麋竺传》)
      傅士仁:“与羽有隙,叛迎孙权。”(《三国志·杨戏传》)
      刘封、孟达:二人镇守上庸,关羽在襄樊之战中请二人发兵相救,二人坐视不救。
      廖立:在丞相掾李邵、蒋琬面前评论关羽“怙恃勇名,作军无法,直以意突耳(凭恃英勇的名声,带兵没有章法,简直是主观蛮干)。”(《三国志·廖立传》)
      潘濬:“亦与关羽不穆(不和)。”(《三国志·杨戏传》)
    49. 关公与女色:曹公与刘备围吕布与于下邳,关羽启公,布使秦宜禄行求救,乞娶其妻,公许之。临破,又屡启公。公疑有异色,先遣迎看,因自留之,羽心不自安。如此看来,关圣大帝也有七情六欲。关于貂蝉,正史上没有记载。《三国演义》在吕布死了以后,也未对貂蝉作交代。关公月下斩貂蝉,大多史学家认为是虚构。如果是真事,关羽也太不配做男人了。
    50. 关羽麦城凛然拒降:孙权使人劝降,关羽诈降,在城头虚插旌旗,从别门撤退,被吕蒙算到,半路截杀之。
    51. 关羽亡命:《三国志·关羽传》说关羽“亡命奔涿郡(郡治涿县,今河北涿州市)”。那么,他作为山西人,为什么亡命到了河北呢?史书并没有交待。《三国演义》中,关羽自述说:“因本处势豪仗势凌人,被吾杀了。”
    52. 五虎将:刘备并没封什么“五虎大将”,只不过上面五人的军职是最高的:关羽(前将军)、张飞(车骑)、马超(骠骑)、黄忠(后将军)、赵云(翊军将军,最低)。而且自从关羽伐魏,建安二十四年到章武二年短短四年间,关张马黄都死了。
    53. 《后出师表》:乃后人伪托,并非诸葛亮所作。
    54. 追命吕蒙、玉泉显圣:不用说也知道是子虚乌有,不多说。
    55. 石兵八阵伏陆逊:置疑。
    56. 七擒孟获:虚构,并无此事。历史上确有诸葛亮南征之事,也确有孟获其人。但七擒孟获《三国志》上没有记载,只是在裴松之引注《汉晋春秋》时说了一句“七擒七纵”,但具体过程没有记载。孟获后在蜀国任御史中丞,是文官。
    57. 孔明伐魏:并无六次,实五次,输的没《三国演义》那么漂亮。
    58. 火烧上方谷:即是孔明差点烧死司马懿和魏延那回,纯熟虚构。
    59. 六出祁山:诸葛亮伐魏五次,只有第一次和第四次到了祁山。
    60. 木牛流马:其实,木牛就是独轮车,流马就是今天很常见的四轮小拉车。一说木牛是四轮车,流马是一种头部比较尖的船。
    61. 诸葛亮用兵如神:诸葛亮擅长内政治理,用兵并不是强项。
    62. 死诸葛吓跑活仲达:确有此事,但并非诸葛亮遗计,而是司马懿心虚。“死诸葛走生仲达”的依据是《汉晋春秋》,但是作者又加了工。《汉晋春秋》的记载是,诸葛亮死后,蜀军秘不发丧悄然撤退,司马懿有所发觉,驱军追赶。两车相近时,蜀军长史杨仪命蜀军“反旗鸣鼓,欲向魏军”,司马懿“不敢逼”,只好退兵。当时在魏军中就传开了“死诸葛走生仲达”的笑话。蜀军“入谷然后发丧”。但是在《三国演义》中却成了蜀军推出一辆四轮车,车上端坐着诸葛亮木偶像,司马懿疑诸葛亮未死,故而退兵。
    63. 曹军潼关战马超:战斗确实很激烈,但是《三国演义》写曹操割须弃袍乃得脱则完全是为丑化他。实际上,潼关大战,曹操是赢家。
    64. 曹真:病死于洛阳,并非被诸葛亮写信骂死。
    65. 诸葛亮骂死王朗:王朗病死于 228 年,并未随军出战。王朗被骂死,完全虚构。
    66. 马超战张飞:正史上,是马超私自写信给刘备请求投降,并无二人大战、李恢劝降。
    67. 空城计:虚构。灵感应该来自赵云的空营计。诸葛亮只是在最后一次北伐时才与司马懿相持于渭水。但作者写空城计又是有所本的,这个“本”就是《三国志》中的裴松之注所引“郭冲三事”,但它是假的。因为诸葛亮屯兵汉中阳平时,司马懿还是荆州都督,无缘与诸葛亮抗衡。当时诸葛亮驻今陕西安康县,司马懿屯今河南南阳,如此之遥远,何谈空城计?
    68. 魏延反叛:其实魏延才是受害者。
    69. 落凤坡:庞统进攻雒城时中箭死去,并非死于落凤坡。
    70. 黄忠战关羽:纯虚构。并无关羽义释黄忠的故事。正史中,关羽嫌弃黄忠老,又怎会有“义释”。
    71. 关于年龄:几个主要人物的年龄,从大到小的排列是:曹操、吕布、赵云、关羽、刘备、张飞、鲁肃、周瑜、诸葛亮、孙权、陆逊。一些资料表明,赵云至少比刘备大二岁,赤壁之战那一年,赵云已经五十上下了;张昭比孙坚小一岁;关羽比刘备还要大一岁。
    72. 七星灯续命:无需解释了。
    73. 周仓:历史上没周仓之人。似乎是个虚构的人物。
    74. 刘琮:献出荆州后,被曹操任命为青州刺史,封列侯,并未被杀。后曹操为了表彰他的功绩,迁为谏议大夫。
    75. 彝陵之战:刘备仅带了四万多人,而孙权给了陆逊五万人。之所以能够取胜,不仅仅靠的是优良的战术。
    76. 青龙偃月刀、丈八蛇矛:关羽不是用刀的,历史上关羽的兵刃是长矛。其实吕布的兵刃也是长矛。张飞的兵刃并非丈八蛇矛,而是一般的矛。青龙偃月刀、丈八蛇矛和方天画戟这样有个性的兵器对于塑造人物来说是很有好处的。
    77. 赤兔马:赤兔马确为吕布所骑,但吕布战败后,不知去向。关羽跨下无赤兔,为表达勇武形象,更虚构赤兔马为了关羽的死,绝食而亡。如果要绝食,吕布死时就该绝食哩。
    78. 刘皇叔刘备:实为无稽之谈。虚构刘备被献帝称“刘皇叔”,来表达刘备是“捍卫汉室”和曹操是“国贼”的假象。要是刘备是刘皇叔,那刘表、刘璋哩?
    79. 孙尚香:历史上并未提到名,只知姓孙。
    80. 张翼德:应该是张益德。
    81. 粗人张飞:其实张飞一手好书法、精通美工画,文武全才、高硕书生形象。
    82. 关兴:一介文官,年轻的时候就死了。
    83. 关兴复仇:据《演义》所写,关羽死后,在刘备伐吴的夷陵之战中,关羽之子关兴和张飞之子张苞,都为其父复了仇,与史实并不相符。在《三国志》以及裴注所引诸书中,都没有关兴参加夷陵之战和擒获并处死仇人的记载。另据《三国志·潘璋传》,潘璋在夷陵之战中为孙权立了战功,拜官平北将军、襄阳太守,死于吴嘉禾三年(公元 234 年),在夷陵之战后还活了十多年。马忠是小人物,他的下落史书绝无记载。至于傅士仁、麋芳二人,以后也不见史书记载。他们本是一些平庸之辈,投吴后没有什么建树,默默无闻,史书也就没有记载他们的必要了。另据《蜀记》,魏将庞德之子庞会,随钟会、邓艾伐蜀(在公元 263 年),因为庞德被关羽杀害,庞会为了复仇,诛灭了关氏全家,所以关羽没有留下后人。
    84. 张苞:早夭。
    85. 关索:只出现于民间传和野史中,乃虚构人物。
    86. 关平:关羽的亲生儿子,在《三国志》里名字只出现两次的人。到了演义里,成了义子,还那么厉害?关羽还有一女,相传叫银屏,嫁与李恢之子。
    87. 刘备用牛血破张宝妖法:封建迷信。
    88. 陈宫捉曹操:陈宫本来就一直在曹操手下,捉放曹的事发生于中平六年(189 年)。陈宫开始跟随曹操在初平二年(公元 191 年),故陈宫捉放曹是虚构的。
    89. 陶谦的为人和让位与史实不符
    90. 文丑中曹操之计被杀
    91. 无左慈戏曹操
    92. 无管辂延寿
    93. 托孤:刘备临终是扥孤与孔明和李严二人。
    94. 张郃:张合先后败于赵云、马超等人之手,这在高手动辄大战数十回合平手的演义中实在是少见的。只能说,罗贯中好象颇不喜欢张郃,猜想跟《三国志》里那句蜀军自孔明以下都惧怕他脱不了关系。而正史中,张郃也不是中伏,而是追击孔明时膝盖被流箭射中,跟庞统一样死的满衰的。
    95. 史实无老黄忠计夺天荡山
    96. 水淹七军:此事件虽有所本,但与史实相差很远。此乃天灾,非人谋。虚构庞德抬榇死战,大战关羽,对于禁纯属污蔑。《三国志》中的《关羽传》和《于禁传》都写得很清楚,时值秋天,大雨连绵,汉水暴涨,平地水高五六丈。关羽所带的荆州水军适应这种天气,而于禁、庞德带的是北方军,不适应水战,被洪水冲没,于禁投降,庞德被杀。
    97. 七十二疑冢:曹操葬在高陵,没有七十二疑冢这一说。
    98. 关于身材:刘备 172cm、张飞 184cm、关羽 203cm、曹操 161cm、张松 110cm、诸葛亮 184cm。
    99. 气量狭小的周瑜:刘备评价周瑜“器量广大”,程普评价周瑜说“与公瑾交,若饮醇醪,不觉自醉”,陈寿评价周瑜“性度恢郭”,另外洪迈、苏东坡等古人,在周瑜的人品方面,也给予了极高的评价。
    100. 诸葛亮之事迹,仅三顾茅庐是史实,其它均为移花接木或虚构。
    4/16/2007

    “英雄”暮年

      最近,两位上两个年代的动作巨星沉寂好多年后,携新片又出现在了银幕之上,先是“钢铁硬汉”希尔威斯特·史泰龙的《洛奇·巴尔博亚》,接着是“颓废英雄”布鲁斯·威利斯的《勇闯 16 街区》;两位还将分别推出经典动作片的续集《兰博 4》和《虎胆龙威 4》。
      我不评价这两位的新片的好坏,我发现“英雄”似乎喜欢集中在某一个时代,接着世界沉寂很久,然后再次几乎涌现出一大批英雄。单从荧幕上看,动作片的“接班人”除了靠特技效果外,似乎很少有真材实料的。“功夫之王”李小龙很难再有了,“拼命三郎”成龙老了,“魔鬼司令”阿诺德·施瓦辛格沉迷于官场……还有导演,像乔治·卢卡斯、史蒂芬·斯皮尔伯格、詹姆斯·卡梅隆……还会在不远的将来再有吗?
      “英雄”们都渐渐衰老,接班人却少之又少……

    CDBurnerXP 新版

      Stefan 宣布,CDBurnerXP 4.0 的第三个测试版已经交给 Flo 了,不久就会放出 Beta 版(只有捐款人才能下载)。一旦新的语言文件放出来,我就开始着手翻译。
    4/15/2007

    1992 年第二届 Ig 诺贝尔奖

    原文:http://www.improb.com/ig/ig-pastwinners.html#ig1992

    医学
      横滨资生堂研究中心的 F.·神田E.·八木M.·福田K.·中岛T.·太田O.·中田英寿,因为他们开拓性的研究工作:“对造成脚臭的化合物的阐释”,特别为他们的结论:自我感觉有脚气的人就会有,否则就没有。[发表在英国月刊《皮肤病学》,卷 122,6 号,1990 年 6 月,页码 771-6.]
     
    考古学
      法国先锋队,年轻的新教徒组,其名字的意思是“指路的人们”,莽撞的涂鸦清洁员,因为他们在法国布尼克村附近的梅内瑞斯岩洞,把墙上的古代绘画擦掉了。
     
    经济学
      伦敦劳埃德的投资商们,传承了 300 年枯燥的谨慎管理,因为他们为了保险灾害的大胆企图,而拒绝支付他们的公司的亏损。

    生物学
      塞西尔·雅各布森博士,坚韧而慷慨的精子捐献者,多产的精子银行元老,因为他创造了一套简单而独力的质量控制。[参见:“婴儿制造机:繁殖力骗子和塞西尔·雅各布森博士的堕落”]

    化学
      艾维特·巴萨,彩色果冻的制造者,因为她在二十世纪顶级化学成果中的角色——亮蓝色 Jell-O 果冻的合成。

    物理学
      戴维·乔雷道格·鲍尔,低能物理学的名流,因为他们基于英国庄稼的几何状倒塌,而对力场理论循环论证式的贡献。

    和平
      达里尔·盖茨,洛杉矶市的前任警长,因为他那独特的把人们聚拢的强迫性方式。

    营养学
      罐头肉的使用者,即勇敢的罐头食品消费者,因为 54 年不分青红皂白的消化。

    文学
      尤利·斯特拉科夫,来自莫斯科的有机元素化合物研究所,因为他 1981 到 1990 年发表了 948 页科学论文,平均每 3.9 天就有一页多。

    艺术
      连带颁发给吉姆·诺尔顿,当代的文艺复兴人,因为他的经典解剖海报“动物王国的阴茎”,以及美国自然基金,因为其为鼓励诺尔顿先生拓展工作,而用在一本流行书的印版上的美工。
    4/11/2007

    刘邦还是项羽赢了?

      前者小处不甚检点,大处能随机应变,终成帝业;后者霸气盖世,人无不闻风丧胆,最终却落得四面楚歌。自古以来,“成败论英雄”,但这次,刘邦成了流氓,项羽永远都是霸王。所谓的成败,随着历史而模糊了。
      这就像两人各自为自己的“公平”而争执一样,不管对谁,一时的胜利只能带来一瞬的“扬眉吐气”,重要的是两人可能从此决裂。因此本着一颗“双赢”的心态,争取平和地讨论问题,才是解决之道——不论是目的,或仅仅是手段。
    4/10/2007

    我们如此努力,为了什么?

      为了共产主义事业?别做梦了,理论中的最高境界至少不适合地球上的人类。
      为了闯出一番事业而扬名?许多人都念念不忘地要“创业”,要向“成功的人”学习。在我看来,基本上还是为了多挣钱。如果事业成功后还是穷光蛋,那几乎没有人去做;反之则蜂拥而上。对声称“不为名不为利”的人,先看看其家产再作评论。
      为了幸福快乐地过一辈子?这大概是多数“平民”的“奢望”了。但实际的生活往往不如人意,担心的坏事偏偏就时常发生,除了“豁达”之外,也没什么对策了。
      人们都说一个字:累。为什么累?为了不再累而累。

    为什么要按两次按钮才能关闭或隐藏一个窗口?

      这次的项目中我遇到了这个问题。百思不得其解之后当然是上网找答案。网上关于这问题的话题不多,有些解释比较复杂,略过。解决问题最好从简单的地方入手——一个低级错误往往导致半天的冥思苦想。最简单的解释是,窗口被显示了两次。我仔细查看窗口显示代码,果然调用了两次 setVisible(true),去掉一个就正常了。为什么会这样呢?我查看了一下 JDK 源代码,setVisible 方法在开头就检查了参数,按理说不应该在第二次调用的时候起作用,难道是某个潜在的 API 错误?又另写一个小程序,两此调用 setVisible(true),结果却只按一次键就能关闭。看样子问题不简单。结论就是,编程应该有良好的规划和风格,否则可能导致莫名其妙的错误。
      据说 Windows 程序也存在类似问题,还没有测试过。
    4/9/2007

    用 NetBeans 开发一个具有 Windows XP 外观风格的最简单程序 - 其三

      新建一个 Makefile,比如叫做 MakeMe.mk……嗯,比如叫做 MyMakefile.mk,内容如下:
    1. PRJ=dist/Release/WinHello.exe
    2. OBJ=build/Release/WinHello.o build/Release/Resource.o
    3. CC=gcc
    4. CFLAGS=-mno-cygwin -mwindows -s
    5. RES=windres
    6. LIB=-lcomctl32
    7.  
    8. $(PRJ): $(OBJ)
    9.         mkdir -p dist/Release
    10.         $(CC) $(CFLAGS) -o dist/Release/WinHello $(OBJ) $(LIB)
    11.  
    12. build/Release/WinHello.o: WinHello.c
    13. mkdir -p build/Release
    14.         $(CC) $(CFLAGS) -c -O2 -o build/Release/WinHello.o WinHello.c
    15.  
    16. build/Release/Resource.o: Resource.rc
    17.         mkdir -p build/Release
    18.         $(RES) -o build/Release/Resource.o Resource.rc
    19.  
    20. .PHONY: clean
    21. clean:
    22.         ${RM} $(OBJ) $(PRJ)
    23.  
    上面有些行以八个空格开头,实际上该是一个制表符,写成这样是因为共享空间会自动把制表符换成一个空格。NetBeans 本来有个 Makefile 向导,但我觉得不好用且弹性小,不如自己保存一个样本。把这个文件添加进项目,然后在上面右键选 Make,然后就收工了。
    4/8/2007

    用 NetBeans 开发一个具有 Windows XP 外观风格的最简单程序 - 其二

      在工具栏上的组合框里,我们把项目配置为 Realease。在项目节点上右键选择属性,然后:转到 C/C++ → GNU C Compiler 节点,在 General 中钩选 Strip Symbols,在 Command Line 中设置 Addtional Options 为 -mno-cygwin -mwindows;转到 Linker → Libraries,单击 Libraries 右边的一栏,接着单击 Add Option,设置 Other Option 为 -lcomctl32。
      如果我们直接在项目节点上右键选择 Build Project,则会输出以下错误:
    WinHello.c:6: error: `INITCOMMONCONTROLSEX' undeclared (first use in this function)
    WinHello.c:6: error: (Each undeclared identifier is reported only once
    WinHello.c:6: error: for each function it appears in.)
    WinHello.c:6: error: parse error before "init"
    WinHello.c:7: error: `init' undeclared (first use in this function)
    WinHello.c:8: error: `ICC_STANDARD_CLASSES' undeclared (first use in this function)
    结构体 INITCOMMONCONTROLSEX 在 commctrl.h 中声明,commctrl.h 位于 cygwin\usr\include\w32api。打开这个头文件,查找 INITCOMMONCONTROLSEX,发现它包含在一段预处理指令中:
    1. #if (_WIN32_IE >= 0x0300)
    2. typedef struct tagINITCOMMONCONTROLSEX {
    3.     DWORD dwSize;
    4.     DWORD dwICC;
    5. } INITCOMMONCONTROLSEX,*LPINITCOMMONCONTROLSEX;
    6. #endif
    再查找 _WIN32_IE,找到:
    1. #if 0
    2. #define _WIN32_IE 0x0300
    3. #endif
    #if 0 表明,默认情况下,永远不会定义 _WIN32_IE。于是注释掉行 1 和行 3,再编译,再次出错:
    WinHello.c:8: error: `ICC_STANDARD_CLASSES' undeclared (first use in this function)
    WinHello.c:8: error: (Each undeclared identifier is reported only once
    WinHello.c:8: error: for each function it appears in.)
    像上面一样去查找 ICC_STANDARD_CLASSES,这次我们要把 windef.h 中的 WINVER 改为 0x0501。不必担心我们改了这些值会带来什么坏处。这些变量存在的意义是定义或不定义一些 API,以便为不同版本的 Windows 开发程序。如今 Windows Vista 已经出来了,世界进步很快,有新东西为什么不用呢?
      现在编译运行,不会出错了。但是外观风格仍然是 98/2000 那种老土样式,这是因为默认情况下 NetBeans 不知道如何编译 rc 文件。解决这一问题的办法,最好是自定义一个 Makefile。
      哦,也差不多了吧,今天到此为止,明天继续。

    用 NetBeans 开发一个具有 Windows XP 外观风格的最简单程序 - 其一

      首先创建一个名为 WinHello 的项目,在 Source Files 节点下新建 WinHello.c,代码的内容如下:
    1. #include
    2. #include

    3. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    4.         PSTR szCmdLine, int iCmdShow) {
    5.     INITCOMMONCONTROLSEX init;
    6.     init.dwSize = sizeof(init);
    7.     init.dwICC = ICC_STANDARD_CLASSES;
    8.     InitCommonControlsEx(&init);
    9.     MessageBox(NULL, TEXT("最简单程序!"), TEXT("对话框"), 0);
    10.     return 0;
    11. }

    注意末尾处最好再加上一个回车符,因为我们将用 GCC 来编译,遵循 UNIX 的规矩总是好的。行 6~9 指明用 Windows XP 外观风格初始化程序,但这还不够,我们还需要一个资源脚本和一个清单文件来显示调用 Comctl32.dll 版本 6(默认状态下自动调用版本 5,也就是 Windows 98/2000 的外观风格)。在 Resource Files 节点下新建资源脚本 resource.rc 和清单文件 WinHello.exe.manifest。resource.rc 的内容如下:

    1. #include

    2. CREATEPROCESS_MANIFEST_RESOURCE_ID RT_MANIFEST "WinHello.exe.manifest"

    WinHello.exe.manifest 的内容如下:




    1.     version="1.0.0.0"
    2.     processorArchitecture="X86"
    3.     name="CompanyName.ProductName.WinHello"
    4.     type="win32"
    5. />
    6. Description.

    7.    
    8.        
    9.             type="win32"
    10.             name="Microsoft.Windows.Common-Controls"
    11.             version="6.0.0.0"
    12.             processorArchitecture="X86"
    13.             publicKeyToken="6595b64144ccf1df"
    14.             language="*"
    15.         />
    16.    



      到现在为止,所有的源文件都准备好了,接下来是编译。为避免一篇文章过长,且看下回分解。

    4/7/2007

    工具准备

      既然是本行,也没必要回避了。
     
      以下是我用到的有关开发的基本工具:
    • JDK - 开发 Java 程序的先决条件。
    • Java API 规范 - 也就是 JDK 的 API 文档。
    • NetBeans IDE - 太阳公司(Sun:)的官方 Java 集成开发环境,还提供了附加软件包用于 C/C++ 开发等。
    • Cygwin - 运行于 Windows 下的 GNU C/C++ 编译器,可开发 Windows 应用程序。
    • Windows SDK 文档 - 现在 MSDN Library 可以从微软网站免费下载了。
    • 记事本 - 查看和编辑文本文件的最轻量级工具,唯一的问题是如果文本中的换行符只是 \n,而不是 \n\r,则显示 ■。
    • WinHex - 好用的十六进制编辑软件。