2008年三月月 发布的文章

'史前一万年'观感

感觉好长时间(离上一次看"集结号"大概有三个月时间了)没有到影院看电影了,一来是觉得没有什么好电影值得看,二来这些时间事情较多,有时候还真的想不起来去看电影。直到近期看了任正非给华为员工的一封信,信中有这么一段:"员工不能成为守财奴,不能成为金钱的奴隶,丰厚的薪酬是为了通过优裕、高雅的生活" 。任总的期望是好的,但是我几乎可以肯定的是大多数程序员下班后依然会坐在计算机前,不是加班、学习就是打游戏、看片。说实话,程序员的业余生活真的很单调,起码我了解的我周围的同事基本都是这样。白天已经很累了,晚上也就没有心思到外头消遣了,只想回到家这个避风港安静一下,有点自己的时间。不过周末还是可以细致安排一下自己的生活的,起码到影院看场电影^_^。近期关注了一下上映的片子也有不少,如"国家宝藏2"、"尼斯湖水怪"、"史前一万年",我最终选择了"史前一万年"。

之所以选择"史前一万年"有两个原因:一是冲着其导演罗兰德·艾默里克,冲着他导演过"后天"、"爱国者"和"独立日"等多部大片;二是冲着其片名"史前一万年",给人以无限遐想,对于一个深处现代文明的人,史前一万年是多么具有魅力啊^_^。

这周,同事赠给我两张免费电影票,也就促成了我这次"史前一万年"之旅。片子不算很长,总体算来有100分钟就不错了,算上片头广告才110分钟左右。100多分钟下来,我的感觉是"有惊喜有失望"。下面一点点说:

这部电影是我为数不多的在观看前没有具体了解过的电影,坐在电影院的时候,我自己对梗概剧情也是一无所知。仅是从名字上猜想导演会给我们展现出10000年前的生活景象,加上有过"后天"的观感,对于这部影片的视觉效果也是很是期待。在我的想象中,导演会将10000年前的生活很具体、很生动、很全面的展现在我们面前,在这以前我有过"金刚"、"侏罗纪公园"等影片的观影经验,也就自然会有如此期待了。另外我原以为剧情是关于某个主人公在10, 000 BC的历险记呢,看上5分钟后我才发现不是这样的。影片的主线还是"亘古不变"的英雄和爱情,只是从时间维度上,导演将之放到了远离我们的10, 000 年前。挖掘人类未知的"新世界"似乎成为了近几年世界范围电影导演的一个新方向,而且收效还都不错,比如说"哈利波特"系列、指环王系列、纳尼亚传奇系列等。随着影片的深入,远古动物逐个展现在我们眼前,遗憾的是,这部片子中远古动物种类展示的太少了,食肉大鸟、剑齿虎、猛犸象仅此三种而已,而且片中缺少对10,000年前总体动物环境的渲染,也许是影片成本所致,毕竟电脑特技制作成本还是很高的,特别是好的制作公司的作品。

此部片子的剧情还是逐步引人入胜的,从一开始的"四脚杀人怪兽"、到”主人公父亲出走“、再到壁画中"大鸟"的出现直至一座辉煌的金字塔展现在观众面前,也许当且仅当金字塔的出现时,我们才会松一口气,心里道一声"原来如此"。的确,建造金字塔的场面还是很是让人震撼的。而对金字塔的拥有者的猜测也会立即占据你的头脑。不过这次导演放弃了挑战众人想象力的机会,那个统治者没有超出"人"的范畴,剧情中提到了那个人或许来自某个沉入海底的文明或者来自其他什么地方,影片中没有太多的交代,这个任务留给了我们。

一个有意思的细节是:在金字塔展现,女主角手上的星形伤疤被发现时,影院里很多人都不由自主的说出了"埃及艳后"这四个字,仿佛大家都会觉得这个女人将成为埃及法老的女人,但导演似乎并不认为这个金字塔就是埃及人创建的那个金字塔,也没有按照我们的另类思路前行,而是走了传统路线-美好的结局。这一扬一抑将影片推向高潮。

