![]() |
|
Spaces home SHARE CHERUBProfileFriendsBlogMore ![]() | ![]() |
SHARE CHERUBmovie, IT technique, and Life
July 03 河马日记2008年7月3日小河马出了水痘后似乎开了窍,话说的利落多了。 云震不会说话,这已经是困扰爸爸妈妈很长时间的问题了。每周给家里打电话,太太和爷爷都要问云震会不会说整句了。 比较明显的进步是在希腊度假的期间,那时候云震过了两岁生日,估摸着实在不好意思再咿咿呀呀的。 走在威尼斯的小街小桥,云震很主动的要求:“妈妈抱抱”,或者“云震自己过桥”。另外,一路舟车劳顿,云震把飞机、火车、汽车和船认个门清。最可怜的莫过于从雅典到罗马再到威尼斯的那一晚:临到罗马,云震就已经在飞机上睡着了;我们半夜在火车上一节车厢一节车厢找卧铺的时候,云震挣扎着睁了一下眼睛,全然不知道自己到了什么地方;第二天一早5点多下了车,云震只顾兴奋得看火车,全然没搞清楚为啥睡觉的时候在飞机上,醒过来却是从火车上下来的(其实也不全是,我们的行李丢在了罗马机场,我们找行李的时候小河马是醒的,可惜他没能坚持到我们上火车,更没坚持到我们上有卧铺的长途火车。也得亏行李“丢”了,可以轻装上阵,但小河马没了奶没、了尿布非常狼狈,大半夜的在罗马死活买不到尿布!)。 除了主动说的那两句半以外,爸爸最欣慰的是小河马开始很有兴趣学说话了。 有兴趣学就要有办法教。 有些办法挺可怕:小河马最先学会的英文是“NO”。我们很快发现,如果想阻止云震干某件事情,以最严肃的口气说NO效果最好。可惜,效果好的东西往往不能滥用,滥用的结果一是效果下降,二是小河马很快掌握了使用NO的要点。当他开始不停的用NO的时候,事情就变得很复杂。 NO之后是“不要”。有时候妈妈干脆就说云震是“小不要”。 有天早上实在是把“不要”发挥到了极致:起床的时候,小河马先醒了,站在小床边喊妈妈,惯例是爸爸过来给穿衣服。小河马见到爸爸就是“不要爸爸”;好容易说明白了妈妈也要洗脸刷牙穿衣服,小河马说了“不要穿衣服”;然后是“不要脱衣服”、“不要尿布”、“不要袜袜”、“不要裤裤”。。。爸爸说,“一起背三字经吧”(三字经的事情后面说),云震说“不要人之初”;然后又是一系列的“不要穿鞋”、“不要喝奶”、“不要刷牙”、“不要洗脸”。。。爸爸咬牙切齿的做完全套早上活动,跟妈妈说,“再‘不要’我就打死他。。。”。 教学的事情印象中还是妈妈提出来的,“云震已经在学说话了,能带着他读点什么?” 最早的“朗读”教材是一本婴儿谜语书,书上有云震最喜欢的“城市三兄弟”:救火车、救护车和洒水车。谜语念着还有韵脚。 受“有韵脚”的启发,爸爸建议念《三字经》。没啥说的,最最经典的启蒙教育读物。 其实爸爸最强调的是念。妈妈曾质疑过这小东西能明白吗?爸爸解释说,“本来目的也不是让他明白,就是跟着念些东西,把说话的事情巩固一下”。 另外,这种只念不教的事情也不是爸爸琢磨出来的。 丽娟姐是爸爸住在Sheffield时候的房东,台湾人。她用识字卡片教自己三个小孩读经。我在的时候,印象尤其深的是她最小的女儿,三岁的书瑄,在一页一页的读《道德经》。我也曾好奇的问,“这小孩能明白什么意思吗?”。有时候,我在厨房里也会问年岁大些,已经完全熟背《道德经》的书玮,“‘天之道,损有余而补不足’怎么讲?”丽娟姐是坚持让小孩读经而从不讲经。她说,孩子有孩子自己理解的方法和途径,先让他们自己来读,自己来理解。无所谓对错。 这点很启发。爸爸提出让云震念《三字经》也是这个道理,懂不懂无所谓,而且肯定是不懂,别说云震,爸爸和妈妈也有不明白的地方,例如“弟于长”,那爸爸就得解释这“弟”是什么意思给妈妈。还是以念些东西为目的吧。 事实证明,《三字经》作为最传统的启蒙读物是有道理的:三个字一句!以云震现在的语言模仿能力,两个字为最佳,三个字有挑战,四个字及以上就囫囵吞枣般不知道说的是什么了。 带小河马念三字经可不是在私塾里面跟先生读书一样,先生坐上面,学生坐下面,每个人拿本书,正襟危坐,高声朗读。小河马不识字啊。所以是跟读。你也不能指望爸爸或妈妈手里端上一本书,那小河马的兴趣就在翻书页而不是跟着念了。 现在的“教学”模式是跟读。大人读一句,小河马跟一句。这就要求大人得先会几句。 “人之初,性本善,性相近,习相远”。这四句大家都没问题。 “苟不教,性乃迁”,这就出笑话了。“我总觉得下一句是‘狗一叫’就怎么怎样的”,妈妈说。 好在是一口气读完一本不可能,大人也有个喘息临时抱佛脚背上几句再带着小河马念。往往是妈妈教着,爸爸还得在旁边纠正着;或者反过来。 刚开始,教的时候,就说:“云震,我们背三字经吧”,然后就是“人之初”起头。“人之初”起头多了,这小东西就会了,甚至成了条件反射。在车里,爸爸开车,头也没回,和云震说,“我们背。。。”后面的话还没说出来,小孩就已经开始“人之初。。。”。他已经把“背”和“人之初”建立了一个良好的联系。这也才所以有了上面“不要人之初”的故事。 教学都是有收获和挫折的。 教学目标是让小河马练习发音,现在,说整句的问题上确实有成效,经常很主动的冒些主谓宾结构的句子出来,非常欣慰。 一个额外的收效,小河马真的能背下几句三字经。第一次发现是某次念“苟不教”的时候,他没有跟着读,而是接上了一句“性乃迁”,着实让人兴奋一阵。后来有几句还真是能接下来,不过完全看他自己的情绪。 但云震说话还是很有点“口音”。早些时候,“没有”说成“美油”、“云震”说成“隐针”;后来发现这孩子还不会发f的音,“吃饭”说成“吃半”;h的音也不好,“花”说成“八”,“黄”非要说成“白”。 更大的挫折是小孩耐心有限。现在叫他来跟着读上几句三字经很麻烦。爸爸记得,中学语文老师说,读经就得有点私塾读书的味道,要拖长音,有节奏,并且摇头晃脑的。爸爸也这么教云震,可惜他理解有问题:一说背书,他就开始“摇头”。摇得频率很高,一个字没说完要晃上两个来回。这谁受得了啊,一句读不完整个人已经东倒西歪的了。唉,他很乐衷于此,一头倒在地上还咯咯的笑个不停。 诶,三字经背了五十二句,不知道下面进度如何,到哪是哪吧。 June 09 河马日记2008年6月9日爸爸周四周五去了剑桥,周六回家。 到家妈妈就说云震昨天半夜发烧了。爸爸把小孩搂过来摸摸,还好,已经不烧了。爸爸又想起了以前的小河马周末生病的规律,“怎么玩回来就这样,刚回来那个周末就开始发烧,还吃了一周的阿莫西林;这又开始发烧了,真是的。。。” 当天晚上云震没有再发烧,看着精神也很好,爸爸还当这次“周末规律”这么快就过去了呢。 周日,妈妈撩开云震的上衣叫爸爸过来看:后背中部有两个红点,包的头头已经透亮,水泡。妈妈警惕的说,“是不是水痘?” 经过奶奶和妈妈的联合会诊,是水痘无疑。好像云震吃了炒鸡蛋过敏的时候,我们隔上一会就撩开他的衣服查查后背的包,看看前胸是不是有新的包长出来了。 爸爸上网查了一下水痘:症状符合。网上的建议主要有如下几条:
其他就没招了,也不需要啥招。水痘嘛,超强传染能力,但破坏力有限,小孩自己扛着就过去了,一次发病,终身免疫。冲这点,很多人都挺“自豪”已经得过水痘了,例如妈妈,例如隔壁Dave和国锐大大。 爸爸没得过,奶奶也没有。最高危的人要承担最艰巨的护理任务:云震将在家里呆上一周。周日确认的这个安排,接下来的一周显得好长好长。 网上说,水痘是一种常见的病毒传染疾病,一般在3月到5月高发,一般在2岁到8岁的小孩身上高发。爸爸不得不佩服小河马真是个标准Baby:生怕自己有一点特殊,生怕破坏了人家科学的统计结果,刚刚过了2岁生日,刚刚地在5月底感染。 周日周一是零星发作,一会在后背发现几个红点,一会在前胸看到几个红点长成了痘。 周二则开始厉害了:脸上一下子起了很多,特别是嘴周围和下巴;两个眼睛的眼皮也起了包。晚上就睡不好觉了,实在是痒,看着小孩在床上滚来滚去的,整夜整夜的睡不踏实。 周三开始用Calamine lotion,并且在睡觉前给喂Calpol。虽然不发烧,但Calpol确实有止痒的作用,云震可以安静的睡上一大阵。后来,妈妈还突然明白过来,云震已经两岁了,Calpol可以加大剂量到10ml。加大剂量后效果更好,之后两天,云震都早上睡到很晚才自然醒。妈妈咬咬牙说,“以后每天给喂Calpol吧,睡觉多好。。。” 两天,到了周四的时候,明显见好。脸部的正常皮肤占了多数。 长包的地方抹上Calamine lotion,弄个大花猫脸。爸爸问,“长水痘变成花猫脸,过敏变成猪头脸,那个好看呢?” 除了花猫脸以外,妈妈说,“这孩子长大了出青春痘的时候就是这个样子”。爸爸对青春痘一点不陌生,不用妈妈反复提醒……情况好转后,小河马多了个“青春痘男”的称号。隔壁Dave说云震是Spotty Boy!看来云震不太喜欢长痘痘,站在门口还害羞的,一说痘就指着脸,不让抠就用个巴掌去摸摸。 一周的时间吧,到了周六就明显看到脸上的包收了。有未幸免被抠破的地方,看看云震的造化吧。妈妈提到水痘扣破落坑的事情,就指着自己的脸数脸上的五个坑。 May 22 河马日记2008年5月19日两篇日记隔了将近60天。一来是爸爸论文到了最紧张的时候,很多事情压着;二来是10天的全家旅行,更拖延了时间;加之一直整理不出一个思路或者专题来写,迟迟没有动。 今天还可以记个专题,但以后就难说了。小河马进入可怕的两岁后,各方面显著变化,且变化速度明显加快,让人目接不暇。没准我会改改风格,看到点滴都尽量记下来,流水帐也好,小轶事也好。 今天说说云震在幼儿园最有“成果”的活动:画画。 参观幼儿园的时候,阿姨就介绍有Messy Room,里面摆上一长条桌子,角落都放着架子挂着纸,抽屉里各种各样做手工的东西。我以为这是给稍微大点小孩学画画做手工的地方,谁知道云震上幼儿园没几天就拿着“作品”回来了。 “画画”这条件在家里是提供不了的。姥姥还在的时候,手上稍微摸脏了就擦干净了;云震抓个笔还不能随便乱画,爸爸赶紧把笔帽盖上或者把笔尖按回去。在幼儿园就简单了:老师给每个小孩穿上一个雨衣似的外套,发个笔刷子,弄上颜料,一大张白纸你随便画吧! 不仅仅发笔或者刷子,还有其他工具:例如发上个Lego的积木块,用凸起的点点沾上颜料在纸上乱扣一气; 要么发上个瓶子底似的在纸上轧来轧去(这是Polar bear!); 最直接就是把脱光了袜子直接上脚踩或者按上满纸的手印; 其他还有手工制品,具体制作过程不太好说,应该是老师先在纸上刷好胶水,这帮孩子就随意往上贴,贴上的就成图了,贴不上的,自然掉下来。 不仅仅是纸上的作品,小孩们还弄个泥巴块捏捏做个蜡烛的托;或者弄块蜡按按说是“恐龙脚印”;更多的是大家每人掺和一下在一个大碗里面搅和巧克力或者面糊糊自己做点心,每次都是一边做一边吃,吃得多做得少。 真亏得老师了。这样的手工画画之类的小组活动,老师都会给抽空照几张照片,爸爸妈妈就能看到作品之外的故事:在做乌龟之前,一串小孩爬在玻璃缸边上看活的乌龟;画大猩猩之前每个小孩给发了个黑猩猩的玩具。Amy阿姨一次描述云震画画的样子,拿着笔,然后一脸严肃地一笔一笔地刷!那表情和照片上的小河马活脱脱一模一样。 其实,就算看了活乌龟,玩了大猩猩,这孩子们怎么就知道画出来呢?显然是阿姨们后期加工的成果!这点,我可是佩服阿姨们的敬业精神和想象力了。每张作品都按照大致的形状给裁剪出来,贴上名字和主题,要么再给贴上个眼镜啥的,这才看着似乎是那么回事了。 幼儿园的作品还和传统节日有关,威尔士国庆日的时候,大孩子画威尔士国花水仙花,云震这么大的小孩只能画威尔士大葱;英格兰国庆日就让小孩子用不同材质的红色的纸在白纸上帖出个大十字;澳大利亚什么日子的时候,画上一只袋鼠;而爸爸最满意的小河马的作品当属在中国新年时候他们“写”的“大字”了。这满意不仅仅看单幅作品确实像模像样,还要和其他小朋友的作品对比起来看,也还就是小河马画出来的像个中国字的意思(爸爸说是“春”字的狂草)。嗯,不愧是中国的种。 这些作品都钉在墙上,越来越多,一面墙满了,再占另外一面吧。 在威尼斯,建勇大大给我们小河马下定论:云震对音乐有点感觉,但对画可一点不感冒。现在小河马没事会哼唧上几句“Twinkle, twinkle, little star”的旋律,但在威尼斯总督府里面看到那么多壁画,一点反应都没有。这是不是和小河马的“艺术实践”有关系?:D 又及:从希腊回来当天就赶上降温,小河马已经发烧两天了。这小东西的上呼吸道真是差,一点凉受不得。 March 22 河马日记 2008年3月22日这篇要记录小河马里程碑一样的事件:断奶瓶。 就在昨天。 妈妈终于下定了决心给小河马断奶瓶。 在云震将近20个月的时候,Health Visitor来家里,点出不能再给小河马用奶瓶了。理由也很简单,坏牙。 如果用杯子喝奶,奶直接从嗓子眼就喝下去了;但用奶瓶喝奶,奶会在嘴里“呆”上一会才喝下去。不论是牛奶还是配方奶粉都有糖份,这些东西在牙齿上滞留时间越长越坏牙。 当时是爸爸在家接待的Health Visitor,爸爸还“辩解”了一下:一来我们小河马并不拒绝使用其他杯子喝奶喝水,他现在嘬奶瓶完全是一种心理上的愉悦;二来,我们仅仅在早上起床后以及晚上洗澡前给他两次奶瓶,喝完奶之后立刻就是刷牙的例行,坏牙的说法并不成立;其三,有鉴于之前有人说妈妈给小河马220毫升6勺奶粉的配方是“注水奶”,需要同时解释一下的是,给小河马坚持奶瓶的一大目的是让他多喝点水。 无论如何,妈妈是下了决心给小河马断奶瓶了。 首先就是把所有的奶瓶藏起来。 爸爸很开心这一点。平时是一天两个奶瓶,两天四个奶瓶。家里总共五个大奶瓶,也就是两天要洗一次奶瓶的频率。 追溯洗奶瓶,最早最早是妈妈的活,还喂母乳的时候,妈妈就要用吸奶器把奶水吸出来放到奶瓶备好,夜用。 后来姥姥承担了任务,再后来,就一直是爸爸的任务了。奶奶来以后,厨房家务都还不熟悉的时候就把洗奶瓶的事情先接手了。不过,爸爸洗奶瓶时间很长了,看着池子边上放着的奶瓶就有心理压力,这下藏起来,不仅云震眼不见心不想,爸爸也舒心很多。 这两天,奶奶把电蒸锅也收起来了。 蒸锅大部分用处是消毒奶瓶。打云震出生到现在,也用了一年半多了。 云震开始用大奶瓶后,三层的蒸锅一次最多也只能蒸五个奶瓶和奶嘴、瓶盖等,配合得正好。 放奶瓶也是有“制式”的:下面的高的一层平倒着放三个奶瓶,成三角形;中间一层放奶嘴、奶嘴箍以及盖子;最高一层并排放两个奶瓶并插空放瓶盖。刚好可以盖上蒸锅的盖子。也得亏是Avent的奶瓶,不知道其他牌子能不能配合得这么恰到好处了。 “飞鸟尽,良弓藏”;不仅蒸锅被收起来了,放干净奶瓶的密封盒子收起来了,奶粉桶也收起来了。厨房桌子一下清爽很多。 前面说,小河马嘬奶瓶完全是一种心理上的愉悦,这是事实。 先说早上。例行是8点左右起床,爸爸给小河马穿好衣服后,小河马从屋子里随手抓上个玩具就晃荡晃荡的起身出屋门,右拐,扶着爸爸下楼梯,然后就看见饭桌上妈妈给准备好的一瓶奶。这个时候,云震会攒起哭腔,把玩具放在桌子上,伸手要抱过奶瓶。 爸爸把小河马放到他自己的高椅上,小河马就已经等不及了。很遗憾的是,直到断奶瓶,云震还是不会自己把奶瓶的盖子给揪下来。这个时候,揪下奶瓶该的动作要快,稍慢半拍,会很影响小河马喝奶的心情。。。 云震开始嘬奶瓶了,全家所有人都可以各干各事了。早上时间很紧张啊,妈妈要收拾脸,倒饬衣服;爸爸赶紧冲上咖啡,刷个牙,抹把脸。 云震喝完了还要很意犹未尽的咬着奶嘴逛会瓶子,而或自己很满足的把奶瓶盖子盖上。 之后的例行如吃伊可新、刷牙洗脸或穿插大便等,往往比较顺利。 再说晚上8点不到,陪云震玩的妈妈就在小屋大喊让爸爸烧水。这个点,这个时间,这个事件,云震早明白是给自己准备奶了。爸爸下厨房去烧水,云震也很高兴地下厨房来凑个热闹。忙叨叨的从桌子那边把奶粉桶给举到这边;或者抠着奶瓶盖子和奶嘴很兴奋的喊两声。 妈妈那个30磅的烧水壶烧水的时候亮蓝灯,水开了会响起来提示,云震也明白了。水开了,他反而不着急了。云震知道开水烫,爸爸从来不让他靠近,索性爬到椅子上,手撑着桌子看爸爸冲奶。 先加开水,90毫升左右;再加凉白开,加到230毫升,少尝一口,温度差不多就行了。大声的从1数到6,放上6勺奶粉。“大声数”也是“制式”?是啊,妈妈经常数不到5就已经数糊涂自己放了几勺了。还有就是稍带脚地教云震数数。 这种教云震数数的实践还有下楼梯的时候,每下一阶就数一个数,从二楼到厨房只有5阶,每次都是从一数到五。还是Health Visitor来的时候,她提到了这个方法;我们之前已经在实践了,爸爸还心里窃喜。人家怕爸爸没搞懂,连比划带说的:例如下楼梯的时候,就可以教小孩子学数数啊。你说“一……二……一……二……一……二”。爸爸心说,难怪小河马最会说的是一和五。虽然方法对了,但教的内容也得对得上云震的智力水平才行。 还是说奶和奶瓶:盖子盖好,摇匀。小河马就很开心了。这时候,几乎可以让他做任何事情。爸爸一般会指引小河马自己拿着奶瓶爬上楼梯回自己的屋子。 如果小河马没有跟着到厨房等着冲奶,把奶瓶拿到他的小屋,是云震很高兴的事情。 “乖乖坐好喝奶了”,云震会找个很舒服的位子,或是找到妈妈的两腿间,或是找到大鲨鱼(毛绒玩具)的边上,一屁股坐下。抱起奶瓶,仰过头,一饮而尽。前一段小河马气管里痰比较多的时候,一边喝着一边听着气管里面呼噜呼噜的,听得人心里都闹急。云震却毫不受干扰,专心享受嘬奶嘴的愉悦。 何以见得云震是“吮吸”愉悦而不是贪奶?两个简单例证:小河马一直喝的同一个牌子的奶粉,但这个奶粉在今年换了一次配方,爸爸和妈妈冲奶的时候闻着明显奶粉味道变了,但小河马一点反应都没有,真是一点都没有;另外,如果用杯子吸或者干脆敞口喝,小河马对奶也就那么回事,断奶瓶以来早上晚上喝奶明显不是那么痛快了。 昨晚第一次断的奶瓶,云震还没有察觉。今天早上就察觉了。 和往常一样,起床穿衣下楼,但桌子上似乎少了点什么。可怜的小河马四处张望了一圈,但是实在想不起来什么东西变了,而或心里明白但不会说。颠着脚急了一下,接受了改变。 妈妈总是和爸爸说,给云震断奶瓶,简直就是剥夺了小河马每天最愉快的时光,实在是不落忍。骑驴看唱本,走着瞧吧。 March 20 河马日记 2008年3月20日就是前两天的事,和幼儿园的事无关。 那天小河马惹妈妈不痛快了:吃饭的时候不好好吃,在屋子里的时候也淘气得“没边”,短时间内被妈妈训斥四次。 转眼间晚饭结束,到了云震每晚例行拉屎时间,也是臭臭前痛哭的时间。 这小孩打小落下的毛病:刚刚断奶加辅食那会,大便一下子干燥起来,拉臭臭成了一件很痛苦的事情;即便很快大便本身没了问题,但痛苦烙在了记忆里,条件反射似的,每天大便前哭得很悲伤。 这次也不例外。虽然小河马每每哭起来就忘记了怎么说“拉屎”,爸爸、妈妈和奶奶都明白这哭,妈妈一问“是不是拉屎?”,小河马带着哭腔说“拉屎”。 妈妈抱起云震去把把。“把把”在楼上,两个屋子门前到楼梯口的一小方块地,靠窗户放了个沙发,平时沙发上堆着出门穿的外套,沙发一边放着云震的鞋;另外有一个塑料盆,随时备上一大摞报纸,双层的,垫在盆里;大人坐在沙发上,臭臭就把到盆里。这些都是姥姥照顾云震的时候留下的“制式”,我们之后都没有改。 谁知道这次云震死活不让妈妈把,伸着手喊奶奶。妈妈强行拖了裤子把,云震能挺成个弓形,就是不干。 没着,就让奶奶把吧。 奶奶刚就位,云震刚刚被交手,噗一下就拉了。这孩子一直强憋着就是不让妈妈把! 妈妈问问云震,“拉完了吗?” 如果还需要把会儿,云震会说“没有”;如果完事了,小河马就自己找纸,拽出来,递到你手上让你擦屁屁。 擦完屁屁那就妈妈带着屋里穿裤裤吧?今天还是不干,就是不跟妈妈了。 云震转脸一猫腰把屎盆端起来了,“妈妈倒”。 一下子弄得大家哭笑不得,原来把妈妈“降级”到“倒屎盆”的工作了。 这小东西,以为人家都多待见他似的,连“把把”都要挑:“我不待见你,你连给我把把的权利都没有”。 可气的是,他还会给人编排活:“倒屎盆”是他编排给不太中意的人的活。例如被妈妈训了四次,妈妈就被编排到了“倒屎盆”的活计。 最可气的是,平时这小东西臭臭完就端着屎盆非让爸爸倒不可!爸爸之前还乐得屁颠屁颠的,一来觉得这小孩会说点话了,“爸爸倒”咬得还是挺清楚的;二来觉得光着屁股的小孩端起个大屎盆挺可爱的;三来觉得,嗯,这孩子还能惦记着叫上爸爸——用妈妈话讲——“参与”一下。 这次可彻底明白小河马的小九九了。哼哼,爸爸愤恨之下,不顾什么河马日记幼儿园系列,一定要记下这笔变天账。 February 20 河马日记 2008年2月20日连续几周了,忙忙叨叨地写论文、稀里糊涂地调程序;另外还有不少私活。坐在屏幕前的时间越来越多,但打开Live Writer的次数却越来越少。 事实上,把河马日记和其他blog文章放在最最不重要的todo列表里面,本身是一件很痛苦的事情。好比心里揣着一只兔子,嗵嗵的跳,让人不安;于是乎想法设法先安顿好那只兔子。其实,心里面还爬着一只蚂蚁,不停的爬着,痒,痒得难受,日夜的痒,却一直没有腾出一只手把蚂蚁捏出去。 昨天看了一篇讲作家的写作习惯的小文章。里面有两条着实值得借鉴: 首先是固定时间写东西。从调查结果看,大部分作家是早上时间写,7点至9点之间。可惜我8点时间段已经被小河马预订好了,喝过咖啡收拾精神后就已经9点了。那就9点开始吧。 其次是找到一个安静的地方写作。远离电话、网络以及游戏,安静专心的写上两到三个小时。我很欣赏(也很向往)这种人造的高效环境。可惜,说写blog文章,没有网络基本不行了;写论文,也类似,网上的资源省却了在图书馆集中积累素材的时间,但写作过程则再也离不开网络。 不管怎样,从昨晚开始,那只蚂蚁就爬得我不能忍受了,今早起来,把9点到11点的时间一股脑划给“河马日记”,咖啡加上周传雄的“快乐练习曲”,专心地来把这蚂蚁捏走。 上次日记里面,其实是以前很多期日记里面,多次提到了要写小河马上幼儿园的事情了。今天来还上这个愿,同时也是将河马日记的内容推向新的系列,不再病啊病的纠缠不清。 说话要回溯到去年9月份了。 云震姥姥11月份就要回北京了,妈妈在留下小河马的问题上非常坚决,吃了秤砣的那种坚决。明摆的问题是怎么照顾一个一岁半的小孩? 把爸爸活生生栓死在家明显不是个办法。 云震这岁数,几乎只有两个选择:送幼儿园或者送到一种私人的照顾小孩的服务childminder。(当时邻居家要过来一位老人探亲,房东还好心的提议可以请这位老人帮忙带小孩。这显然是个不靠谱的建议,而且后来事实证明这个建议简直不靠谱。) 当时是妈妈做的调查,上网查一下附近的幼儿园信息;咨询同事;亲自到幼儿园看看情况。其实不怪爸爸经常说妈妈是个典型‘先入为主’的人,在这选幼儿园的问题上也是一样: 第一次看的是一个叫Acorn House的幼儿园,在市中心附近一处安静的小街里面。独占了相邻的两套半独立房子,两层楼,两套房子内部相通。楼上是尚不能自由行动的婴儿的房间,我们最先参观了这里,因为以云震当时的岁数和行动能力,理路上是要被划到‘不能自由行动’的行列。楼下是18个月以上到4岁的小朋友的房间。 和国内幼儿园建制类似,小孩按照岁数被分为几个组,每个组有两名老师。每个老师只能带3-4个小孩。乘法算一下,每个组也就是6-8个小朋友的样子。整个幼儿园老师数量有限,可以接收的小朋友的数量也就有限。 当时还参观了幼儿园的餐厅、活动室、卫生间以及户外活动院子。妈妈和爸爸感觉很好,幼儿园室内空间宽敞,干净。 后来爸爸陪着还看了另外一个幼儿园,就坐落在妈妈单位楼下。其功能设置和条件类似,不过稍显活动面积小了点。妈妈还比较了些其他的地方,最后还是咬牙决定了第一个看的幼儿园。 之所以说咬牙,实在是经济受限。爸爸和妈妈都比较满意的第一个看的幼儿园是所有资讯过的地方中最贵的一个。最后退一步自己安慰自己是:虽说是最贵,其实其他的也差不了多少。Acorn House开价40磅一天,其他的也要35磅左右。这个是行情价格了。与其说咬牙决定送云震去Acorn House,不如说咬牙决定送云震去幼儿园。大牙都咬完了,四、五磅的小牙不计较也罢。 另外不能计较的是,幼儿园收费虽然按照天报价,但可不是pay as you go的。好比Direct Debit一样,按照当月的工作天数提前交好。如果说小孩哪天没去,这费用是不退的。幼儿园同意你随时提前一个月通知不再送小孩过来,但绝对不保证随时再送过来有位置可以安排。于是乎,爸爸和妈妈就经常算类似的帐:出去旅行一周,小河马幼儿园交的钱就够住宿的费用了;回北京家一个月,小河马幼儿园交的钱够全家的飞机票了。。。 有朋友说,送小河马去幼儿园一年和读一年博士的价钱几乎一样了。爸爸说,送小河马去幼儿园相当于每个月往家里买上一台42寸液晶电视;相当于每个月爸爸和妈妈出国旅行玩上一周。。。这帐算不完的,既然牙已经咬好了,就不回头找小河马算细账了。 没有孩子欢天喜地离开爸爸妈妈和最亲的姥姥去幼儿园的。 在10月份正式开始之前,幼儿园安排了几次预热。 开始是一个小时。爸爸和妈妈都陪着,与老师和其他小朋友都互相认识一下。前面日记里面提到过云震曾是很认生的小孩。这最开始的一个小时,即使有爸爸妈妈陪着,也是小河马最困难的一个小时。 第二次就是4个小时了。这次没有家长陪着,并且要尝试在幼儿园吃午饭。听着小河马的惨叫掩门而去,心里惴惴着,4个小时真想随时偷偷看看进展如何。妈妈上班去了,爸爸先开始是坐在走廊里等,然后被请到职工休息室,最后人家干脆建议爸爸回家得了。爸爸留下电话,嘱咐着有事情我会立刻过来。嘴上还说你们幼儿园老师肯定有经验也知道怎么办,其实不如说是反复强调着自己安慰自己。 到接上小河马回家的时候了。推门看到挤在幼儿园老师怀里的小河马。开始目光散乱着,看到妈妈和爸爸进来,委屈从嘴角浮到眼睛,再也忍不住嚎啕大哭。凑近看,小河马脸都哭花了,看来是一个中午没消停。妈妈心疼的赶紧抱过来,爸爸也很于心不忍地。老师却很鼓励的说小河马表现很好,让老师抱着就不伤心了。这确实是进步吧。 都是这个过程吧。眼不见为净,看着孩子哭着不停,谁都受不了。姥姥生怕把孩子哭坏了。有一个朋友,把2岁半的小孩送幼儿园,孩子愣是哭了一个月。不仅如此,小孩每天晚上发噩梦似的,把我们朋友吓坏了,只好放弃。 2007年10月,小河马开始全天的幼儿园生活。早上8点半送去,晚上6点以前接回家。由于云震在10月份以前行走能力有突飞猛进的进展,最终被划分到Birch组。这是一个18个月到2岁之间的组,云震当时是组里岁数最小的一个小孩。 孩子一天天长大。爸爸心里的那只蚂蚁不是别的,是小河马每天成长着发生的故事。这样的蚂蚁怎么捏得尽? February 06 网易有道“我很忙”January 29 河马日记2008年1月29日January 17 C#2.0 iterator设计模式和yield关键字C# 3.0都出来了,我还在嚼2.0的剩馍馍。不过,闻道有先后,知耻胜于勇,知之为知之,不知为不知,是知也,金砖何厚,玉瓦何薄,天不言自高,地不言自厚,人不言自能,水不言自流。。。扯远了。。。 这篇为学习笔记。 最近看了Eric Lippert给新书"C# 3.0 Design Patterns"写的序,颇为C#语言在设计模式上的发展感慨。紧后来又看了Juval Lowy的文章"C# Create Elegant Code With Anonymous Methods, Iterators, And Partial Classes"以及Christian Gross书中的一篇文章"What Does the yield Keyword Really Generate?",对iterator模式以及C#是如何帮助程序员实现这个模式,有了更深入的理解。 笔记以问答形式展开。 问:什么时候用到iterator? 答: 如下代码,简单说,使用foreach关键字进行遍历(笔记中强调遍历,因为被访问的序列既可以是数组、序列、堆又可以是树、图等复杂数据结构)的时候,就用到了iterator。 string[] cities = new string[]{"London", "Beijing", "Cardiff"}; foreach (string city in cities) { Console.Writeline(city); } 问:什么类型可以实现iterator? 答: 从C#对foreach关键字干了什么,可以看出什么类型可以实现iterator;C#编译器将上面foreach的一段代码展开成如下等价代码: IEnumerable enumerable = cities; IEnumerator enumerator = enumerable.GetEnumerator(); using(enumerator) { while(enumerator.MoveNext()) { Trace.WriteLine(enumerator.Current); } } 即要求cities变量是一个继承于接口IEnumerable的类型(本例中,cities是一个string数组),并且实现了该接口的GetEnumerator()函数。 多说一句,看清foreach如何工作的,还可以理解为什么在foreach循环中不允许对被遍历的序列进行添加或删除元素的操作。 问:什么是IEnumerable和IEnumerator接口? 答: IEnumerable的定义如下: public interface IEnumerable { IEnumerator GetEnumerator(); } IEnumerator的定义如下: public interface IEnumerator { object Current{get;} bool MoveNext(); void Reset(); } IEnumerable和IEnumerator还有泛型的定义(即IEnumerable<T>和IEnumerator<T>),暂不展开。 问:如何实现IEnumerable和IEnumerator? 答: C#2.0以前,可以通过嵌套类(nested class)实现iterator模式。嵌套类“知道”要被遍历的类的设计,通过维护一个代表状态的变量,实现iterator。 举例:如下代码实现一个继承于IEmerable的类,CityCollection。CityCollection有个string数组型的m_cities成员变量,存了一组城市的名称。可以通过foreach(string city in new CityCollection()){...}来遍历这些城市名称。 1. 实现IEnumerable接口,即GetEnumerator()函数:返回一个MyEnumerator类型的实例。MyEnumerator就是嵌套类,从其定义看,MyEnumerator继承于IEnumerator。 2. 设计嵌套类MyEnumerator:从定义看,MyEnumerator有一个CityCollection型的成员变量m_Collection,该成员通过构造函数初始化为CityCollection的this引用。另外,MyEnumerator有一个整型的成员变量m_Current,这个变量是用来维护遍历状态的。 3. 实现IEnumerator接口,即为嵌套类MyEnumerator实现Current{get;}属性以及MoveNext()和Reset()函数:
结合上面C#编译器为foreach展开的代码,可以了解嵌套类的MoveNext()函数和Current{get;}属性是如何被调用以实现遍历的。 public class CityCollection : IEnumerable { string[] m_Cities = {"New York","Paris","London"}; IEnumerator IEnumerable.GetEnumerator() { return new MyEnumerator(this); }//Nested class definition class MyEnumerator : IEnumerator { CityCollection m_Collection; int m_Current; public MyEnumerator(CityCollection collection) { m_Collection = collection; m_Current = -1; } void IEnumerator.Reset() { m_Current = -1; } bool IEnumerator.MoveNext() { m_Current++; return(m_Current < m_Collection.m_Cities.Length); } string IEnumerator.Current { get { if(m_Current == -1) throw new InvalidOperationException(); return m_Collection.m_Cities[m_Current]; } }public void Dispose() {} } } 问:C#2.0 以后如何实现IEnumerable和IEnumerator? 答: C#2.0引入了yield关键字,大大简化了iterator模式的实现。仍以如上CityCollection类为例,看如下代码如何使用yield实现了IEnumerable接口: public class CityCollection : IEnumerable { string[] m_Cities = {"New York","Paris","London"}; IEnumerator IEnumerable.GetEnumerator() { for(int i = 0; i < m_Cities.Length; i ++) { yield return m_Cities[i]; } } } 这次,CityCollection没有设计嵌套函数,仅仅在GetEnumerator()函数中通过yield return的形式顺序返回了m_Cityes所有的数组成员。 问:yield干了什么? 答: 仔细看上例CityCollection实现的GetEnumerator()函数,貌似yield将m_Cities里面所有的数组成员一一收集在一起,封成一个IEnumerator型的变量返回。 yield关键字一定在这里干了些事情,否则无法解释代码返回的是一堆string型的变量,怎么GetEnumerator()就能返回一个IEnumerator呢?我觉得,上面那个对于yield的功能的理解,能方便实现代码:想方设法在GetEnumerator()里面通过yield返回所有你需要遍历的成员,剩下事情让C#编译器去处理吧(这个理念在实现递归遍历算法的时候很关键)。 问:yield到底干了什么? 答: yield并没有将需要遍历的成员(自己设计实现IEnumerable就是为了可以使用foreach遍历你想遍历的东西)从CityCollection类中收集出来封装成一个IEnumerator。 yield是C#编译器帮助程序员实现iterator设计模式的一个代码生成标志符。实际上,C#编译器看到yield,就生成一堆嵌套类代码,其形式和上面通过嵌套类实现CityCollection的例子类似,其功能也类似:1, 可以访问CityCollection类的成员变量(即需要遍历的成员);2. 维护一个状态变量以实现遍历。 问:yield真生成了一个嵌套类吗? 答: 真的。我们通过MSIL Disassembler来看一下CityCollection编译后的IL。如图: 项目的名字叫StudyYield,看看在CityCollection类下面,有一个叫<System.Collections.IEnumerable.GetEnumerator>d__0的类。这个就是编译器为yield关键字生成的嵌套类。我们看这个嵌套类继承了IEnumerator接口。这个嵌套类实现了MoveNext(),get_Current()(即Current{get;}属性),Reset()三个IEnumerator接口的函数。我们还可以看到该类是sealed,使用了CompilerGenerated属性。 问:能在程序中调用这个为 | |||