豆豆又长出两颗牙

昨晚我抱着豆豆散步,豆豆突然就很委屈的大哭起来。豆豆从来不会无缘无故的哭闹,我们哄了他半天也不见好。我确定当时没有碰到或弄疼他,所以很担心他是不是生病了。豆豆哼唧了半个小时,心情才开始转好,可一家人整晚都在担心他。

早上,爷爷抱着豆豆出去散步,回来兴冲冲的说找到原因了。爷爷给豆豆擦口水的时候,一眼看到豆豆上牙床露出了两个白色的小尖尖,原来昨晚是冒头的小牙弄疼了豆豆。

一般小宝长牙都是一对一对的长,可是豆豆第一波只长出了左下方一颗门牙。一个月时间过去了,那颗小牙已经高高耸立于牙床之上,但它旁边的伙伴还是一点动静都没有。最后还是两颗上门牙占了先。豆豆现在有三颗牙啦!

普陀山游记

周末公司组织去普陀山旅游。周五晚上从吴淞码头出发,第二天一早驶达普陀山。我们很不幸,因为周六正赶上台风袭击,整天都在下雨,而我们只能穿着雨衣打着伞游玩了。

DSC01759

不过台风也带来了意外的好处:由于短途的渡船都已停航,来参观的游客比较稀少,不会因为太过拥挤而影响旅游的心情。

DSC01784

普陀山这里自然风光很有限,所谓旅游就是看庙。我对烧香拜佛不感兴趣,所以我很少进入室内,每到一处就在庙外面练练摄影。

DSC01816

有些庙宇藏在深山里,安闲宁静。

DSC01814

有些寺庙临海而建,惊涛拍岸,颇有气势。

DSC01832

岛上最显眼的还是这尊铜制观音像,还没去参观她的时候,远远的就看到了。

DSC01843

台风只持续了一天就过去了,天气突然就从狂风暴雨转为风和日丽。

第二天的行程还是以看庙为主,首先去的是岛上规格最高的那座寺庙(庙太多,名字都没记住)。果然富丽堂皇,远远看去,和宫殿也可媲美。

image

除去寺庙,我们玩的唯一一处景点是千步沙,景色不错,唯一缺憾是海不够蓝。

DSC01906

我借用大家看庙的时间,脱离队伍去周围走了走,岛上颇有点幽静的田园气息,要是能生活在这里就爽了。

image

行程的最后一站是岛上最高的那座寺庙。寺庙都是大同小异的,然而登山途中的风光还是值得一看的。

DSC01943

DSC01950

关于相对论没搞明白的问题

最近研究了一下相对论,准备作为公司每周技术讲座的题目。狭义相对论还是比较容简单的,我基本可以理解。但广义相对论中还有些问题没想清楚,毕竟不是专业研究物理的。

按照广义相对论的解释:万有引力是不存在的,它只是时空扭曲的一种表象。如果时空扭曲可以产生加速度,我就可以按照下面的思路推断出有“绝对静止”的存在,而直觉上,我觉得又不应当有绝对静止。

“质量会引起时空的扭曲,一个在高维空间直线运动的物体,在扭曲了的四维时空中的投影是弯曲的,在只能观测到四维时空的我们看来,它似乎是受到了引力的作用而改变了运动方向。”这是广义相对论对于万有引力的的大致解释。对这一解释,我可以有个模糊的理解,但细节上却并不清楚。

首先,它没有很好的解释原本相对静止的两个物体如何可以在扭曲的时空中相对运动起来。比如:树上的苹果和地球本来是相对静止的,若不受力,苹果是如何掉落到地面上的呢?我自己能够想到的解释有两种:一是仍然有力的存在,也许万有引力是不存在的,但质量却可以引起另一种类似的力,导致物体的相对加速度,但相对论是认为这里不存在任何力的;另一种解释是,地球和苹果都在更高维的空间中,相对于这个“空间”在运动(也就是说有绝对的运动或静止),而它们在运动过程中在四维时空中的投影趋向于汇聚在一起,除非有外力不停改变它们的运动。按照这第二种解释方式:四维时空里相对静止的物体在高维空间中是相对运动的;而四维空间里相对运动的物体在高维中却又是相静止的。直觉告诉我这样的解释很别扭。

其次,相对论认为物质会扭曲周围的时空,但没有解释为什么会扭曲。既然质量可以扭曲时空,为啥不能认为是通过是加了力来扭曲的呢,还非要断言引力不存在。

