试用BlackBerry 7230

  今天受朋友之托,入手了一台二手的BlackBerry 7230,试用了一下,感觉还不错。

  240×160的分辨率不算大,但横屏显示,感觉却比S60的176×208更为舒适。背光比较柔和,偏向PDA的屏幕感觉,相比Symbian手机的屏幕亮度,更适合长时间的阅读电子书。完整的Qwerty键盘确确实实比数字键输入要迅捷多了,只可惜其中文输入法似乎比较弱,不支持词组输入和联想。

  功能方面,虽然可扩展性远不如Symbian系统,但其内置软件的易用性设计却非常值得称道!号称“以人为本”的NOKIA在BlackBerry面前实在难当起名…… 就拿短信来说,类似Gmail的关联显示非常实用,比起NOKIA那万年不变的“Inbox”要方便多了;短信回执(Deliver Report)直接在条目前以图标显示,这个连Siemens都早已采用的设计为啥到了NOKIA那里就要单独弄个“Deliver Report”的文件夹来存放,还很难和原短信对上号。

  个人事务管理方面,功能比较强大,操作上和Outlook非常类似,而且支持与主流的同类桌面软件相互同步。至于其PC端软件,虽然还是不符合我个人的易用性评价标准,但感觉至少比NOKIA那个蹩脚的PC Suite(从不使用它)要容易上手一些。

  而BlackBerry所专长的企业级应用和Push Mail等特性,我怕是没机会体验了,以上就算是对7230的一个初步印象吧。

Preview: FontRouter2 for Symbian 9

  总体来说,移植过程还算基本顺利,除了前面提到的THeapWalk。由于Scalable UI的引入,Open Font System接口也引入了不少新的变化,最主要的新特征是字体获取接口衍生为三个:旧接口依旧保留,但不会被Symbian 9调用(怀旧兼容?),两个新增的接口分别用于根据“设计高度(Design Height)”和“最大高度(Max. Height)”获取字体。这两个新概念显然也是为Scalable UI服务的。

  今天晚上,基本在UIQ3模拟器下成功调试通过了,从Opera浏览器中的中文表现来看,FontRouter2的核心功能已经正常实现了。

FontRouter2 on UIQ3

  不过在S60第三版上却遇到了一些麻烦:首先是与Nokia的iTypeRast存在一定的兼容性问题,出现了“缺字”现象(在第二版的AgfaFontRaster上也有类似兼容性问题),其次还是iTypeRast,竟然在部分字体的竞争中压过了FontRouter2。实在汗啊,看来iTypeRast也开始不择手段了…… 或许确实有必要做一些比较极端的屏蔽手段来对付iTypeRast了。今天也不早了,好在这两个问题都能在模拟器中重现,所以就明天再来详细分析吧。

THeapWalk的Symbian 9实现

  在移植FontRouter2到Symbian 9的过程中,碰到了一个大难题:THeapWalk这个类彻底的从Symbian 9中消失了!与新版本中其它很多API变化不同的是,THeapWalk类的功能虽然被新的RHeap::Walk()所取代,但该方法已不再从EUser.dll中导出,也就意味着它的身份从此变成了“内部API”,不再对第三方应用开发者开放。

  THeapWalk是用于测试内存问题的一大利器,其地位难以被取代,如果就此抛弃,实在太可惜了。好在天无绝人之路,经过一天时间的彻底分析,终于让我发现了Symbian为其留下的一个后门。利用以下适配代码,可以在Symbian 9实现对THeapWalk功能的完整模拟,希望对同样遇到移植问题的朋友有所帮助:

class THeapWalk
	{
protected:
	enum TCellType
	{
		EGoodAllocatedCell, EGoodFreeCell,
		EBadAllocatedCellSize, EBadAllocatedCellAddress,
		EBadFreeCellAddress, EBadFreeCellSize
	};
public:
	THeapWalk(RHeap &aHeap) : iHeap(&aHeap), iValue(0) {}
	TInt Walk()
		{ iHeap->DebugFunction(RHeap::EWalk, &DoInfo, this); return iValue; }
	virtual void Info(TCellType aType,TAny* aBase,TInt aLength)=0;
protected:
	inline TInt Value() const { return(iValue); }
	inline void SetValue(TInt aValue) { iValue = aValue; }
private:
	static void DoInfo(TAny* aPtr, TCellType aType, TAny* aBase, TInt aLength)
		{ ((THeapWalk *) aPtr)->Info(aType, aBase, aLength); }
	RHeap* iHeap;
	TInt iValue;
	};

