生孩子这件事

当了爸爸,自然有很多细腻的感情上的变化,感触颇多,晚些再分享了。在这里和我的那些还没有当爸爸的老友们分享一下“后勤”上面的事情。一次经历下来,经验不算多,至少还是澄清了我以前的一些错误想法。

1. 生孩子很辛苦,但不用太担心。

这个当然是替劳苦功高的老婆说的(我倒是没干什么)。十月怀胎,瓜熟蒂落,是非常完美的事情,绝没有很多人口口相传的那样,越描述越恐怖。这或许仅仅是我们的个人体验 — 顺产相对简单些。我很自豪可以从24小时全程陪护在Wendy身边。这是难得的美好的体验。在此以前以为生孩子就是持续n个小时的疼痛,实际上是一阵一阵的几分钟一个周期的,而多数电影里面仅仅是描述这最小部分“典型”的场景。

2. 孩子出生后立刻像天使一样。

我以前总想不通胎儿从不呼吸(完全靠脐带供养)出生以后到转到用肺呼吸,一定是个痛苦无比的过程。结果小家伙从妈妈肚子里出来,哇哇的哭了几声,随后就安静的躺在自己的小床上,看起来幸福得让我都乐出声来。睡一会,手脚挥舞一会儿,有时嘴里还发出吮吸的声音(就是我们吸手指的声音)。小胳膊小腿儿,都完美无瑕,不像长啊长的,过了20-30岁就开始出现各种各样不好看的斑点或者皱纹。而且小宝宝出生的时候,竟是干干净净,身上没有什么血迹。

3. 生孩子的时间问题。

原来生孩子,并不是仅仅有一个样板场景:就是电视或者小说里常说的,一边是不断惨叫的待产妇,一边是手忙脚乱的家人,还有横冲直撞的救护车。当然这样的状况还是很多的,但是我们看到的(还有我们),都是在产房里的说说悄悄话,安静的等待孩子的到来。Wendy在打过些麻药以后,还在小宝宝出生前熟睡了了个小时。

4. 孩子的生活环境

小宝宝生活在羊水里面。羊水就像自来水一样清澈(如果最后没有胎粪进入的话)。小宝宝就在这干净清洁的环境里面生活。孩子和母体之间除了这清清的羊水之间没有任何其他的连接。胎儿的脐带是连在胎盘上面的,而胎盘和宝宝一样是漂浮在羊水里面的。妈妈的营养,还有氧气,都是通过羊水到达胎盘(像内脏一样的器官),然后再通过脐带传输到宝宝的体内的。就是这样一个过程。别笑我,以前我还真的没有这么仔细的思考这个问题。呵呵。

5. 带孩子的苦和乐

带孩子苦不苦?这苦是说出来的苦,乐是心里的乐。同样的事情,说出来的确听起来挺苦的,但实际上完全不是那么回事。就像打网络游戏从旁观者看起来,好似比坐办公室苦的多似的。:-) 小宝宝的成长,就是一个有魔力的事情,让人不忍离开。

6. 二人世界还是三人世界

在二人世界结束的时候,不免充满留恋。我们在产房里面,宝宝出生前还做过简短的告别二人世界的仪式呢。不过三人世界显然是一个更幸福的世界。自己爱的人,从一个变成了两个,不是更幸福吗?在小宝宝出生的第一个小时,我们两个就欢欣鼓舞的伸出双手拥抱我们幸福的三人世界了。以前担心的有了宝宝不能出远门,变成了现在的热切的期望:“宝宝,等你长到两岁,我们一起去xxx好不好?”

呵呵。就这么点仅仅是”后勤“上面的事情,和大家分享一下。一个大男人,真的还远不能理解这个过程,相对于有经验的妈妈来说有些班门弄斧。这就算是作为过来人,为后来的新爸爸们交个“作业”吧。

注:小宝宝现在8斤两,开始经常微笑,有的时候都能笑出声来。

起名字 – 第二部分