最后,按照相对论的说法,质量引起时空的扭曲,那么运动的质量会导致时空扭曲的波动。这种波动以光速传播,也就是所谓的“引力波”。引力波是带有能量的,因此物质在运动时,即便不受任何外力,也会因为发射了引力波而损失能量。若物质可以将一部分能量传递给周围的时空,那么这个时空岂不是也就具备了能量(质量)。这样一来,时空和物质又有什么区别呢。宇宙根本就不存在所谓的“时空”,它只有物质的不同运动形式。

时空若是无限的,所有运动的物体都会因为引力波辐射而损耗能量,其动能越来越小,最终损失殆尽而达到“绝对的静止”状态。若宇宙有限,引力波可能会达到一个平衡的状态,类似黑体辐射。

Silverlight程序中显示帧数的方法

接到一个需求:要在Silverlight程序的界面上放置一些控制选项,可以开关Silverlight的EnableFrameRateCounter,EnableRedrawRegions等和显示效率相关的一些设置项。我开始在网上查了一下,这几个与显示性能相关的设置主要被用在装载Silverlight控件的HTML文本中。在Silverlight程序启动之后,这几个属性仍然可以被修改,除EnableGPUAcceleration之外。问题在于,如果EnableGPUAcceleration没有在HTML文件中被设置为True的话,EnableCacheVisualization和EnableFrameRateCounter也无法工作。看来微软给出这几个属性就是为了帮助开发显卡加速的动画的。

EnableFrameRateCounter被设置为真时,Silverlight界面左上角会显示出几个和GPU相关的数据,其中包括动画刷新帧数。但是我搜索了一下,Silverlight似乎没有提供函数,可以在程序中把这个帧数读出来。MSDN中提供了一个间接方法来计算帧数,利用CompositionTarget.Rendering这个事件。Silverlight没刷新一帧,都会抛出一个CompositionTarget.Rendering事件,对这个事件计数,就可以算出每秒帧数了。不过,用这个方法计算出来的帧数,与EnableFrameRateCounter设置显示的帧数居然是不同的。

CompositionTarget.Rendering事件的发生次数与用户设置的MaxFrameRate和系统繁忙程度相关。而EnableFrameRateCounter显示出来的那个帧数还与Silverlight动画是否需要刷新相关。比如对于一个界面不怎么活跃的Silverlight程序,当Silverlight觉得不需要刷新界面时,它就不刷新,显示出来的帧数很可能是个位数,甚至为0。

Scrum

我居然没能在网上找到这个词的中文翻译(也许可以称为迭代开发?),就直接用英文吧。Scrum是敏捷开发的一种方法,简单来说,就是把传统软件开发流程的周期时间缩短,周期数量增加。就拿LabVIEW做例子吧,目前LabVIEW每年发布一个新版本,如果换用Scrum流程,就应当每个月发布一个版本,一年12个版本,但每个版本的更新只有原来一个版本的1/12。

Scrum现在非常时髦啊,也许是Google的成功起到了示范效应,原来越多的软件企业开始采纳这套开发流程。Google的开发模式被称为永远的Beta版:一个产品刚有几个基本功能就发布给用户去用了,然后再根据用户的反馈,每隔一小段时间就更新一下。

我最初在网上了解到Google这套开发理念的时候,就被它的优势吸引住了:软件的很多新功能都是程序员或者经理拍脑袋想出来的,它们或许并不符合用户的需求。越早拿给用户看,也就可以越早改进,少走弯路。真的遇到一个垃圾想法,也好早死早超生。我当时就预感,这套开发方式必定会被广泛采纳的。

Scrum流程肯定不适用于所有领域。比如说盖楼,原本盖一栋楼要一年:1月挖坑、2月打地基……11月封顶、12月装修外墙。用Scrum就不能按这个顺序了,因为最终用户不关心挖坑、地基和内部结构。所以施工队必须一个月内就挖个小坑、埋几根地基,竖起一面墙,粉刷好,然后给用户看。用户说墙太薄,窗户不够大等,于是施工队下个月按照用户的意见再建下一堵墙。我很怀疑按这种方法,施工效率会有多高。

实际上,使用了Scrum流程的公司也并非都取得了成功,比如说引入Scrum流程之后的诺基亚…… Google的成功与诺基亚的失败也许可以说明开发流程不是影响企业的成败主要原因;或者也可能是因为Scrum不是狗皮膏药,它只在某些领域才能发挥出功效。