这是一部中性影片,老少皆宜,虽内涵稍有不足,但毕竟只是导演或者编剧给我们做的一种关于"新世界"的假想和猜测。另外我很喜欢片中亚高族的那把"白矛",很Cool^_^。

装修博弈·主材选购

现在,一般家庭装修多数采用半包的方式,也就是装修公司出人、出辅料(水泥、沙子、油漆、木料等),自己买主材,如地板、磁砖等。虽说半包的模式已经将最麻烦、最牵扯精力、最技术相关的装修工作交给了装修公司去打理,但主材选购也扔是足够令人头疼的。

装修绝对是一项系统工程,而且是一件很"庞大"的系统工程,如果你能将每个细节都搞得清楚的话,那我真的要对你说声"佩服"了。我自己是没时间、没耐心也没那个热情去学习,要知道关于材料选购的知识,网上那是"多如牛毛",即使搞懂"地板"这一种主材也足够让你头疼的,你要了解地板的种类、工艺、品牌、价位以及很多影响地板品质的细节知识,而且了解某种主材还不能全凭网络上的一家之言,还要亲身到装饰建材市场去调查,去研究,一趟走来又费工夫、又费体力,有时候还达不到预期效果,甚至有时还因与某些卖家沟通不畅而惹得一肚子气。

掐指算来,选购主材的"活儿"已经占用我三个周末的休息时间了,周末两天每天都早起晚归-搜街。装修之初大家都有这样的期望:买到物美价廉的商品。正是由于这样的"念头",我们才从一个商场逛到另一个商场,总希望碰到"天上掉馅饼"的机会,但往往的结果都是"看得多了、心烦了、意乱了,选择也就开始随便了"。所以事先做好选购定位是很关键的,这也是亲身体验后的一些总结。

选择"门当户对"的主材
装修前大家或多或少都会掂量一下自己的"钱袋",了解一下自己的购买力,这时千万不要做乐观打算,最好能实事求是,将选购的主材对象锁定在与自己"财力"相符的层次上。装修材料和其他商品都是类似的,也有高中低档之分,选定一个粗线条的范围后,在进一步细化,直至选到合适的商品。

价格趋同,在大型家居广场或超市选购更有保障
逛了这就长时间的建材市场,发现同一品牌、同一型号的材料无论在专卖店还是在大型商场、超市价格和活动都是相同的。或者说现在在某一个城市,都是一个代理商在做同一个品牌,各个门店的价格逐渐趋同,在这样的情况下去大型Mall去购买材料反倒更具保障,一般的大型商场如居然之家红星美凯龙百安居东方家园等,都是有自己的保障体系的,同样的商品你会得到商家和商场的双重保障,而且有些时候,商场凭借其影响力还能拿到更低的折扣价,在售后服务方面做得也比一般的专卖店要好,在这样的地方购物,图的就是放心。比如今天我在东方家园买的瓷砖,在其他店面是有偿送货上楼的,而东方家园则是无偿,单价还比其他地方要低上一些;上周在居然之家买的地板的价格也和其他门店一样,而且还可以刷卡积分,这样的消费还是很痛快的。

不要回避"活动"
中国的国情是这样的:不活动不买东西。有些时候"活动"的确能给消费者带来一些"实惠",当然这需要你事先了解到你要选购商品在市场上的行情,这样你才能对比出来商场的活动到底掺了多少水分。有些时候,商场的确是凭着其强大的实力来做活动的,价格就是比其他地方低,东西还是同样的东西,在商场活动期间购买,何乐而不为呢。就拿今天买的瓷砖来说,我都在不下三个地方看了多次了,都是一样的价,东方家园给无偿送货上楼、还有相当额度的赠券,我当然在这里买了。用这些可观的券我还拿下了方太一款偏高档的烟机和最新推出的五腔驱动燃气灶。当然了,如果你是专家,你懂得内幕,那就另当别论了。其实当专家也是很难的,什么都知道,什么对他都透明,他自己如果装修的话,那采购起东西来也是相当闹心的。

