Scratz's profileScratz 的小果园PhotosBlogListsMore Tools Help

Blog


    7/31/2007

    “正宗”Windows 风格弹出窗口

      上回说道,Java 默认的弹出窗口样式和 Windows 有一定的偏差,但可以通过自定义 Popup 来解决。通过今天上午的努力,我已经完成了同时具有动态弹出、阴影边框和条目选中时不四周挤满这三种效果的菜单,已经和 Windows 的风格非常接近了。值得一提的是,要让菜单栏上的 JMenu 选中时不挤满四周,只需在 JMenuBar 上添加空边框就行了,而不必重写 BasicMenuBarUI 之类,意外的简单。
      以下是这个实现中最重要的 getPopup 方法。没贴出来的代码基本上和威廉的一样,少数地方略有改动。
    public Popup getPopup(Component owner, Component content, int x, int y)
                throws IllegalArgumentException {
        // 用 Swing 开发就可以直接转换成 JComponent。
        JComponent jcontent = (JComponent) content;
       
        if (jcontent instanceof JPopupMenu) {
            JPopupMenu popupContnet = ((JPopupMenu) jcontent);
            Component invoker = popupContnet.getInvoker();
           
            if (!(invoker instanceof JComboBox)) {
                // 去掉菜单原来的线框,替换为更好看的边框。
                popupContnet.setBorder(null);
                EmptyBorder emptyBorder = new EmptyBorder(2, 2, 2, 2);
                LineBorder lineBorder = new LineBorder(Color.GRAY);
                popupContnet.setBorder(new CompoundBorder(lineBorder, emptyBorder));
            } else {
                // 恢复组合框弹出菜单的默认边框,防止重复绘制阴影边框。
                popupContnet.setBorder(new LineBorder(Color.BLACK));
            }
        }
       
        // 用机器人抓屏,然后绘制并添加阴影边框。
        Dimension d1 = jcontent.getPreferredSize();
        Rectangle bound = new Rectangle(x, y, d1.width + 4, d1.height + 4);
        BufferedImage backgroundImage = robot.createScreenCapture(bound);
        ShadowBorder shadowBorder = new ShadowBorder(backgroundImage);
        jcontent.setBorder(new CompoundBorder(shadowBorder, jcontent.getBorder()));
       
        // 设置边框后首选大小会发生改变,必须重新获取,
        // 实际上就是原来的首选大小加上阴影边框大小。
        Dimension d2 = jcontent.getPreferredSize();
       
        // 初始高度设为 0,避免在刚开始弹出的一瞬间,完整的弹出窗口闪现一下。
        // 弹出动画也可以用于宽度,方法相同。
        jcontent.setPreferredSize(new Dimension(d2.width, 0));
       
        // 用修改后的内容组件获取弹出窗口。
        Popup popup = super.getPopup(owner, jcontent, x, y);
        String name = popup.getClass().getName();
        Component container;
       
        // 这里好像只能根据类名称来区分弹出窗口的类型?
        if (name == "javax.swing.PopupFactory$HeavyWeightPopup") {
            container = SwingUtilities.getWindowAncestor(jcontent);
        } else {
            if(content instanceof JToolTip) {
                container = jcontent.getParent();
            } else {
                container = jcontent;
            }
        }
        return new AnimatedPopup(popup, jcontent, container, d2);
    }
      最后再比较下威廉和《Swing Hacks》的实现方法。威廉扩展了 PopupFactory 和 Popup,适用于所有的弹出窗口;《Swing Hacks》只是扩展了 BasicPopupMenuUI,所以对像工具提示(JToolTip)这种非 JPopupMenu 的弹出窗口没有效果。显然威廉的方法更全面。
    7/30/2007

    成就感

      今天晚上我终于独力把 JMenuItem 的一个遗留问题解决了。虽然 Java 支持 Windows 外观感觉,但仍有些许差别。昨天拼凑出来的动画阴影菜单算是解决了一半。剩下的一半就是,Windows 菜单条目在选中的时候,蓝色的颜色块四周还留有一小部分空白,比较好看;JMenuItem 就全部撑满了,感觉不太协调。以前尝试过加空边框或边界,都无法解决。今天算是来了灵感,完美地做出了这个效果。关键点就是替换掉 JPopupMenu 的默认边框。目前与阴影边框整合还有一点问题,右下角的阴影不知为何显示不出来,等弄好了再把代码一起贴上。
      这时想起在公司作的项目,我全权负责客户端,写了 7000 行左右代码,但基本上是按部就班,很少有自己的念头,完全不能和今天这寥寥数十行相提并论。

    难得做一次好人

      作为一部轻松的休闲喜剧片,《荒野大飙客》再合适不过了。但是我一看到约翰·特拉沃尔塔那张阴险的面容,就时刻留意他什么时候会突然背叛和出卖朋友。幸亏没有!坏人演多了偶尔演一次好人就是这个效果哈哈!

    As a relaxed film for entertainment and joy, "Wild Hogs" can't fit any more. But as soon as I saw that insidious visage of John Travolta, I began to pay attention to when he would betray and sell out his friends. Fortunately he didn't! So many bad guys has he has been casted as, which resulted in such an effect once he was casted as a good guy!

    7/29/2007

    动画阴影弹出窗口完成了

      Java 的弹出窗口默认是没有这些效果的。以前研究过《Swing Hacks》里面相关的例子,方法是自定义一个 PopupMenuUI(扩展 BasicPopupMenuUI),然后用 UIManager 设置 PopupMenuUI 属性。但作者没能很好应付重量级弹出窗口,导致有时候会失效。
      国内高手 William Chen 在 NetBeans 星球注册了他的网络日志 Let's Swing Java,让我能有幸在 NetBeans IDE 的欢迎窗口看到他的精彩文章。William 分别介绍了动画弹出窗口和阴影弹出窗口的实现方法,并提供了源代码。William 的方法是用工厂类 PopupFactory 来设置弹出窗口的外观,从本质上来说应该和《Swing Hacks》异曲同工。但好在 William 考虑全面,各种情况无一遗漏。
      不过前两周,在我试图把这两种效果合并的时候遇到了麻烦。William 的阴影弹出窗口用一个自定义的 ShadowFrame(一个 JComponent)包装弹出窗口内容组件,设置阴影边框,然后用把它用作新的内容组件,获取新的弹出窗口;而动画弹出窗口则是通过不断设置弹出窗口的顶层容器(一个 Component)的大小来呈现动画。问题在于,边框只能加在 JComponent 上而无法用于 Component,这样就不可能直接在顶层容器上直接添加边框。我最先尝试把顶层容器添加进 ShadowFrame,但是编译时发生异常。又试了几次失败后,便搁下了。
      今天上午,我觉得能够把它弄出来。前面说过,William 把 ShadowFrame 用作新的弹出窗口内容组件,这正好是解决问题的关键!首先,用这种方法得到这个新的弹出窗口,再在它身上做文章不就做出动画效果了吗?结果表明此路可行,但在效果上却有瑕疵:菜单栏高度偏大,底下有空白,而组合框的弹出窗口高度不足,底下被抹掉了一截。想了一阵,觉得是 ShadowFrame 的首选大小在搞鬼。这个首选大小是在添加边框之前获取的,那添加之后不会变吗?打印出来一看,果然还增加了边框的大小。重新获取一下,终于把这个效果完成了!
      不知不觉,现在都一点半过了,我还没吃午饭呢。人要劳逸结合,废寝忘食可不是什么好事。
      最后我向 William Chen 真诚地说一声谢谢。

    Java's popup window has no these effects by default. I've delved into relational examples in "Swing Hacks", which define their own PopupMenuUIs (by extending BasicPopupMenuUI) and set PopupMenuUI property through UIManager. But the authors don't handle heavy weight popups properly, making sometimes effects disappear.
        William Chen, one master in our country, registered his blog Let's Swing Java on Netbeans Planet, and I can have the fortune to read his fantastic articles in Netbeans's welcome window. William seperately introdeces how to implement an animated popup and a shadowed popup, also with source code. William's idea is to use PopupFactory to set the appearance of the popup, which should be in nature the same as what "Swing Hacks" has shown. But William thinks comprehensively so that nothing is leftout.
        However, when I tried to merge both effects weeks ago, something problematic happened. In William's shadowed popup, a custom ShadowFrame (a JComponent) is utilized to encapsulate the content component of the popup, then add a shadow border to it and take it as a new content component to fetch a new popup; while in animated popup, animation is implemented by continuing resizeing the top level container (a Component) of the popup. The matter is border can only be added to a JComponent but not a Component, which makes it impossible to add a border directly to the top level container. In the beginning I tried to add that top level container into the ShadowFrame, but it caused a compile-time exception. After a few times of failures, I laid it aside.
        I felt I could achieve it this morning. It's said above, that William used the ShadowFrame as the new popup's content component, which figures out the key to solve this problem. I first got this new popup in this way and animation should be out by modifying it. The result proved it, but the effect was defective: the menu was so high that there was a blank in the bottom, but the popup of a combo box was not high enough that a part of the bottom was gone. Thinking over, I considered it was the preferred size of the ShadowFrame that had played those tricks. This preferred size was obtained before adding the border, and wouldn't it change after adding? I printed if out and found the size of the border was added to it. By obtaining it again and the effects were done!
        Without noticing it, it's already after half past one, and I haven't had lunch yet. People alternate work with rest, so it's bad to be too busy to eat or sleep.
        At last I'd like to say a sincere thank you to William.

    7/28/2007

    《马克斯·佩恩》的新消息

      刚才在 YouTube 网站上看到两段关于马克斯·佩恩的片段,据称分别是电影《马克斯·佩恩:佩恩和救赎》(Max Payne: Payne & Redemption)和游戏《马克斯·佩恩 3:跌入黑暗》(Max Payne 3: Fall into the Dark)。电影和游戏都将在今年底到明年初推出。
      马克斯·佩恩是我最喜欢的游戏英雄(注意没有“之一”两个字)。两代游戏《马克斯·佩恩》(Max Payne)和《马克斯·佩恩 2:马克斯·佩恩的秋天》(Max Payne 2: The Fall of Max Payne)在游戏的基础上,搭配冷色的过场漫画、忧伤的背景音乐、还有佩恩那忧郁的嗓音,也同时电影般地讲述了两个感人的故事:第一代是复仇,第二代是爱情。所以是我永久收藏的游戏。
      两代的结局都说“马克斯·佩恩将在黑暗中继续前进。”(Max Payne's journey through night will continue.)我从没有停止过搜索第三代的消息,直到有说拍电影的消息,再到现在,不管是真是假,真的是十分高兴,毕竟还有这么多人不会忘记我们的英雄。
      Welcome back, Max Payne, dearest of all my friends!

    7/27/2007

      上班半年多了,几乎每个工作日都重复着相同的事情:起床、吃早饭、乘公交车去公司、呆在电脑前、吃午饭、呆在电脑前、乘公交车回来、吃晚饭、呆在电脑前、睡觉、起床……每天都照镜子看看稀拉的胡子,看看脸上的皱纹,看看眼睛的疲倦,值得庆幸的是还没有白发。
      我曾经抱怨运气,为什么每件事情都会向着不好的方向发展?我虽然常说要看到事情好的一方面,但我自己却更加无可奈何。现在什么都不怨了,至少不会怨自己,更没有必要怨命运。我努力很多次了,也失败很多次了。和命运的抗争中,输多少次都不算输,赢一次就是赢。
      也许我真的很累了,真的很想尝试《暴风雨骑士》里面唱的:“放一个长假。让孩子们去耍。”但不是现在。

    I have been working for more than half a year, and almost on every workday same things reapeat: getting up, having breakfast, going to company by bus, staying in front of computer, having lunch, staying in front of computer, going back by bus, having supper, staying in front of computer, going to bed, getting up... Everyday I look at the mirror, at my scattered beard, wrinkles on my face and tiredness in my eyes, and fortunately there is no white hair.
        I used to complain about luck, that why everything went to the disadvantageous? I often say the advantageous of things is seen, while I myself feel more helpless. Now nothing deserves complaint, at least not my self, and moreover no fate. I have done my utmost for many times, and failed many time. In the struggle against fate, no matter how many times of losses don't count a failure, but one mere winning makes a success.
        I may be really tired, and want to try very much as "Riders on the Storm" singing: "Take a long holiday. Let your children play." But not now.

    7/21/2007

    Windows Live Writer

      今天共享空间的界面稍微有点变化,看样子微软又要开始升级了。回想起上次的升级,简直是个噩梦,差点把我的整个空间都毁了。
      不过呢,这次最大的亮点还是多了一个写日志的软件 Windows Live Writer,也就是本篇日志所用的编辑工具。以往在网页上编辑,可能因为网页的代码太多,经常有拖慢现象,有时插入符还会失踪,只能掐着指头计算鼠标位置了。这个软件是单机的,不存在拖慢问题,当然也增加了很多 HTML 编辑功能。推荐使用 Windows Live 共享空间的朋友们都来尝尝鲜吧。

    7/20/2007

    I'm Gonna Backup Logs!

    By now I have written so many logs. It's wonderful! But the server could be down and things would go horrible. That's why I am gonna backup all logs now. Fortunately, nearly all I have to do is to create a directory and a few sub-directories for categories, and copy and paste all text, except occasionally links need to be appended. Great that I haven't inserted any image into logs, or the backuop process would not be so easy.

      我喜欢雨。
      雨经常具有象征意义,和风细雨代表似水柔情,疾风阵雨映衬忧愁沮丧,暴风骤雨喻示革命运动,还有很多。
      不过在我,雨更多的是一种意境和心境。
      下雨的时候,我经常坐在窗前或门前,有时望着天空,用目光牢牢抓住串串雨滴,直到在地面绽放出朵朵水花;有时又望着地面,看流水把街面冲刷得一尘不染,又偶撞到突出的石头上激荡飞扬。
      虽然没有“飞流直下三千尺”的壮阔,却也得几分“大珠小珠落玉盘”的细腻。
      就这么看着雨,什么都不想。
    7/19/2007

    《V 字仇杀队》的经典段落

      设想过绝大部分单词都以同一个字母开头的句子吗?这只有思维怪异的沃卓斯基兄弟才编得出来,再加上雨果·维文那种特别的语调,完美!
     
    But on this most auspicious of nights, permit me then, in lieu of the more commonplace sobriquet to suggest the character of this dramatis persona.
    但是在这最吉祥的夜晚,请允许我,不用那种更为寻常的名号来揭示出剧中的这个角色。
     
    Voila!
    看啊!
     
    In view, a humble vaudevillian veteran cast vicariously as both victim and villain by the vicissitudes of fate.
    表面上看,一个卑贱的杂耍老手随着命运的沉浮,感同身受地扮演着受害者与加害者的双重角色。
     
    This visage, no mere veneer of vanity, is a vestige of the vox populi, now vacant, vanished.
    这副面孔,不只是虚华的外表,更是群众呼声的绝响,现已消失殆尽。
     
    However, this valorous visitation of a bygone vexation stands vivified and has vowed to vanquish these venal and virulent vermin vanguarding vice and vouchsafing the violently vicious and voracious violation of volition.
    不过,这种对昔日烦恼的英勇回味经久不衰,并且誓要铲除这些贪婪凶狠、首当其恶且永无止境地亵渎意志的害虫。
     
    The only verdict is vengeance, a vendetta held as a votive not in vain, for the value and veracity of such shall one day vindicate the vigilant and the virtuous.
    唯一的裁决就是复仇,这种作为还愿的仇杀不会白费,是为了将来能给警惕者和有德者昭雪的那一天的价值和正确性。
     
    Verily, this vichyssoise of verbiage veers most verbose.
    说实话,这段啰嗦的陈词滥调会变得无比冗长。
     
    So let me simply add that it's my very good honor to meet you and you may call me V.
    所以让我简单地补充一下,遇到你我非常荣幸,你可以叫我 V。
    7/18/2007

    最近电影里流行的漫画英雄

      据说美国的漫画公司总共炮制了 7000 多个漫画英雄。这些英雄一贯行侠仗义,有时也互相冲突,超越现实又不脱离现实。在好莱坞原创力逐渐下降的今天,电影巨头们纷纷把目光抛向这些传说中的英雄。下面是我了解的一些走进电影的漫画英雄的资料。
     
    超人(Superman)
      本名克拉克·肯特。来自氪星,因战争导致星球毁灭而被送到地球。拥有飞行的能力、闪电般的速度和几乎无穷的力量,眼睛还能发射激光。天敌是氪星石,可以完全禁锢其力量并使其不省人事。
     
    蝙蝠侠(Batman)
      本名布鲁斯·韦恩。父母意外被害后,因私自报仇而入狱,后被影子集团救出并受艰苦训练。返回后以高科技武装全身,行侠仗义。曾经和超人有过冲突和较量。
     
    蜘蛛侠(Spider-Man)
      本名彼得·帕克。本来是一名普通的学生,在一次蜘蛛展览中被一只基因变异的蜘蛛咬了一口,结果导致其自身变异,从而具有了蜘蛛般的敏捷和力量,并能发射出蜘蛛丝。除暴安良的同时也不免有些洋洋自得。
     
    夜魔侠/超胆侠(Daredevil)
      本名马特·默多克。一位拳击手的儿子,救人时发生意外导致双目失明,然而其余四种感官却变得异常敏锐,从而走上了除暴安良之路。常与蜘蛛侠合作。
     
    惩罚者(The Punisher)
      本名弗兰克·卡索。先后效劳于海军陆战队、FBI。一次任务后,全家其他人惨遭黑帮杀害,而政府却默不作声。于是便自己拿起武器,以暴力惩罚逍遥法外的凶徒。夜魔侠曾因反对他的极端暴力而与之交手。
     
    X-战警(X-Men)
      一群具有各种特异功能的变种人,其中的善良者被 X 教授培训,对抗万磁王集团,同时还要承受来自不理解他们的普通人类的压力。
     
    绿巨人(The Hulk)
      本名布鲁斯·班纳尔。在做一次实验时不小心发生爆炸,受到辐射,失去知觉的同时变身为绿巨人。他必须时刻面对罗斯将军的围捕。
     
    刀锋战士(Blade)
      尚在胎中的时候,其母亲被吸血鬼攻击而感染,因为只是被血液浸泡,所以他一生下来便同时具备吸血鬼和人类的能力。最后在威斯特的帮助下成为专门捕杀吸血鬼的战士。
     
    神奇四侠(Fantastic Four)
      五名科学家在太空战遭遇事故,受不明辐射而具备超能力。其中“末日博士”维克多·冯·杜姆妄图将其超能力用于其邪恶计划,而受到另外四人,即神奇四侠“奇幻先生”瑞德·理查德、“隐形女”苏·斯通、“霹雳火”约翰尼·斯通和“石头人”本·格林姆的阻止。
     
    恶灵骑士(Ghost Rider)
      每过一段时间,死神都会找到一位年轻人,签署一份出卖灵魂的协议,赋予力量,成为他的骑士。现任骑士约翰尼·布雷兹,在经过一段惨痛的挣扎后,完成了死神的任务,也看到了死神不可告人的目的。于是他拒绝继续履行协议,准备用这诅咒得来的力量和死神对抗到底。
     
    变形金刚(Transformers)
      这群巨大的钢铁家伙背景非常复杂,总之是高度发达的科技赋予了他们意识和智慧。主要是以擎天柱为领袖的“民用”汽车人代表的正义力量,和以威震天为头目的“军用”霸天虎代表的邪恶力量的长期战斗。
    7/17/2007

    对付沙人

      昨天下载了《蜘蛛侠 3》,因为天太晚只看了个开头。早就听说里面有个打不散理还乱的沙人,莫非比液态终结者 T-1000 还厉害?看之前,先自己想两套对付他的绝招。
      第一招叫“混凝大法”。就是准备好一堆水泥、一堆石子和一大桶水,一起泼过去,沙人不就成了混凝土吗?凝结过后,连动弹都不能,还威风什么哇哈哈!要不搞一大瓶强力 502,效果应该也不错。
      第二招叫“罐装散沙”。找一些够结实的瓶子,打开盖子,从沙人身上横扫过去,然后立即拧紧瓶盖,密封住。多来几次,沙人就被拆得七零八落,封在瓶子里面组合不起来了。如果蜘蛛侠力气够大,找一块大钢板,把沙人横切为两段,接着松手,下半个沙人就被压在钢板下,上半个走不了路就好对付了。
      鬼扯这么多,看看大英雄蜘蛛侠有没有更好的招式呢?

    Funny Things in JDK Source

    Though the full version of JDK source is available now, but the public src.zip installed under Java\jdk[version_number] directory is still my most frequent refered resource. Every time I encounter an API problem, this public source is read. And besides solving those problems, I've also found many interesting things which are sometimes also funny. Here are three exaples.
        Maybe since JDK 5.0, a method called wait(long timeout, int nanos) is introduced into Class java.lang.Object. Wait a minute, nanos, is it nanoseconds? It's no secret thst even in powerful Windows multimedia API, the precision of timer is only one millisecond, that is a million nanosecond. Though Java is pretty great, it can never deal with nanoseconds. And the source proves it, that nanoseconds are rounded to the nearest millisecond, 0 or 1... Amazing......
        Today I chased a JDialog's owner, and wanted to find a way to get the owner out, since there's no method called getOwner(). Finally I was awear that the owner of a JDialog is exactly its parent component. So owner is synonymous with parent now?
        At last, I wanna mention the JSpinner implementation is bugged. Some kinds of listener installed on a JSpinner take no effect at all. I found this comment in JSpinner.java: "Still bogus, nothing else we can do, the SpinnerModel and JFormattedTextField are now out of sync." The JDK developers deserve a thank for honesty. My solution is to directly manipulate the JFormattedTextField within this JSpinner, a compound JComponent.


    7/15/2007

    变形金刚

      本来我看电影一般都要等到至少 TC,因为 CAM 或者 TS 版本都属于偷拍一类,效果不好,很容易把一部好片看成烂片。但这次的《变形金刚》,实在引起了十多年的回忆,所以破例下载了 TS。
      小时候,我应该看过很多集动画版《变形金刚》吧,后来唯一记得起的角色就是汽车人(博派)领袖擎天柱,还记得擎天柱为拯救世界牺牲了自己。后来长大一点,想再看更懂一些,但电视台却不演了。盼好久盼来了一个叫《擎天柱》的什么片子,结果是介绍自然风光,害我白高兴一场。
      等到能上网的时候,本来印象就不太深的变形金刚被忘得一干二净,也就没想到去找下载。知道不久前,突然看到消息说要上演真人版的《变形金刚》,于是又忽然想看看擎天柱有多厉害。顺便查了一下网页,知道还有大黄蜂、铁皮、爵士……坏蛋霸天虎(狂派)的老大是威震天,同伙有红蜘蛛、迷乱……好像真的很有趣,于是等不及了,TS 也下载来看。
      要说这个 TS 的效果还不算很差,画面和声音都可以接受。电影有两个多小时。但是我感觉始终人的戏份比变形金刚重,不排除经费的原因。最后的决斗真是一场大混战,谁打谁都分不清楚。比较有意思的是,当擎天柱被威震天打得无还手之力时,对萨姆说:“快把魔方放进我的胸膛!”结果萨姆不知是听错了还是什么,把魔方放到威震天的胸膛里了,然后威震天就代替擎天柱自我牺牲……
      最后,擎天柱呼叫所有流亡的汽车人前来地球,有一点为续集埋下伏笔的样子。但威震天怎么复活呢?

    打造简单方便的复读机

      因为声音传播的介质不同,自己说的话,自己和别人听是不一样的。用复读机练习英语口语,可以随时体验别人听到的效果,从而帮助矫正发音错误等。可是质量好的复读机价格也不菲,并且似乎没有存储录音的功能?其实 Windows XP 自带的录音机就能很好实现复读机的功能。
      硬件方面,要有一个麦克风;最好有音箱,耳机也可以,但是要关掉“环绕立体声”之类的特殊音效。准备好后,打开“所有程序->附件->娱乐->录音机”。界面下方的五个按钮提供了常用的录音功能:“移至首部”、“移至尾部”、“播放”、“停止”和“录制”。要录音的时候,先按“录制”,然后对着麦克风说话,完了就按“停止”,最后用“播放”就能“复读”了。上面的进度条还能拖放,比复读机好用。
      “文件->另存为”可以把录音保存为 .wav 声音文件,一般用默认的格式就可以了。选择“文件->新建”开始新的录音,直接录的话会把新的录音追加到上一次的末尾。
      用这种办法,再加上媒体播放器的辅助,就能够完全实现复读机的常用功能,并且还能无限制地保存录音(只要硬盘足够大),体验自己的进步。
    7/14/2007

    My new understanding of Java's "synchronized" keyword

    To be honest, I knew only a little about concurrent programming in Java. I uesed to use keyword "volatile" as an attempt to "enforce atomic operations" which had brought me more troubles than solved. Time to walk through the Concurrency Trail of Sun's Java Tutorials that I never finished reading in the past.
        I do know and often see the usage of keyword "synchronized", but until yesterday I hadn't figured out how thie single word elimated so many synchronization problems. However, the very answer lies in those tutorials ever since I first read it and this time it has been clearly understood.
        Every boject has an intrinsic lock, which is also known as monitor lock or monitor for short, associated with it. When a thread invokes a synchronized method, it automatically acquires the intrinsic lock for that method's object and releases it when the method returns. The lock release occurs even if the return was caused by an uncaught exception. As for a static synchronized method, an intrinsic lock for the Class object of that method's Class is acquired instead. Synchronized statements internally behaves no differently except in addition to this, an arbitrary object whose intrinsic lock will be acquired can be and should be explicitly specified.
        In conclusion, "synchronized" keyword is a simplified way of locking objects, and also has many limitations. More sophisticated locking idioms are supported by the java.util.concurrency.locks package which I am going to learn.
    7/13/2007

    中国史上以少胜多的著名战役

      网上收集,未经全面考证,稍作修改并排版如下:
     

    战役名称

    胜方统帅

    对阵情况

    结果


    先秦时期

    牧野之战 姬发、姜尚 不足 10 万对 17 万(一说 70 万) 商纣王全军覆没
    柏举之战 姬光、孙武、伍员 3 万对 20 万 千里破楚,五战入郢
    阴晋之战 吴起 5 万对 50 万 大败秦军
    伊阙之战 白起 12 万对 24 万 全歼韩魏联军
    即墨之战 田单 不详 将燕军逐出齐国,尽复失地
    代之战 廉颇、乐乘 20 万对 60 万 大败燕军

    秦汉时期
    巨鹿之战 项籍 2 万对 40 万 歼灭秦军
    彭城之战 项籍 3 万对 56 万 歼汉军 20 万
    井陉之战 韩信 3 万对 20 万 灭赵,俘赵王歇
    潍水之战 韩信 数万对 20 万 灭齐
    昆阳之战 刘秀 不足 2 万对 42 万 王邑仅率数千人逃回洛阳
    祝阿、临淄之战 耿弇 数万对 20 余万 灭张步,平齐
    赤亭之战 虞诩 3 千对数万 大败羌军

    三国两晋南北朝时期
    兖州之战 曹操 数万对数 10 万 迫降黄巾军 30 万
    官渡之战 曹操 2 万对 10 余万 歼袁绍 7 万余
    赤壁之战 周瑜 5 万对 20 余万 大败曹操,为三国鼎立奠定了基础
    合肥之战 张辽 7 千对 10 万 大败吴军
    夷陵之战 陆逊 5 万对数 10 万 大败蜀军,蜀国从此衰落
    凉州之战 马隆 3500 对数万 平定凉州
    前秦灭前燕之战 王猛 6 万对 30 万 歼前燕军近 20 万
    淝水之战 谢玄 8 万对 97 万 苻坚败逃洛阳,仅剩 10 余万
    沙苑之战 宇文泰 数万对 20 万 伏歼东魏军 8 万余
    玉壁保卫战 韦孝宽 不详对 15 万左右 歼东魏高欢军 7 万余
    金乡之战 于仲文 8 千对 10 万 全歼席毗罗军

    隋唐五代时期
    浅水原之战 李世民 不详对 10 余万 消灭薛仁杲
    虎牢之战 李世民 3500 对 10 余万 歼灭并活捉窦建德
    唐平萧铣之战 李靖 不详对 40 余万 平萧铣
    碛口之战 李靖 3 千对不详 歼突厥军数万
    蔡州之战 李靖 9 千对不详 平淮西叛军
    奉天、灵台之战 郭子仪 不详对 30 余万(一说数 10万) 歼吐蕃、回纥、吐谷浑联军近 10 万
    太原之战 李光弼 不满 1 万对 10 万 歼史思明叛军 7 万余
    雍丘保卫战 张巡 3 千对数万 击退安禄山叛军
    睢阳保卫战 张巡 6800 对 13 万 歼安禄山叛军 12 万
    嘉山之战 郭子仪、李光弼 不详对 5 万余 歼史思明叛军 4 万
    象牙潭之战 周本 7 千对数万 俘危全讽及其叛军 5 千
    六合之战 赵匡胤 2 千对 2 万 歼金军 5 千

    宋辽金夏蒙元时期
    西夏、吐蕃攻宋之战 刘舜卿 不详对 20 多万 击退夏蕃联军
    达鲁古城之战 完颜旻 不详对 27 万 大败辽军
    护步达冈之战 完颜旻 2 万对 70 万 大败辽军主力
    和尚原之战 吴阶、吴璘 数千对 10 余万 大败金军,俘万余
    顺昌保卫战 刘锜 1.8 万对 10 余万 大败金军
    郾城之战 岳飞 数千对 1.5 万 大败金军精锐
    陈家岛海战 李宝 3 千对 10 万 全歼金军
    采石水战 虞允文 1.8 万对 17 万 大败金军
    海州之战 魏胜 不详对 30 万 大败金军
    六合保卫战 毕再遇 不详对 10 万 大败金军
    庐州保卫战 杜杲 不详对号称 80 万 大败金军
    边堡寨之战 孛儿只斤铁木真 不详对 30 万 大败金军
    纳忽山、不黑都儿麻之战 孛儿只斤铁木真 4 万对 8 万 全歼乃蛮部军
    迦勒迦河之战 哲别、速不台 不足 3 万对 8 万 全歼俄罗斯联军
    赛约河之战 拔都、速不台 不足 5 万对 10 万 全歼匈牙利联军
    鄂州之战 八邻伯颜 20 万对 60 万 大败宋军
    丁家洲之战 八邻伯颜 10 万对 13 万 大败宋军精锐
    厓山海战 张弘范、李恒 数万对 20 万 全歼宋军
    虎啸山之战 张庭瑞、焦德裕 5 千对数万 大败宋军
    鄱阳湖水战 朱元璋 20 万对 60 万 全歼陈友谅军

    明清时期
    白沟河之战 朱棣 10 余万对 60 万 建文帝军死伤 10 多万
    上峰岭之战 戚继光 1500 对 2 千 歼倭寇 300 余
    台州之战 戚继光 不详 9 战 9 捷
    浑河之战 爱新觉罗努尔哈赤 80(作战仅 4)对 800 战胜哲陈部
    萨尔浒之战 爱新觉罗努尔哈赤 4.5 万对约 11 万 歼明军约 5 万
    宁远之战 袁崇焕 不足 2 万对 13 万 杀伤后金军 1.7 万
    贵阳之战 王三善 2 万对 10 万 扭转平叛安邦彦的战局
    清征达瓦齐之战 阿五锡、巴图济尔噶勒 22 对 2 千余人 击溃达瓦齐叛军
    浑河之战 长龄 4 万对 10 多万 收复南疆西四城

    近现代时期
    南京之战 徐绍桢 约 1 万人对约 2 万人 攻克南京
    第一次反围剿 毛泽东、朱德 约 4 万对约 10 余万 歼蒋介石军 1.2 万
    第二次反围剿 毛泽东、朱德 3 万对 20 万 歼蒋介石军 3 万
    第三次反围剿 毛泽东、朱德 3 万余对 30 万 歼蒋介石军 3 万
    第四次反围剿 朱德、周恩来 约 7 万对近 40 万 歼蒋介石军 1 万余
    鄂豫皖苏区第三次反围剿 徐向前 近 3 万对不详 歼国民党军 6 万余
    川陕苏区反六路围攻 徐向前 近 8 万对 20 万 歼国民党军 8 万人
    黄桥战役 粟裕 7 千对 1.5 万余人 歼国民党军 1.1 万余人
    苏中战役 粟裕 3 万余对 12 万 歼国民党军 53700
    鲁南战役 粟裕 不详 歼国民党军 53530
    莱芜战役 粟裕 不详 歼国民党军 56800
    孟良崮战役 粟裕 不详对约 45 万人  
    晋中战役 徐向前 6 万余人对约 13 万人 歼国民党军 100370
    豫东战役 粟裕 不详 歼国民党军 93970
    淮海战役 粟裕、刘伯承 60 万对 80 万 歼国民党军 555570
    九连山战斗 不详 不详 5 战 5 捷,歼国民党军 6 个连又 1 个排
    7/12/2007

    夏夜静思

      夏夜,似有丝缕凉风,却又无处不透着闷热,本不当是夏夜。久不能寐而起,唯试以电脑疲之。视之亦无所乐,弃之亦无所从,而思之乃有此意,于是志之以为念。小处不胜烦却奈何?大处茫茫远又奈我何?尚有时。
     
    On a summer night, seems I'm in wisps of cool wind, but meanwhile surrounded by sultriness. It shouldn't be a summer night. I fail to get to sleep and rise. The only way is to try to be fatigued by my computer. There's no happiness watching it, but also no direction without it. I think it over and get this idea, and write this down as a mark. Minor difficulities are so confusing that little I can do. Major goals are bleak and distant but never stir me. There's time.

    7/1/2007

    1993 年第三届 Ig 诺贝尔奖

     
    心理学
      哈佛医学院的约翰·马克和天普大学的戴维·雅各布斯,两位精神幻想家,褒奖他们飞跃性的结论:相信自己被外太空的外星人绑架过的人,很可能真被绑架过——特别褒奖他们的结论:“诱拐的要因是制造小孩。”[参见:《秘密生活:第一手有案可查的 UFO 绑架报告书》]
     
    消费者工程
      朗·波佩尔,午夜电视里孜孜不倦的发明家和喋喋不休的牛皮大王,褒奖其为重新定义工业革命而弄出的如此设备:Veg-O-Matic 切菜机、口袋渔夫、话筒先生和蛋壳里的倒频器。[参见:《世纪推销员:在电视上发明、推广和销售:你也可以像我这样去做!》]
     
    生物学
      俄勒冈州健康部门的小保罗·威廉姆斯和利物浦热带医学院的肯尼思·W.·纽厄尔,两位果敢的生物学侦探,褒奖他们的先驱性研究:“快乐奔跑的猪身上的沙门氏菌排泄”。[发表于美国月刊《公共健康和国家健康》,卷 60,5 号,1970 年 5 月,926~929 页]
     
    经济学
      南卫理公会大学的拉维·巴特拉,泼悍的经济学家和畅销书《浩劫 1990》(17.95 美元)、《飞越 1990》(18.95 美元)的作者,褒奖单靠他的书卖出的足够数量,就阻止了世界经济的崩溃。
     
    和平
      菲律宾百事可乐公司,甜蜜希望和梦想的供应商,褒奖其发起竞赛来创造一个百万富翁,然后又公布了错误的赢家号码,从而激起 800,000 指望做赢家的暴民聚集起来,还在他们国家有史以来第一次让许多势不两立的派别联手。
     
    幻象技术
      颁发给密西根法明顿山的杰伊·谢夫曼,一流的“自动幻象”发明家,那是一种图像投影设备,使得一边开车一边看电视成为可能,同时也颁发给密西根州议会,褒奖其使之合法化。
     
    化学
      田纳西州路考特山的詹姆斯·坎贝尔盖恩斯·坎贝尔,香气的专职传播者,褒奖其发明了香条,就是通过这种讨厌的方法香味被用在了杂志的页面上。
     
    文学
      E.·托普尔R.·卡利夫F.·范德华夫P.·W.·阿姆斯特朗他们的 972 个合作者,褒奖其发表了一篇医学研究论文,其中作者的数量有总页数的一百倍。[此文发表于《新英格兰医学月刊》,卷 329,10 号,1993 年 9 月 2 日,673~682 页。作者们来自以下国家:澳大利亚、比利时、加拿大、法国、德国、爱尔兰、以色列、卢森堡、荷兰、新西兰、波兰、西班牙、瑞士、英国、美国。]
     
    数学
      南加利福利亚绿榕的罗伯特·费德,统计学里有远见且忠诚的占卜家,褒奖其准确计算出米哈伊尔·戈尔巴乔夫是反基督者的比值(710,609,175,188,282,000 比 1)。[参见:《戈尔巴乔夫!真正的反基督者来了吗?》]
     
    物理学
      法国的路易斯·科尔文朗,炼金术的热心崇尚者,褒奖他的结论:鸡蛋壳里的钙是由低温核融合造出来的。[参见:《生物炼金及其用途:化学、物理学、生物学、生态学、医学、营养学、农学、地质学》]
     
    医学
      詹姆斯·F.·诺兰托马斯·J.·史迪威小约翰·P.·桑德兹,仁慈的医生,褒奖他们不辞辛苦的研究报告:《被拉链卡住的阴茎的紧急处理》。[发表于《急诊医学月刊》,卷 8,3 号,1990 年 5/6 月,305~307 页]