呵呵。谢谢大家的关心,一个名字有这么多人参与。我大概的统计了一下,这是上一篇还有英文的blog的对这几个名字的统计。

王乐凡 ++++++++++++++++ 16
王逸凡 ++++++++++++++   14
王子欣 +++++++++++      11
王天哲 +++++++           7
王纳言 0

还有一些建议的名字。。。

王健君
王安若
王子凡
王诚博
王范天哲
王逸鑫
王亦鑫
王茁壮
王怀思
王建铭
王思远
王硕豪
王帷哲
王逸帷

让我们再想一想。其实,每个想出来的名字后面都是有些故事的,不过晚一些再分享给大家。

后注:这几天小家伙变化很大,洗澡的时候不哭了,还开始更加活泼起来,面部表情也非常丰富,真有趣。

起名字

小宝宝叫个什么名字?什么事情,越是觉得重要,越是做的慢,难以有一个最终选择。这两天想名字,有了以下几个候选,还在斟酌。大家给出出主意?

王乐凡
王子欣
王纳言
王天哲
王逸凡

更新 2007年8月5日

上周给宝宝报了户口,名字就叫王逸凡。从众多的名字里面选出来,感谢大家的关心。

现在来解释一下这个名字和原来想的的几个名字。

其一:王乐凡

这是宝宝出生以前和他妈妈一起起的名字。孩子的名字多数反映了父母的期望。我们老实说不想给他太大的压力。我门对他的人生没有我们自己的规划,而希望由他自己的兴趣和好奇心引领,去自己发现。我们唯一的希望,就是希望他能够智慧和快乐。(其实快乐需要极高的智慧才可以获得。)只要他能快快乐乐,我们就非常开心。

至于凡字,其实就是平凡。我希望他懂得,快乐在平凡之中,获得也在平凡之中。至于名或着利,还有所谓的成功,其实都是过眼烟云,而只有每天用心的过的日子,才是人生最真实的部分。我们希望他懂得平衡的道理。小说里的,回忆录里的精彩的人生,在经历的时候,同样的东西就是是酸甜苦辣,甚至有时是百无聊赖。我希望他理解,平凡是人生的本质,而其他的喧嚣仅仅是装饰而已。

最后,因为乐是一个多音字,无论如何,只好不做考虑。

其一:王天哲

在我看来,这个世界上最美好的无外乎两者:其一曰自然,其二曰人文。自然是万物,所有我们看到的部分,给人美好的感觉的树,山,还有水。人文是人的内心世界,从几千年前的岩石壁画到现在的文学,艺术,科学等等。这个世界的美妙之处,逃不出自然(物的世界)和人文(精神的世界)两者。

自然界最大,最广博的,无外乎为“天”;(它比海更大,更深邃)
人文中至精华,智慧者,称之为“哲”。(它比文学更智慧,更恒久)

所以天哲希望小宝宝能够集自然和人文的最精华部分。

后来,我们还是放弃了。看着小宝宝熟睡的脸,以及睡梦中挥舞的小胳膊小腿儿,觉得不想给这个小蚕豆一样的精灵这么大的压力,起超过它能承受的名字。于是,后来还是回到了乐和凡的道路上。(还有的原因就是我们不喜欢这个名字的发音)

其一:王逸凡

逸也有快乐的意思在里面。同时,希望小宝宝对于很多的事情,不要那么在乎,只要自己快乐,并且知道自己要的东西,就好了。最后,我们觉得我们喜欢这个名字的读音,还有那种达观的生活态度。大家都说我和文峰都是那种挺上进的名字,为什么宝宝的名字不够上进。还有人说“男取《论语》,女取《诗经》”,应该有点论语里的那种感觉。我恰恰不喜欢孔子的思想,而更喜欢老子。来自的是大的道理。所谓“大道虐行”,而人自己的君君臣臣,父父子子的,仅仅是小道。在起名字的时候,我手里面一直拿的是老子-庄子的书。我总觉得老子和庄子是有大智慧的人。