太晚了,不写了,希望那些即将要开始选购主材的朋友们都能选购到真正"物美价廉"的商品。

多行宏定义中的注释问题

早上在写代码时遇到这样一个问题:即如何在一个拥有多行的宏定义中做注释?,这里把方法演化的过程贴出来,可能对某些朋友有些借鉴意义。

宏定义高深莫测,而且是比较细节的东西,详细说明请参见"C参考手册"之类的书籍。

在我的代码中,我大致要做这样一个简单的事情:printf("%s%s%s\n", "hello", "macro", "yeah!"); "%s%s%s\n"这个字符串中每一项输出都有一定的含义,而且在真实代码里,这个串中的输出项可不止3个,所以一个直接的想法就是将其定义为一个宏。

#define STR_OUTPUT_FORMAT_V0  "%s%s%s\n"
printf(STR_OUTPUT_FORMAT_V0, "hello ", "macro, ", "yeah!");
程序输出:hello macro, yeah!

由于真实代码中这个串很长,所以打算美化一下格式,定义成下面的样子:
#define STR_OUTPUT_FORMAT_V1  "%s\
                               %s\
                               %s\n"
printf(STR_OUTPUT_FORMAT_V1, "hello ", "macro, ", "yeah!");
程序输出:hello                                macro,                                yeah!

这样的定义显然不对,也在我意料之中,续行符将空格也续到格式串中了,导致输出的结果中带有大量空格。

改进一下,利用C语言的字符串自动连接语法。
#define STR_OUTPUT_FORMAT_V2  "%s"\
                              "%s"\
                              "%s\n"
printf(STR_OUTPUT_FORMAT_V2, "hello ", "macro, ", "yeah!");
程序输出:hello macro, yeah!

现在的问题是如何在这样一个多行的宏定义里加入注释,字段含义特殊,加上注释有利于以后维护以及别人阅读你的代码,否则一堆%s%s,让人看了就头痛。先这么加试试:
#define STR_OUTPUT_FORMAT_E1  "%s"\   /* comment1 */
                              "%s"\   /* comment2 */
                              "%s\n"  /* comment3 */
printf(STR_OUTPUT_FORMAT_E1, "hello ", "macro, ", "yeah!");
我们得到的结果:编译错误。
通过gcc -E 选项我们看到,宏替换后的代码:
                              "%s"\
                              "%s\n"
int main() {
        printf("%s"\, "hello ", "macro, ", "yeah!");
}

由于没有续行符在注释前面,所以宏定义的后两行实际上并没有被包含在宏定义中,就像没有暂住证的人一样,被GCC这个"警察"逮个正着。

继续改进:
#define STR_OUTPUT_FORMAT_V3  "%s"   /* comment1 */ \
                              "%s"   /* comment2 */ \
                              "%s\n"  /* comment3 */
printf(STR_OUTPUT_FORMAT_V3, "hello ", "macro, ", "yeah!");
程序输出:hello macro, yeah!
显然预编译器忽略宏定义中的注释以及空格,STR_OUTPUT_FORMAT_V3就完全符合我的要求了。

当然,很多人不建议使用宏,特别是C++的Fans,宏也的确有很多弊端,这里也有替代方法:
const char *str_output_format = "%s"    /* comment1 */
                                 "%s"    /* comment2 */
                                 "%s\n"; /* comment3 */
printf(str_output_format, "hello ", "macro, ", "yeah!");
程序输出:hello macro, yeah!

用一个字符串变量代替格式宏,还可以避免上述由于在宏中做注释带来的一系列问题。

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!




这里是Tony Bai的个人Blog,欢迎访问、订阅和留言!订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:


如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:


以太币:


如果您喜欢通过微信App浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:



本站Powered by Digital Ocean VPS。

选择Digital Ocean VPS主机,即可获得10美元现金充值,可免费使用两个月哟!

著名主机提供商Linode 10$优惠码:linode10,在这里注册即可免费获得。

阿里云推荐码:1WFZ0V立享9折!

View Tony Bai's profile on LinkedIn


文章

评论

  • 正在加载...

分类

标签

归档











更多