Author: root

  • New award

    老彼得本学期带回家的奖状不多。也不知道是老彼得“退步”了呢,还是学校改变了奖状发放机制。反正我也不是很在意。

    不过,今天他还是带回来一个奖状,是古诗文背诵的。

    (more…)

  • 再看湖人

    NBA总决赛的前两场湖人都不是很发挥,今天终于,终于回到了Staples的主场,湖人也有惊无险的以87:81赢下了凯尔特人,将总比分扳成1:2。

    纵观这三场比赛,科比仍然是湖人赢球的关键因素,而只要拉德、萨沙、砝码三个人中有一个发挥好,湖人就可以赢球,今天是萨沙。

    湖人今天的赢球还再次充分的证明,季后赛、尤其是总决赛,赢防守者赢比赛的道理。

    期待湖人保持主场全胜,而率先取得天王山。

  • 近期赛事小结

    近期赛事频频,小结如下:

    1. 中国男子足球队:一群2;
    2. 中国女子足球队:有进步;
    3. 法网:纳达尔零封费德勒,非常的开心。至于后者是不是能成为下一个囊括四大满贯赛事的运动员,偶不关心,并且希望他拿不到——毕竟我是喜欢阿加西的;
    4. 女排:在瑞士精英赛上获得第二,让我看到了奥运会夺冠的可能性。蕊蕊伤愈付出,表现正常。其它新队员也不错;
    5. F1:今年的麦克拉伦要想翻身,看来难度不小。难道今年是要库比卡出头吗?
    6. 湖人:湖人目前以0:2落后,夺冠形势不容乐观。但是考虑到,接下来是湖人的3个主场,如果湖人能悉数拿下,那么历史同样证明,在3:2的局势下,拿下3的那个队是有优势的。
    7. 欧洲杯:没有了英格兰的欧洲杯,对我没有任何吸引力。我都不知道挺哪个队比较好。也许是荷兰?

    以上。

  • 死的怀念(三):外公、外叔公

    我家的成分,从父亲那里说,还算可以:父亲是革命工人,爷爷最多算是个中农转型到小商业阶级;但是从母亲那里说,就很差。

    外公是KMT的,外婆也是(至今健在),而外叔公也是KMT。而且,更糟的是,他们的职位还都不低;最糟的是,解放那会,外婆去了台湾,而外公和外叔公被滞留在了大陆。

    =================

    (more…)

  • 可爱的劲爆体育

    家里的CATV可以看劲爆体育,当然也可以看次次体位5的体育节目。发现劲爆体育其实还是很可爱的。

    其一,劲爆体育在“重播”比赛的时候,会毫不留情的杀掉任何过场。比如说NBA比赛,它在重播的时候,会删除所有的暂停、节间休息、中场休息等等,而几乎以迅雷不及掩耳盗铃之势重播完毕;而次次体位5在此时就显示出他们更加敬业,在重播的时候,会一丝~不挂~不苟的将所有的暂停、节间休息、中场休息原汁原味的放出,当然广告也会原汁原味的放出。

    其二,劲爆体育在播放新闻时,很少插播广告,就算有也是很正板的内容,在这一阶段更是在不遗余力的播放“平安中国”,而次次体位显然已经从这个气氛中解脱了。

    这,大概就是收费电视和免费电视的区别吧?

  • 死的怀念(二):爷爷、奶奶

    大部分关于奶奶的故事我已经在另外一篇文章中写过了。这里不重复贴出,只是会在必要的时候补充一些。

    ==============

    爷爷的脾气一向很直。在苏州话中,这个“直”可以理解为:直来直去,也可以理解为“笃头笃脑”。而爷爷的脾气更多的是属于后一种。

    (more…)

  • 从NBA停播想到的另类解决方法

    次次体位停播NBA,复播NBA。从这个例子说明以下几点:

    • 长官意志高于一切。停,不需要理由;复,不需要理由。
    • 有政府干预其实不错——至少次次体位可以向David Stern两手一摊,说:这个是不可抗力。Savvy?
    • 两面装相反的d真的是某些GLC(Government Linked Company)卖乖的不二法门。在迫于上头的龟腚时,可以向用户推说是来自上面的龟腚;在上头又改变主意时,可以将这个改变窃为己有,变成自己的功劳。

    ===========

    其实,我有一个很另类的解决方法,可以解决所谓NBA太激烈而带来的问题:

    将NBA现场的声音全部屏蔽掉。

    如果还是不相信我们的解说,可以将解说全部屏蔽掉。我们就看画面,和理所当然、不得不播的广告好了。

  • 研究:Python Mock Object教程

    原文连接:http://www.xper.org/wiki/seminar/PythonMockObjectTutorial

    ===============

    源文件可以在mockobject.py处下载(它使用到了PyUnit模块)。

    在开始之前,我想先和大家确定一点:本教程不是Mock Objects的介绍;它只是一个如何在Python 中使用MockObject^模块的简短介绍。在这里我们会看到一些Mock Objects的基本用法。要了解Mock Objects更多的信息,可以参见:

    第一篇文章是任何想使用Mock Objects的人的必读(囧——译者注)。

    JuNe

    假定你和你所在的团队在建立一个KMS。那么应该有一个数据库保存了所有的文档。团队决定创建一个函数来删除所有一年前发布的文章。根据文档名删除文档,以及取得所有文档名和发布日期的功能是已经有了的——由接口完成——但还没有实现,数据库也没有建立。你被分配来开发“删除老文档”的功 能,但它取决于数据库组件。你是不是应该等下去,直到别人完成了你的模块所依赖的所有功能后才进行开发呢?

    让我们使用Mock Objects。 第一个版本将是这样的:

    import unittest
    def removeOldDocs(aDb):
        pass
    class RemoveOldDocs(unittest.TestCase):
        def testRemoveNoneFromEmptyDb(self):
            removeOldDocs(db)
    if __name__=='__main__':
        unittest.main(argv=('','-v'))

    此时,我们想测试的情况是:如果数据库中没有任何文档,那么也就没有任何文档会被删除——这可能是最简单的情况了。这里有两重的问题。他们还没有实现数据库,而我们如何能测试removeOldDocs表现正常呢?让我们用一个mock object来进行“伪装”。

    import unittest,mockobject
    class MockDb(mockobject.MockObject):
        pass
    def removeOldDocs(aDb):
        pass
    class RemoveOldDocs(unittest.TestCase):
        def testRemoveNoneFromEmptyDb(self):
            db=MockDb()
            removeOldDocs(db)

    现在正常了,但是测试代码并不完整。我们需要测试removeOldDocs的行为。在测试用例中增加以下两行:

    class RemoveOldDocs(unittest.TestCase):
        def testRemoveNoneFromEmptyDb(self):
            db=MockDb()
            db._setExpectedRemoveCalls(0)
            removeOldDocs(db)
            db._verify()

    当然,此时会出错——因为我们还没有定义_setExpectedRemovedCalls。还好,计算机告诉我们接下来做什么:定义这个方法。 我们在新定义的方法中要做些什么呢?我们应该设置删除调用应该进行的次数。因此,我们在MockDb__init__中创建一个Expectation对象。

    class MockDb(mockobject.MockObject):
        def __init__(self):
            self._removeCalls=mockobject.ExpectationCounter(MockDb.removeCalls)
        def _setExpectedRemoveCalls(self,aCount):
            self._removeCalls.setExpected(aCount)

    现在我们运行测试代码,代码测试通过。现在,让我们做一些有意义的事情。

        def testRemoveOne(self):
            db=MockDb()
            db._addDoc(doc1,1992/3/1)
            db._setExpectedRemoveCalls(1)
            removeOldDocs(db)
            db._verify()

    等一下。当前时间的信息在哪里?我们是不是也可以“伪装”它?是的。你可以替换time模块(或函数)而改用MockTime类。但是,这不是一个很好的想法。为什么不用参数将它进行传递呢?哈,我们需要修改代码,以及测试用例。让我们暂时注释掉刚加入的测试用例,让所有的测试都得以通过。然后修改测试代码。

    class RemoveOldDocs(unittest.TestCase):
        def testRemoveNoneFromEmptyDb(self):
            db=MockDb()
            db._setExpectedRemoveCalls(0)
            removeOldDocs(db,2002/3/1)
            db._verify()
    ##    def testRemoveOne(self):
    ##        db=MockDb()
    ##        db._addDoc(doc1,1992/3/1)
    ##        db._setExpectedRemoveCalls(1)
    ##        removeOldDocs(db)
    ##        db._verify()

    如我们所愿,测试出错了。让我们使之通过:增加一个参数。

    def removeOldDocs(aDb,aDate):
        pass

    现在回到刚才被注释掉的测试用例。函数调用中增加一个参数并运行。这回,计算机需要定义一个新的方法。

    class MockDb(mockobject.MockObject):
    ......
        def _addDoc(self,aName,aDate):
            pass

    现在又出错了。需要调用一次删除操作,但是一次也没有调用。

    class MockDb(mockobject.MockObject):
        def getAllDocumentDates(self):
            return ()
    def removeOldDocs(aDb,aDate):
        for eachDoc,eachDate in aDb.getAllDocumentDates():
            if isOlderThanBy(eachDate,aDate,365):
                aDb.remove(eachDoc)

    假定isOlderThanBy已经实现了。这行的意思是:如果eachDate早于aDate超过365天。

    现在我们创建一个新的属性以便我们在mock db中保存测试用的文档。

    class MockDb(mockobject.MockObject):
        def __init__(self):
            self._removeCalls=mockobject.ExpectationCounter(MockDb.removeCalls)
            self._docs={}
        def _setExpectedRemoveCalls(self,aCount):
            self._removeCalls.setExpected(aCount)
        def _addDoc(self,aName,aDate):
            self._docs[aName]=aDate
        def getAllDocumentDates(self):
            return self._docs.items()

    是时候在mock db中加入remove方法了。

    class MockDb(mockobject.MockObject):
        def remove(self,aName):
            self._removeCalls.inc()

    现在所有都可以执行通过。我们可以再增加一个测试用例。

        def testRemoveSome(self):
            db=MockDb()
            db._addDoc(doc1,1992/2/15)
            db._addDoc(doc2,1992/3/15)
            db._addDoc(doc3,1992/4/15)
            db._setExpectedRemoveCalls(2)
            removeOldDocs(db,1993/4/1)
            db._verify()

    不需要修改代码,该用例应该可以通过。

    如果你想确定某些特定文档被删除,你可以使用ExpectationSet。例如:

    class MockDb(mockobject.MockObject):
        def __init__(self):
            self._removeCalls=mockobject.ExpectationCounter(MockDb.removeCalls)
            self._removedDocs=mockobject.ExpectationSet(MockDb.removedDocs)
            self._docs={}
        def _addExpectedRemovedDoc(self,aName):
            self._removedDocs.addExpected(aName)
        def remove(self,aName):
            self._removeCalls.inc()
            self._removedDocs.addActual(aName)
            #you may add del self._docs[aName] here if you'll use getAllDocumentDates again
    class RemoveOldDocs(unittest.TestCase):
        def testRemoveSome(self):
            db=MockDb()
            db._addDoc(doc1,1992/2/15)
            db._addDoc(doc2,1992/3/15)
            db._addDoc(doc3,1992/4/15)
            db._setExpectedRemoveCalls(2)
            db._addExpectedRemovedDoc(doc1)
            db._addExpectedRemovedDoc(doc2)
            removeOldDocs(db,1993/4/1)
            db._verify()

    有很多不同类型的Expectation类,如ExpectationCounterExpectationListExpectationSet以及ExpectationMap等。

    尽管我们在测试用例中创建了mock objects,但是使用setUp方法等将它们重构出去会更好。而且我们有很大的几率消除代码中的重复。代码会更短、更清晰,只要我们严格遵循OAOO。但可惜的是,本教程就会更加的冗长了。

  • BT群5月份签名档记录

    2008-05-05 10:44:19 我是出来买酱油的
    嗯,事不关己,高高挂起。
    2008-05-06 11:06:10 :据报道,目前S群情绪稳定
    源于性浪的一篇新闻报道:目前S者情绪稳定。可不吗,这世界上已经没有比S者情绪更稳定的人了。不过不知道是不是一语成谶……
    2008-05-13 09:55:26 为大地震死难者默哀。顺大便BS决定继续传递火炬的SB
    汶川大地震于5月12日发生。针对火炬接力如期举行的举措,我们顺大便表示了我们的不满。
    2008-05-16 08:45:18 道义放两旁,关怀摆中间
    针对救生、救灾过程中发生的一些道德问题,BT群适时的提出了这个口号。实践证明,我们这次又跑在了国务院之前。
    2008-05-19 09:28:19 为地震死难者默哀
    全国哀悼日。
    2008-05-22 09:40:10 继续生活,继续工作,继续关怀
    生活还要继续……

    五月份因有长假和地震的原因,签名更换不多。

  • “六一”苏州乐园游

    今天是“六一”国际儿童节,圣上和梓童、太子一起到苏州乐园游玩。

    去的比较早,所以还比较空,到了下午就不对了,这个people mountain people sea啊。

    这次去,除了是应“六一”的景之外,也是为了测试圣上的四能加百五零弟。联机相册已经创建于此处,欢迎鉴定。

    ============

    从拍摄效果看,四能加百五零弟还是不错的,特别是连拍,拍到了梓童在弹射升空时哇哇乱叫、花容失色的珍贵镜头,但由于涉及暴力和形象问题,所以只放一张,另加一张抓拍的悬挂式过山车的照片。

    太子照片当然还是重点。Hiahiahia。