注:还偶然间看到嘉庆年间,乾隆年间,还有1993年的王氏族谱的影印件。按照族谱规定,最近的王氏几代名字中的第二个字应该是:思 – 重 – 源 – 本。也就是我的名字按族谱应该叫王重硕(王氏第二十世),而宝宝应该叫王源凡(王氏第二十一世),而他的孩子在明朝的时候都已经规定了叫王本x(王氏第二是十二世)。。。而代数是从明太祖朱元璋时期的洪武二十三年(1380年)从山西洪洞大槐树迁徙至洛阳的那一代作为族谱的第一代。不由感叹历史的“源远流长”。不过后来放弃了按照族谱起名字的想法。

宝宝照片

看看我们家宝宝的照片。

你看,他笑了。

有的时候他就这么小心翼翼的看看周围的世界,不知道他在想些什么。

他最喜欢呆在自己的小世界里面,就是他的那张小床(对他来说,已经是一个大世界了)。

看这张!

看他困了。他真喜欢睡觉!只要他吃饱了,就会很快的沉入梦乡。每天早上和晚上有一小段时间和我们玩,然后又乖乖的睡觉了。这个表情就是说,再过两分钟他就要睡着了。

就像这个样子。睡得好香呀。

有些时候他会自己玩。挥舞着小胳膊小腿儿,好像这个世界的其他的烦心事儿都和他无关(不过看起来也的确是这样的)。

如果有些他不喜欢的事情发生,他也会哭。现在这样的事情倒是不多。洗完澡擦干的时候,他就不喜欢。你看他哭的。不过只要你给他穿上衣服,他就立刻开心的像个天使一样,给你个灿烂的笑容。

我的小宝宝,你真是完美的不得了。我们三个手拉手,走进我们幸福的三人世界。

这里还有更多照片,希望Flickr解封以后大家可以看到。

shanghai-baby-galary.png

宝宝已经回到家中

昨天(六月3号)母子已经出院,现在在家里开始新生活了。

在这里代表Wendy和小宝宝感谢大家的关心和祝福。

小家伙的前几天就像一个黑洞一样把我们的注意力吸引过去,几乎没有一点点的遗漏。大量的祝福,还没有来得及回复;还有大量需要通知的朋友,都还没有发通知,望大家原谅。不知不觉,我已经把这个降临在自己家中的小生命看的比什么都重要了,只想一家三口多呆在一起一些时间。

趁着母子两个都睡着了,过来发一个感谢。看小家伙的时候时间过的飞快,不舍的离开。名字还没有最终确定,还正在推敲呢,有什么建议吗?我只想给他一个简简单单的名字,让他做一个轻轻松松,快快乐乐的人就足够了。

目标经常不是目标

开车上下班,常看到要速度不要安全的。为了三秒钟闯红灯的,为了多走几米就在后面狂闪灯的,更有一路狂飙,在高架上蛇行的。

如果你说他们是赶时间,我看未必。这只是个习惯。其实真实的原因,绝非别人以为甚至是自己以为的那个目标。很多人就是为了这种竞争或者动脑子的乐趣。

说是为了赶时间的,说不定回家就是坐在沙发上百无聊赖,或者明知道到了也是早到,但这丝毫不影响一路超车,见逢插车,丝毫不会对行人有任何的顾及,或者手下留情而不去动自己的喇叭。这些真的是和时间有关吗?

打电子游戏,天天睡不着觉的想着的不外乎是自己的那些积分。自己以为这是自己打电子游戏原因。如果真的给他的无敌帐户,谁也打不死他,积分自己想写多少就是多少,任何任务只要按一个键就可完成,他在游戏里梦寐以求的一切都可以弹指之间得到满足?你猜会怎样?他会立刻放弃这个游戏。‘

哦。我知道了,原来他要的是挑战,而不是他以为的积分。