注:EBadFreeCellSize是Symbian 9新增的一种Cell状态。

Homemade 火锅

  初五的深圳,笼罩在一层蒙蒙细雨中,原本已经可以悄然闻到的夏天气息又被气温的陡降所驱散。10点钟从床上爬起来后,窗外的天色都会让人误以为闹钟跑快了…… 在这样一个阴晦的日子里,确实需要来一点可以让人疲靡的精神为之一振的行动~

  自从开始计划通过自己做饭提升生活品质后,烹饪条件也在从无到有的过程中慢慢的完善。时至今日,虽已有了一罐煤气、一个微波炉、一口平底盆锅、一把水果刀,以及一堆调味品,但重要的铁锅、菜刀却都还在Todo List上…… 那么,做一顿火锅无疑就是在目前这种条件下最可行也最实惠的选择了~

  冰箱里白萝卜、冬瓜、芹菜等素菜还有不少,再配上半条草鱼、几块土豆,先后下锅一烫,一大锅丰盛的火锅就这样成型了。先来个特写,再开始慢慢享用~ 😉

丰盛的火锅

2007·预

  凡事预则立,不预则废。

  2007中国年是我的本命年,在上一个本命年里,我用FoxPro完成了我的第一个软件项目。转瞬之间,又是12年过去了,年龄的齿轮在提醒着我,人生已经进入了最需要拼搏奋斗的阶段,如果想要有所作为,就应当珍惜点滴的光阴!

  公历月为纲,立此预,以作自省:

1. FontRouter for Symbian 这个项目从2004年10月至今,已进入了第三个年头。今年需要加速开发,完成以下Milestone:
  (1) 支持 Symbian 9 —— 3月
  (2) 发布国际版本,实现语系无关 —— 4月
  (3) 发布正式版本 —— 5/6月
  另外,配套的网站和论坛应进一步完善和规范化,文档基本完备。

2. Web 2.0 网站项目 Mephisto (codename)
  内容暂时保密,争取在6月之前立项,开始原型开发和概念验证。这是第一次尝试Web应用的开发,希望首战便能有所突破。

3. Symbian开源项目 GOPS (Global Open Position System)
  待定,视前两项的进展情况。

  另外,在工作和生活方面,需要作一些积极的调节。可能会考虑改善一下环境,生活质量也需要提高,至少要开始习惯自己做饭(算是培养生活情趣的第一步吧 ^_^)。

又是一年二月十四

  晚上下班,正在公司小卖部专心的挑选春节的零食储备时,一位店员突然在我身后笑着说“也是来买巧克力?”,我茫然的回头,报以一个困惑的笑。环顾四周,好像大家也都不约而同的手里拿着一盒巧克力,嗯?恍然间,才想起今天原来就是大家口中的“情人节”。再看看自己,手中拽着一大袋果冻,又正驻足于巧克力的货架前,也难怪人家会有此联想了。

去年的二月十四, 写了些许对“情人节”的感言,今年又写点什么好呢?不想再提情人节,不想再让歌词中那“情人节快乐,在没有情人的夜”成为今天的主题了。那就写点关于痞子蔡(蔡智恒)的爱情小说吧,Samuel很久前就建议我写一写了。

继续阅读又是一年二月十四

FontRouter2 for Symbian 9 is incoming!

  这几天花了很长时间研究Symbian 9的Open Font System接口变化,总算小有收获。话说这Symbian 9打算以ECOM框架一统全部插件接口,OFS当然也被收编其下。但SDK文档中几乎所有关于OFS接口的说明却仍然停留在旧的接口下,这让我非常困惑。经过几天来对UIQ3和S60 v3的彻底分析和反汇编,终于找到了移植OFS插件至Symbian 9的正确途径,目前已基本在上述两个平台下实现了FontRouter2的正确加载,后面将开始进行功能的调试。

  今天的分析还得出了另一个重要的结论:Nokia S60 v3并非如很多人想象的那样不借助OFS即可支持TrueType字体,事实上,与早期的FreeType和中期的AgfaFontRaster一样,S60 v3也同样存在这样一个用以支持TrueType的OFS插件,只不过改名易姓成了“iTypeRast”,在ROM中的sysbin下可以找到它。

  由于Symbian 9非常特殊的安全机制,我尚无法确定FontRouter2在模拟器中的表现与实机存在多大差别,为了顺利推出FontRouter2 for Symbian 9,现在希望提前征集数名测试志愿者,希望得到大家的支持和协助,谢谢!:)