还是说我熟悉的LabVIEW吧,LabVIEW的主要应用领域依然是是工业测控。这个领域的用户与互联网用户的一个明显差别就是,工业领域的客户要谨慎的多。受大多数用户喜欢的技术的特点是稳定而非先进。LabVIEW每年升级一次,居然很多用户抱怨说升级太快了。与之对比,某个拼音输入法的用户们天天在论坛上叫:“都几个星期了,怎么还不更新?”让LabVIEW的用户每个月更新一次,他们还不疯了才怪。我估计LabVIEW在这一点上是学不了Google的。

对于不能频繁更新的软件来说,一定要走Scrum的流程,又不能每个月从外部客户那里收集反馈,那就只好去经理那里要反馈了。每个月做一个版本,然后给经理看看,再去做下一个版本。我个人看法:敏捷开发的精髓在于:最终用户的快速反馈使得软件可以紧跟用户需求的变化。内部人员无论是谁,他们的需求都必然与用户不同,都代替不了最终客户。至于Scrum流程上的东西,如每日例会、用户故事、燃尽图之类的都只是形式而已,没了最终用户的参与,新开发流程只能算换汤不换药吧。

豆豆的爬行姿势

周末突然发现豆豆可以肚皮离地,仅靠手和膝盖把身体支撑起来。不过豆豆的爷爷奶奶说,他两星期前就可以支起来了,只不过我白天都不在家,没有看到而已。

尽管豆豆力气是够了,但神经系统还没发育好呢,所以还不能进行真正的爬行。他现在每次先把手放在胸前,撑起身体来,接下来向后使劲,把屁股撅得老高,然后再伸直腿,身体就嗞溜一下滑到后面去了。

DSC01575

Modkit 一种图形化编程语言

目前,像LabVIEW这样功能强大,比较通用的图形化编程语言可能绝无仅有的。但市面上,比较小型的,针对特定应用的图形化编程语言却五花八门,随处可见。今天同事又给我介绍了一款,叫做Modkit,官方网站:http://www.modk.it (河蟹们访问需翻墙)。

这款编程语言是基于Web的,也就是打开了网页就可以直接开始编程,不需安装额外软件。这一点与NI去年发布的 LabVIEW Web UI Builder 相类似。区别在于LabVIEW Web UI Builder 是基于Silverlight的,而 Modkit 据我观察,没有使用任何插件,很可能基于HTML5标准编写的。

如果可以选择,我个人会倾向于使用HTML标准开发程序,而不是使用Silverlight。目前来说,开发Silverlight程序的确比开发HTML5程序要容易。但是,Silverlight只是微软一个无足轻重的产品,随时可以被抛弃;而HTML标准却是w3c组织最核心的产品,又有一干顶尖厂商的支持。从长远来看,HTML可能更会被广泛采用。

回头再说 Modkit 这个产品,同为图形化编程语言,它的风格与LabVIEW迥然不同。我觉得它的设计最有两点的地方就是把编程序搞得像玩拼图游戏一样:

它的每个程序模块是一个拼图(或者叫积木)模块,搭在一起形成一个完整程序。它的模块之间不需连接数据线,贴在一起就行。

图形化编程语言可能都免不了模仿一些已有的概念。比如Modkit模仿拼贴画、LabVIEW模仿电路图、VEE模仿流程图。想不起来,对于一个任何背景知识的人来说,拼贴画最易入门。

Modkit 使用颜色来区分不同种类的模块,比如:蓝色表示对硬件进行配置;紫色表示数据输入输出通道;绿色表示运算模块;橘黄色用于流程控制。

用拼图的形状来保证数据类型安全。有的拼图块是方的(数值数据),有的拼图块带个卡口(执行模块),有的拼图块两侧带尖的(表示逻辑数据)。插槽也是有形状的,这样,只有形状匹配的积木才能放进相应的插槽。这和拼图的理念完全一致。

看,这就是我编的一小段简单程序:
image

Modkit是专用来对Arduino这款硬件进行编程的。这种针对特定硬件设计的编程语言,最大优势就是效率高。我在和LabVIEW用户聊天时,听到的一类比较多的抱怨就是LabVIEW太大了,包含了各种他们不需要的功能,拖累的他们的程序爬都爬不动。

单从用户的角度来考虑,把LabVIEW的功能分离开来,搞出一系列针对特定硬件的精简版本来,会更利于使用。我得理想情况是:为每个硬件设备都安装一个基于Web的LabVIEW编程服务,这样用户只要使用浏览器打开一个硬件设备,就可以直接为它编写程序了。不过从商业利益考虑,这件事只能是硬件厂商自己去做了。