说到钱,也是一样。很多人都成功的让自己觉得,自己工作就是为了赚钱,其实远不是那么回事。当收入已经可以支付基本的生活支出以后,绝大多数人工作已经不仅仅为了钱。如果不相信这个论断,看看退休的人,已经是亿万富翁的人,还有休过漫长的产假归心似箭的冲回公司的人就知道不仅仅是为了钱那么简单。就算节约成癖的人,看似是钻到钱眼儿里面,其实,你不觉得天天想尽办法省钱,不是一种有趣的智力上的挑战吗?

所以只有个人的成就感,也来的更真实。而此之外,虽然是包括自己在内的所有人都以为是自己的目标,却不见得是真实的目标。

追求外在的目标让人忙碌,就像我们终生都在忙于追求幸福,却没有发觉,幸福就在忙碌本身之中。

注:弗洛伊德马斯洛的需求理论很有道理。上面的推论,也仅仅是对于满足下面几层需求以上的人才生效。

为什么HTML里的Comment是<!–开头?

最近做了两周的产品组培训,让自己对于技术的兴趣又重新燃起。我觉得一个好的技术人员要至少做到两点:开放(或者说有好奇心)和深入(或者是打破沙锅问到底)。在准备下周的UI训练营之前,我简单的看了一些HTML代码,发现还有很多以前忽略的东西。比如我问的这个很白痴的问题:

为什么HTML的comment都是写成

<!– 这是段注释 –>

形式?

这个看起来最不像HTML的语法,正是源于HTML的父规范 – SGML。在SGML语言里面,<! >表示SGML中的声明,比如

<!ELEMENT IMG – O EMPTY — Embedded image –>

而在SGML里面,评论是用简单的两个横线表示的。第一对横线表示评论的开始,而第二对表示评论的结束。在HTML里面,就直接继承过来,用<!– –>来代替。

就像还有另外一个SGML语法写出来的东西,我几乎从来没有真正关心过,或者说还很少手写的,就是XHTML 1.0或者HTML 4.01前面的DOCTYPE,比如:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>,这真正代表着什么呢?难道就是一行字符串吗?其实,可以说浏览器就把它当作一段字符串,但字符串的生成,还是有历史原因的。

比如说

  • <! 表示SGML的声明的开始
  • DOCTYPE是SGML的语法的以部分,就像另外一个常用的,ENTITIES,在DTD结构的语法里面常常用到。
  • html说明了这个SGML文档的根tag。
  • PUBLIC和SYSTEM相对。SYSTEM 会制定这个文档相对应的DTD的未知,应该是:SYSTEM "/dtd/xhtml.dtd"这样的形式,而PUBLIC表示下面将不用URL而仅仅是一个字符串规定DTD的位置,而这个字符串是如此的特殊,我们有一个名字来规定,叫做Formal Public Indentifiers (FPI)。
  • “-//W3C//DTD HTML 4.0//EN”这就是FPI。云里雾里的字符串也是有意义的:ownername//class description//language。其中,ownername 是 -//W3C。其中减号表示W3C是一个还没有在ISO(或者其下的ANSI注册的机构),+号代表的是注册的(这里感觉到了1960年代那种互联网之前的迂腐的味道。以后所有的这些复杂的注册统统都用基于现在的域名注册系统中了,比如xmlns命名空间的注册借用URI就显得聪明的多)。就连W3C都没有注册,可见注册机制已经名存实亡。DTD表示了类型,而HTML 4.0是这个DTD的描述性的名字。最后的EN同样借用了ISO 639的语言代码。
  • “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”这个按道理是不需要的,因为如果有了FPI,所有的现代浏览器应该都自带从这个著名的FPI到本地缓存的一份DTD文件的对应表,但是如果没有(这是严谨的考虑),才把URL作为PUBLIC的第二个参数,传进去。。。(顺便提一句,FireFox不会去读任何外部或者内部的DTD,用来验证HTML的合法性,换句话说,FireFox不支持DTD验证).
  • >跳出SGML世界,回到HTML文档中去。

这样分析,也就大概的知道这里是怎么回事了,至少对于记忆这个字符串有好处。