引用的“按值传递”(Reference by Value)

  学习Symbian编程的过程,也是一个升华对C++精髓理解的过程。Symbian的开发模型中用到了数不胜数的C++高级特性,执着于“力求甚解”的话,将会对C++有一个更深层次的认识。

  我们知道C++从C演变而来,虽然仍旧保留了指针这个可怕的“祸端”,但“引用(Reference)”的出现让人们在最大程度上避免了与指针的直接接触,从而可以更加安全的使用对象。指针的可怕之处在于其“不确定”的指向,而“引用”的本质就是对指针的封装,从而将不确定性拒之于门外。

  作为一个C++程序员,你可能会抱怨:“我没办法像Java那样忽略指针的存在,有时候除了指针我别无选择……” 那么就让我们来看看指针是否真的无法替代?举两个最常见的困惑:

  1. 我的对象并非一开始就存在,它将在某个必要的时刻才被创建,所以空指针可以为我填补这之前的空白。
  2. 在某些无法传递引用的场合,比如函数变参,迫不得已用指针代替引用。

继续阅读引用的“按值传递”(Reference by Value)

第一次从Dreamhost获得Reward

  很久没有登录Dreamhost了,前两天无意中发现Reward下面不再是那个亘古不变的“0”,而变成了可爱的$5~ 虽然微不足道,不过淡淡的喜悦之情弥散在心中,让我对Dreamhost的好感又多了一点。

  因为一直以来提供的Promo Code:“SAVE97NOW”是可以享受到全额$97的折扣,也就意味着全部让利给了新注册的朋友,唯一可以得到的收益仅限于“下线的下线”,而且才有5%(只算这一层,不包括更下一层)。这就是为什么这么长时间以来Reward才积累到$5的缘故。当然,主要还是因为我没有拿着Promo Code四处宣传,也没有刻意的去向朋友推荐,所以自然也并没对Reward寄予厚望。

  最后,感谢那些仍在继续推荐Dreamhost的朋友,为了与大家分享Reward,凡是使用了我提供Promo Code:“SAVE97NOW”在Dreamhost注册的朋友,请留下你创建的Promo Code,我将一并进行推广!:)

步入HDTV时代

  HDTV的时代快要来临,你做好准备了么?

  昨天入手了一块新硬盘,总算不必再被容量所困扰。现在,除了显示器,其它部件已基本具备HDTV的要求了~ (就等24″ LCD降价……)

  主机乃是两年前配置的:

CPU: AMD Athlon64 2800+ (OC 3200+)
主板: ASUS K8N
RAM: DDR 1G (1T)
显卡: ASUS 9550 256bit/128M (250/400 MHz)
LCD: 17′
硬盘: 希捷7200.10 320G/16M

  用KMPlayer + CyberLink MPEG2 Decoder(PD7) + CoreAVC 1.2的组合分别测试播放MPEG2和H.264的HDTV(均为1080p)。

MPEG2: 使用CyberLink
  开启ATI的硬件MPEG2解码后,效果非常明显,可以达到全速下40%左右的CPU占用率。而一旦关闭硬件解码,CPU占用率立即飙升至100%……

H.264 @ 12Mbps: 使用CoreAVC
  关闭deblocking、硬件dx-deinterlacing,可以达到全速下80%的CPU占用率。此时画质尚可,但在场景高速变换时会出现明显的方块。
  b-frame deblocking、硬件dx-deinterlacing,可以达到全速下90%的CPU占用率。画质几乎没有损失,即使在高速场景中也察觉不到方块。
  standard deblocking、硬件dx-deinterlacing,此时FPS大约22、CPU占用率100%,但个人感觉不到有丢帧。
  关闭硬件deinterlacing几乎对FPS和CPU占用率没有影响,所以有显卡相助,何乐而不为呢?:) 另外,大家评价很高的CyberLink H.264 Decoder在我这里的表现却不尽如人意,没有deblocking、时不时卡一下不说,还与 ASUS Splendid 冲突……

  看来,这台两年前配置的电脑基本上还能应付常规的HDTV播放需求,但面对高bps的H.264影片估计就扛不住了。