Web的历史一直是借用和采纳的历史,HTML借用SGML的规定,SGML有借用ISO的定义,就像SMTP借用了URI的定义作为自己的规范中的一部分一样。。。

而且,这种过去的规范对于新技术的影响,就有点像两匹马的屁股决定了古代车辆的宽度,之后决定了地上的车辙,进而影响到了铁路的宽度,限制到了铁路运输的货物到校,随之限制了运载火箭的直径,知道决定了卫星的直径。。。这听起来虽然有点牵强,但说的就是这种例子。

技术加上一点点考古,真有趣。

Symbol表的启发

本文是《google.loader 代码欣赏》系列的一部分。

这段代码原本是非常好读懂的,但是当所有的函数名和变量名都用小写的a到z之间的一个字母代替以后,就变得不好读起来,尤其是这段令人抓狂的代码,

function k(c,a,b,d,e,f){
this.a=c;
this.g=a;
this.f=b;
this.d=d;
this.e=e;
this.b=f
}

不死一堆脑细胞是很难摸得到门路的。

其实,这说明,这个代码一定是经过编译的。说编译可能有点不是很准确,说“转化”或者更恰当些。为什么要这么做呢?

Symbol表

在整个代码的最后一句

g(“google_exportSymbol”,g);

泄露了些原因。

Symbol是什么?在Windows的世界(或者几乎所有的编译语言,或曰高级语言的世界里),都少不了Symbol这个东西。在编译的时候,所有的函数名,变量的名字,都会被一个地址或者一个标记代替,写进二进制文件里面,所以如果从一个.exe文件反编译出来,还是可以看得出执行的语句逻辑的(用汇编的形式),却永远无法获取原来的源代码。而Symbol文件,就是连接编译好的二进制程序,和源代码的桥梁,包含了关于函数,变量的名字以及源代码的文件名以及行数的信息。而Symbol文件编译以后,一般不和执行文件一起发布,需要另外去找。比方说当年调试IIS的时候,就把IIS的Symbol拿过来,再把源代码拿过来,用Windbg就可以开工了。。。这是以前的古老的Windows时代一个程序员要做的事情(对了,现在所有的Windows公开的Symbol可以在这里获得)。Symbol简直就是Windows世界里的解开二进制文件的一把神秘的钥匙。

Google Loader的Symbol库

既然有编译,就一定要有一张自己存着的对应表格。我猜测这个表格应该是这样样子的:

function “google_exportSymbol” => function “g”, @d:\my\code\uds\uds.js line #122
function “setApiKeyLookupMap” => function “p”, @d:\my\code\uds\uds.js line #102
function “load” => “o”, @d:\my\code\uds\uds.js line #77
function “writeLoadTag” => “m”, @d:\my\code\uds\uds.js line #115
var “google_exportSymbol”::”funcNameString” => “c”, @d:\my\code\uds\uds.js line#122
var “google_exportSymbol”::”function” => “a”, @d:\my\code\uds\uds.js line #122

需要说明的是,我没有原来的代码,也彻底不知道这个Symbol表是不是存在,甚至在这里开玩笑一样的假设原来的代码放在一台Windows的机器上面(显然这不是很可能),但我希望就是表达这么一个意思,就是说,如果有编译,就应该附属产生这样的一个Symbol表,只不过没有公布而已。如果没有这个表,debug会是一件和我们直接看源代码一样痛苦的过程。

DLL的exportSymbols

如果大家熟悉Windows的DLL文件结构的话,就会发现exportSymbols和importSymbols是一个常见的概念。就是说,虽说在DLL内部所有的函数的名字已经被编译的面目全非,就像这里的函数g(),函数q()一样,但是为了方便外界的调用,还是把一个标准的接口给输出(export)出去。打个比方,一个Windows XP上的c:\windows\system32\user32.dll就export了732个之多的函数(函数名是字符串,比如ActivateKeyboardLayout,实际的函数确实一个地址为:7E42D32Ah的EntryPoint。

微软的世界和Google的世界

一个微软的世界的基石应该是PE(Portal Exexcutable)的文件格式(也就是.EXE, .DLL所使用的格式),这些格式让DOS操作系统可以”load”到内存里面执行。

那么在Google的世界里面先出现了一个loader(就好比DOS的loader),然后作为load的基础函数出现了这么一个google_exportSymbols,这是巧合呢,还是意味着什么呢?

且听下回分解。

注:第二次(其实是不知道多少次)声明,以上纯属个人的主观臆断,就好像听到了“咕咚”的声音就惊呼“咕咚来了”的猴子一样。或许是真的“咕咚”来了,或许仅仅是一个熟了的果子掉到湖里而已。是哪一种?只有时间告诉我们。

用匿名函数避免命名冲突

本文是google.loader 代码欣赏系列的第二部分。

第一个匪夷所思的地方,可能就是这一段了

if (!google.loader) {
google.loader = {};
google.loader.ServiceBase = “http://www.google.com/uds”;
google.loader.ApiKey = “internal”;
google.loader.KeyVerified = true;
google.loader.LoadFailure = false;
google.loader.AdditionalParams = “”;
(function() {
//大量的函数定义,变量声明以及函数的执行(整整100多行)
})()
}

基本上就是说,它写了一个这样的语法:

(function(){})()

就算是看得懂,这么绕来绕去,除了炫耀之外,又有意义呢?

匿名函数

先撇开Google的代码,看一下JavaScript其实是支持这种形式的行数定义的:

function(msg){ alert(msg); }(“hello world”);

这其实是两步:第一步,定义了一个函数,相当于:

var abc = function(msg) { alert(msg);}

第二步,立刻执行它:

abc(“hello world”);

把两个语句拼接在一起,然后去掉abc这个函数的名字,就成了现在的语法形式。

结合前面的

google.loader = {};

一起看,其实在这里是定义了google.loader这个对象的一个匿名的成员函数,并且立刻执行了这个成员函数(就是说完成里面的一些列初始化的时候需要干的事情)。

匿名函数的用处

虽然可以理解这里是个匿名函数,但是为什么要这么做呢?

我猜想(请注意,所有这里想的都是一个猜想,并且可能是众多原因之中的一种而已,欢迎大家补充),最主要的考虑是避免命名冲突。

因为这段JavaScript作为Google的其他的各项服务的入口,是会被全球很多的网页引用的。像任何的JavaScript引用(包括PHP的引用),如果被引用的代码和外面的代码一不小心用了同样的名字,就不可避免的发生命名冲突。对于小范围的代码或许还可以用起很怪异的名字的方法企图避免,而对于Google这样的应用,靠运气就有些说不过去。如果是一个匿名函数,外面将永远无法直接访问它(总不能写一个这样的一个没有函数名的调用吧:())。从这一点来说,不可能有命名冲突。

封装

另外的一个好处,有可能是为了更好的封装。比如在这个函数里面,有很多的函数定义,比如

q(); p(); m(); g(); i()

还有大量的变量:

var j; var h; var l;

等等。在JavaScript里面没有简单的private这样的定义私有函数或者私有函数的方法。如果调用者可以随心所欲的访问到这些中间的(随时可能变化,甚至移除)成员。对于这么一个开肠破肚,一览无余的对象,从一个API提供者的角度来看(和使用者的角度来看),的确是个挺恐怖的事情。

如果放在一个匿名的函数里面,外界就再也没有办法直接访问到里面的函数了。内部的逻辑被完美的封装了起来。这样一来,这些函数和变量多么的安全!

安全是安全了,但是定义了这么多的函数,仅仅是为了不被外界访问吗?显然不是,所以接下来要做的事情,就是把这些函数输出出去,也就是google_exportSymbol,或者说是函数g()要做的事情。

且听下回分解。

注:接下来,或许还要说说: 输出函数供开发者使用, JavaScript中的面向对象, prototype的扩展方式, Undocumented的神秘参数, 编译后的JavaSscript好比汇编语言,和 Symbol表的启发。

《旅行的艺术》是本好书