2010年12月31日星期五

Einen Guten Rutsch ins neue Jahr 2011

祝大家顺利进入2011年。
德语中Rutsch意思是滑,滑过。
很有意思,这句祝福语字面上意思为很顺利地滑溜到新年2011!

DSC01947

附图为今天我家附近的小朋友在斜坡上用雪橇进行"Rutsch"。

其实关于这个祝福语还是有更具体起源的解释,详见维基。
http://de.wikipedia.org/wiki/Guten_Rutsch
1.起源于意第绪语
2.“rutschen“ 作为 “reisen“(旅行)的喻义

赶在新年将至之前几分钟,简单进行一个小小的年度回顾。
关于工作生活:
一到七月在为Diplomarbeit努力中。
七月和老婆领了证。
在八月初顺利的成为了微电子专业的Dipl.-Ing.
接下来选择留校开始的做一名博士生,在研究所进行研究,让我感到压力和乐趣并存,其实我还挺喜欢这种感觉的。

 

其他:
根据豆瓣电影上的记录,大概看了60部2010年新上映的电影。
根据豆瓣读书上的记录,2010加入了199本书,除去一些以前看过的书,2010大概看了150本书,刚刚买了sony ereader 650,明年读书又多了一个利器。
写了51加上这篇就是52篇博客,大约平均每周一篇。
最喜欢的放松方法就是在电脑上玩一会儿pes2011。最近一个星期玩了几天wii,买了wii后已经两年没玩了。
坚持骑车上班,但是最近下雪,只能在家里做做有氧操。

 

2011期望:

大家平安健康。
希望自己可以利用积累时间的力量,每天花一点时间,做同样几件事情,提升一点自己的价值吧。 

2010年11月28日星期日

程序员间的一段对话(笑话)

今天来一个笑话,以下笑话是由网络很多的段子融合而成,感谢这些段子的原创。
老鸟程序员A和新进的菜鸟程序员B在茶水间聊天。
程序员A:昨晚去看了《盗梦空间》,其实,编剧是个程序员。嵌套,函数,调用,断点,溢出,全局变量,未处理的例外。
程序员B:你还真行,看《盗梦空间》还可以想到编程。
程序员A:生活中很多地方都可以学习编程,譬如说,如果每天定时看新闻联播,能学到好多设计模式。
程序员B:哇... ...还真是。
程序员A:我那天看到我们的经理在用google docs写小金库账本呢,你知道为什么呢?
程序员B:难道是因为google docs简单方便?
程序员A:No,No,真正的原因是有GFW守卫,不易被老婆发现,哈哈。
程序员B:哇... ...哈哈。
程序员B:对了,刚刚经理说我们一定要用正版的软件,国家刚刚颁布下了一条法律呢。
程序员A:没关系啦,其实中国的法律从来都是.txt格式,不是.exe。
程序员B:说的也是。
程序员A:给你打听一下,你知不知道昨天来我们部门的和你帮你填出差报销表的财务部的漂亮mm的叫什么名字,电话是什么。
程序员B:不知道,没敢问。
程序员A:你居然没有问,连名字都不知道,你大概认识的多数女性后缀名都是AVI,哈哈。
程序员B:沉默中... ..
程序员A:你一定已经默默地关注了苍井空的微博,哈哈。
程序员B:哇,是的... ...
程序员A:对了,最后告诉你一个搞笑的内幕,你知道Intel为什么买下McAfee。其实内幕是这样的:Intel的CEO坐在办公椅上边吃巧克力豆,边和下属视频会议,说道:「公司是不是需要杀毒软件?买McAfee吧。」15分钟后,有人在视频那头传话,「McAfee买下了。」CEO问道,「什么版本的?」下属:「啊?版本?…版本?」
程序员B:哈哈。

 

 

最后附带,简单地说说最近的一些情况吧。

stefan-morsch-stiftung
星期二,我和一些朋友参加了Stefan-Morsch基金会(这个基金会在德国已经建立了38万人的骨髓资料库)在我们学校的活动(我们所的一个中国博士生患了白血病,急需骨髓捐赠),抽取5毫升静脉血作组织相容性抗原(HLA)分型检查。http://www.stefan-morsch-stiftung.com/

DSC01888
星期四我们这个小城下了今年第一场雪,图为晚上7点半回家小路上的雪景。
DSC01907

星期六也就是昨天,和几个朋友逛了圣诞市场,吃了一点烧烤和炒栗子,图为烧烤的摊位。然后到一个同学家玩三国杀,比较有趣的是我们还教会了一个德国人玩三国杀,而且后来他作为“主公”还玩的相当不错,其实桌面游戏在欧洲很有群众基础,很多德国人从小就玩过很多这样的游戏。

2010年11月18日星期四

如何自动将Visual Studio编译生成的dll和lib文件放置到不同的路径中

又是很久没有更新博客了,最近相对比较忙,做了一个项目代码重构,已经完成了8成了。今天给自己放假一天,这就是在研究所上班的最大好处之一,很自由,可以给自己放假:-)
今天写一点关于Visual Studio使用的一个小技巧。
Visual Studio编译生成的dll和lib文件放置到不同的路径中,其实很有用,如果我们有很多的项目,而且项目间的dll相互依赖,那么将编译生成的dll和lib文件放在统一的路径或目录中还是很方便的。
以下是我的做法,我们需要先写一个bat。
以下是copy_output.bat的写法,类似这样:

@echo copying file(s)
@echo off
REM @echo on
@REM echo %1\%2
@REM dir /p %1\%2.dll
@REM copy the exe file, if exists
if exist %1\%2.exe for /F "eol= tokens=4,4,* delims= " %%X in ('dir /p %1\%2.exe') do if exist %1\%%X copy %1\%%X %YOUR_BIN_PATH%
@REM copy the dll file, if exist
if exist %1\%2.dll for /F "eol= tokens=4,4,* delims= " %%X in ('dir /p %1\%2.dll') do (if exist %1\%%X copy %1\%%X %YOUR_BIN_PATH%)
@REM copy the lib file, if exists
if exist %1\%2.lib for /F "eol= tokens=4,4,* delims= " %%X in ('dir /p %1\%2.lib') do (if exist %1\%%X copy %1\%%X %YOUR_LIB_PATH%)

我们还要在Visual Studio的project的属性进行一点设置,具体如下截图所示(我使用的是德文版的VS):
vs2005_dll_lib_build_event

点选进入Build Events,在Post-Build Event的Command Line中输入copy_output.bat $(TargetDir) $(TargetName),完成。


附注:如果路径上有空格譬如,C:\Program Files,那么要在$(TargetDir)上加入引号。
copy_output.bat "$(TargetDir)" $(TargetName)

2010年10月21日星期四

随感,随笔

又是很久没有更新博客了,今天又给自己放了一天假,这里我分关键词随便写点什么,附图为傍晚时的回家小路。

DSC00788

焦虑,压力

前几天,收到一封好友的来信,他说他有焦虑症,已经开始看心理医生了,他在我眼里是一个和快乐的人,而且拥有一份很不错而且令人尊重的工作。知道这个消息后,我唏嘘不已。其实现代人面对各种各样的压力,正如很多书所说的,我们生活态度决定了我们对压力的态度,其实有时候只要稍微改变一下对事物的看法,想法,就能与压力和平共处,也就不会把自己逼到死角了。我们总是在焦虑,焦虑过去,焦虑未来,焦虑一切可以引发焦虑的事物,而我们是否可以静下心想想,我们是否可以就只是活在当下?

 

开会,写代码

最近开始一个新的项目,开了非常多的会,德国人的会真的非常多,但是大部分都有明确的讨论主题,一般不会沦为形式会,会上也会有很多脑力激荡,类似豪斯医生的桥段,头儿扔出一到两个问题,我们每个人各自提供一些见解或答案,头儿对我们答案进行反驳,在会的人进行讨论,这样来回几次常常会得到一些还不错的分析结果,架构大体确定后,一些问题的基本解决方式明确之后,这才是开始写代码的时刻。最近还写了不少代码,但是都是简单的代码堆砌,代码易写,但是好的架构难设计。我们的新的架构,的确花费了很多的心力,好架构,就是简单优雅,往里面堆砌代码,也会有一种快乐感,很明确,如同玩乐高积木般简单。

 

名牌,名牌

阐述一下我最近听说的一个理论,很有趣,也很深刻,看电影的时候,我们会发现在很早以前的一些部落的战争,我们会看到战胜者会把战败者身上的某个部分取下来,把它们当做一种战胜的标志挂在自己的身上。然而在现代社会里,名牌的价值就跟上面提到的战败者身上的某个部分的意思差不多。名牌代表的是一种本质上是一种“胜者”或是“在弱肉强食的食物链中较为高等”的宣示。看来这种“权力的宣告”这也许就是现代人为名牌痴迷的深层次原因吧。

 

H&M,自行车,大前研一

如何节约不必要的时间浪费也是一门学问。我不喜欢逛街,对于买衣服,我几乎只去H&M,每个季度去一次,去H&M的原因就是因为够平价,款式够多,穿一阵子不喜欢了,扔掉一点也不心疼。一年我花在买衣服上的时间大概就是4*2 = 8 小时,买衣服我的想法和大前研一类似,我也会一种款式买一个系列(各种颜色之类),每天出门的时候几乎不会浪费什么挑选衣服的时间。自行车是一个非常好的交通工具,大前研一也说过,如果不下雨或下雪,我每天上下班都骑自行车,来回大概骑1个小时,一周大概可以有4到5小时的运动,如果没有时间运动,那么骑自行车上下班,就是一个很棒的运动。

2010年9月25日星期六

随便聊聊

大约有20天没有更新博客了。最近有很多事可以瞎忙,公事私事,忙了10天吧,到了上个星期五终于大概都搞定了。感悟,思绪偶尔在脑中停留,这里就做一些无聊的记录吧,以类似微博的形式一条一条的记录一下吧,其实我对微博很不感冒,至今一直没有。附图为上个月去的杜伊斯堡的乐高城的爱因斯坦的乐高头像,一个德国小妹妹正在摸爱因斯坦的舌头呢。

DSC00825

前不久做火车看到一个很有钱土耳其大叔和他的三个老婆,除了大老婆年纪比较大,其他的俩个老婆可谓是如花似玉,天啊,真是男人的梦想,据说最多可以娶四个老婆,突然间想到如果是这样的话,肯定有很多男人娶不到老婆,还是放弃这个美梦吧。

戴尔卡耐基,拿破仑希尔都说过记住别人的名字很重要,我说,经过证明,这真的是非常重要。他们还说过微笑对提高人际关系很有效,我说,这是真的。

亨利福特有一句名言:“Whether you believe you can or believe you can’t, either way you are right.” 其实无论是否相信你可以改变自己,或是不能,其实都是对的。看来信念的力量真的很重要。

模仿前不久读过的《佛祖在一号线》的一句话:“我觉得教养这东西来之不易而且很贵,20克教养顶得上5吨LV皮包。” 我觉得自我认识这东西来之不易而且很难,一点自我认识顶得上n年的社会历练。

看过一句话We must stand firm between two kinds of madness: the belief that we can do anything; and the belief that we can do nothing. 我们到底是什么样的呢,自认为无所不能,还是一无所能,很多SLHPPs(Self-limiting High Potential Persons低成就的高潜质族群)的内心都是如此困顿的。

歌德在浮士德中写道:Whatever you can do, or dream you can, begin it. Boldness has genius, power, and magic in it. Begin it now. 其实就是改造自己的第一步,就是试着开始吧。

很早就有人对我说过Document Software Elements as Early as Possible!但是我就是不这样做,总是直到项目结束后才开始写文档,这样真的会丢失很多细节,因为我们可能对我们的代码非常厌倦或是熟悉了。我的这点感悟真的是经验之谈,其实和一本书The Elements of C++ Style的第38条尽早编写文档不谋而合。

直接从源代码中生成API参考文档,也是The Elements of C++ Style中的一条,这也是我最近很有体会的。使用doxygen生成的API参考文档更为准确和更为完整而且易更新。文档真的是我们常常忽略的东西,如何写一个优秀的文档和编写代码一样重要,具体实现的原则,请参考The Elements of C++ Style第五章,我已经把这本书放在工作的案头,随时查阅,以提醒自己因该要怎么做。

是岁月油炸了我的坚持,还是时间炖化了我的异端,自己心中的梦想已经有点模糊了,是重新拾起来的时候了。

2010年9月2日星期四

扔掉所有拖住你的东西,让生活更加轻松愉快

这几天读了一本书《丢掉50样东西,找回100分人生》
如果你有很多杂物,废物,那么你也许需要看看这本书,学学如何丢东西。

你知道要丢掉哪些东西吗?这本书中提出的丢弃规则很简单:


    第一,任何事物,不管是看法或信念、回忆、工作、甚至某个人,只要让你心情沉重、阻碍你,或单单只是让你对自己有不好的感觉,那就把它丢掉、送走、卖    掉、抛开,继续前进。
    第二,如果它(请参阅第一点)只是摆在那里占空间,对你的人生毫无正面贡献,那就把它扔掉、送走、卖掉、抛开,继续前进。因为不进则退,丢掉负面的东    西,可以帮你重新发现正面的事物。
    第三,无论要丢还是要留,都不要让决定变得很困难。如果你得花很长的时间权衡利弊,或是烦恼不知该如何是好,那就丢掉!
    第四,别害怕。这是你的人生——-你唯一确信丢不掉的东西。你没有多余的时间、空间或精力留给那些有形还是无形的杂物。

书中谈到清爽的家,会发生好事。其实会发生什么好事,谁都不知道,但是丢掉根本毫无用处的东西,绝对会让人神清气爽呢。
如果开始丢东西,那么还有一点要记住:千万别扔掉别人的东西,这可能会让他们火冒三丈。
工作地方的废物会削弱工作的力量,把它们丢掉吧。
我们还需要丢弃不好的情绪,活出属于自己的人生。

对了,还有一句话很有用:"记住,如果你必须花很久的时间权衡扔掉某样东西的利弊,那就扔了!"

 

接下来,谈谈我个人的经验吧。

按照这本书上的方法,我刚刚丢弃了很多本食谱,这些食谱我大概只看过一遍,以后几乎不看它们。
其实大部分食谱都有线上版,很快就查询得到。
我常常使用的方法就是打开冰箱,看看还剩什么,然后把这些东西的名称一股脑儿输入google进行搜索,一定会找到自己满意的食谱的。

科技不断推陈出新。我已经再也不听CD了,我前不久扔掉了大部分CD,只保存几张有纪念价值的。我也和很多人一样认为,电子书是未来的趋势,也许未来我们也不需要再买那么多实体书了,即环保,又方便整理查找。

最近我也丢掉了百分之九十以前读硕士时的笔记和打印资料,在德国因为专业书籍非常贵所以当时我的书都是打印和影印的,所以非常多,大概有2大箱。去年搬家的时候不舍得扔,这两大箱具重的资料和我一起痛苦地搬了一次家。在过去的一年,我根本没有看过这些资料一眼,其实它们对我来说也几乎没有用处了,它们唯一的价值就是可以唤起一些读书时的记忆,其实当我需要找什么知识的时候,上网一搜或到图书馆一下就搞定了。现在我只留下了部分笔记,也算是留点纪念吧。

其实对我们来说没有用的东西就是会拖住我们的东西,扔掉它们,我们的生活会更加轻松愉快。

DSC00740

PS: 附图是我生日是得到的一张卡片,上面有海因里希·海涅的一首诗,很美,现附上诗词:

Heine,Heinrich (1797-1856)
Der Schmetterling ist in die Rose verliebt(蝴蝶爱上了玫瑰)

Der Schmetterling ist in die Rose verliebt, (蝴蝶爱上了玫瑰)
Umflattert sie tausendmal, (千百回围绕她身边)
Ihn selber aber goldig zart,Umflattert der liebende Sonnenstrahl.(充满爱意的阳光,温柔的缠绕着蝴蝶)

Jedoch, in wen ist die Rose verliebt? (然而,玫瑰爱上的又是谁?)
Das wüßt' ich gar so gern. (这我真的很想了解。)
Ist es die singende Nachtigall?(是啼唱的夜莺?)
Ist es der schweigende Abendstern?(还是星星,黑夜沉默于?)

Ich weiß nicht, in wen die Rose verliebt;(我不知道玫瑰爱上的是谁;)
Ich aber lieb' euch all?: (但我爱的是你们,全部这些:)
Rose, Schmetterling, Sonnenstrahl, Abendstern und Nachtigall. (星星,夜莺,玫瑰,还有阳光和蝴蝶。)

2010年8月26日星期四

如何做精彩的PPT报告

前几天听了一个德国MM的讲座,关于如何做好一个PPT报告。一个讲座下来最有印象的就是关于心态调整的介绍,其实克服紧张害怕的心理,最好的方法就是改变自己的心态。
有两句话我还大略记得:

Ja, Prima, ich kann endlich zeigen was ich kann. Endlich werde ich gefragt, ich kann das Thema wirklich gut präsentiert.
告诉自己:是的,我终于可以展现我的能力啦。我真的可以对这个题目非常好的进行报告。

还有一些很重要的东西也许我们会常常忽略:
例如,你是否进行了大声的练习?多次大声练习,我们的演讲效果一定会更好。
而且请在朋友面前进行演示一下,如果有相机更好,可以录下来看看。

DSC00547

还有一些要点,还是非常值得学习的,我这里记录一下,譬如:
形象也很重要,请穿正式一些的衣服,让人感到干净而且专业
要明确报告的的目
不要照屏幕念稿,也不要背
请使用一些简单的身体语言
注意语速的变化,该快则快,该重则重,该停顿处则适当停顿
图形更容易让人理解,多使用图形少用术语,图形可以让信息更为生动
请使用朴素的,简单的PPT
尽量让内容好懂
永远说“我们”
Magic Seven原则,也就是每个幻灯片不要超过7个概念或要点

 

如更好的提高听众的兴趣呢:
首先还是KISS (Keep It Simple and Stupid)原则,过于复杂难懂的内容是无法激发听众的兴趣的。
请注意我们的PPT的层次感,例如一些工科的报告可以使用这样的层次:动机-->遇到的问题-->我们的解决方案
正如前面所说的,我们可以适当使用一些图形或者一些简单的动画,注意是简单的,而不是复杂花俏的,这样可以提高听众的理解。
如果是一些工科的科研报告,那么可以适当使用一些Demo,简单的实验演示,会给整个报告带来非常好的效果。
对于一些报告也可以插入一些简短的视频,这对提高听众的兴趣也是一个很好的辅助。

 

最后我想再写一点点要点关于PPT的制作

PPT文字的使用,字体大小部分,行间距的设置,其实对做好一份精彩的PPT报告也是极其重要的。我最近读了一本书《别告诉我你懂PPT》,书中总结的非常好。这里简单摘抄一些:

字号的选择,有一个很经典的8H(H是指height,高度)法则。通常来讲,一个会议室PPT的演示屏幕,高度不应该小于屋子长度的1/8。反过来说,就是说屏幕上的字可以在相当于屏幕高度8倍的距离里清晰地看到。有人换算过,这大概是20号左右的字号。
中文30—20号字,英文28—18号字这样的字号,看起来不费劲,一行也写得下一个完整句,能表达很多信息。
避免内容拥挤的另一个要点是行间距。如果允许,请使用1.5倍的行间距,这样的行距比较畅快,让人觉得比较大气、坦然。

我使用英文或德文写PPT的时候,一般我使用24号字,这几乎可以让所有的听众非常舒服的看见。

最后再加一个摘要:

《别告诉我你懂PPT》这本书中还提到,PPT的清楚表达,有三个层次的要求:
1.清晰可见
2.容易理解
3.体现个性

附图是我家边上的不知名的花。

2010年8月19日星期四

用德语进行简报/报告/演讲

报告(10-15分钟)的长度一般比较长,而简报比较短(约5分钟),其实也是属于演讲的范畴,我个人是这样认为的。
又到了要做报告的时刻,其实在国内我如果使用中文进行演讲还不错,但是用德语进行演讲就相当烂了,已经用德语进行很多次的报告,都相当一般,其实主要就是语言的问题,但是如何克服它呢,其实就是“准备,准备,再准备”。
以下是一些我收集的短句,也许可能对需要的人有所帮助(我就不对所有的进行翻译了,哈)。附图是家附近的花丛拍的,勤劳的蜜蜂,晚上还在工作呢 ^_^ ||

DSC00454

引言:
Ich möchte eine kurze Präsentation halten über... (我的简短的报告是关于...)
In meiner Präsentation geht es um ...(我的演讲是关于...)
Ich möchte über ... erzählen: ...(我想关于...介绍)
Ich denke, jeder hat schon einmal von ... gehört, aber kaum keiner weiß wirklich richtig viel darüber.
... Darum möchte ich euch etwas darüber berichten.
(我想每个人都有听说过...,但几乎没有人十分正确了解它。...因此,我想介绍一些关于它的东西。)

做报告的过程:
Lassen Sie mich zunächst erklären, warum / wie ...
Jetzt möchte ich etwas über ... erzählen
Nun möchte ich einen kleinen Einblick geben in ...
Lassen Sie uns (nun) herausfinden, warum / wie ...
Lassen Sie uns nun zu ... kommen.
Wie ich bereits ankündigte, ...
Ein weiterer Aspekt ist ...
Die Ursprünge von ... gehen zurück auf ...   
... begann als ...
Wie Sie sicherlich wissen, ...   
Ihr Sie wissen ja sicher, dass ...
Vielleicht haben Sie schon von ... gehört
Vielleicht haben Sie das schon einmal gesehen.
Am Anfang gab es ...
Viele Menschen kannten / wussten / kennen / wissen ...
Kaum jemand kannte / wusste / kennt / weiß ...
Wie behauptet wird, ...    (据称,...)
Man kann sagen, dass ... (可以说,...)   
Wie ich gelesen habe ...   

关于图形和图片:
Lassen Sie mich das mit einer Grafik erklären.
Die Grafik zeigt, dass ...
Wie Sie (auf dem Bild) sehen können ...
Auf dem nächsten Bild können Sie ... sehen.
Hier ist noch ein Bild.
Das nächste Bild zeigt, wie ...
Lassen wir die Bilder für sich selbst sprechen.
Ich denke, dass Bild zeigt sehr deutlich, wie / dass ...
Hier können Sie jetzt ... sehen.

提一下“主题思想”:
Es war ein großer Erfolg für ...(这对于...是一个大的成功)
Es war / ist ein sehr wichtiges / besonderes Ereignis. (这是一个重要的结果)
Das beweist, dass ... (这证明了)
Der Grund dafür ist, dass ... (原因是)
Das Ergebnis davon ist, dass...(这样做的结果是...)
Das liegt daran, weil ... (这是因为)
Anders ausgedrückt ... (换句话来说)
Ich möchte noch einmal wiederholen, dass ...(我想再重复一遍)
Ich möchte (nur noch) hinzufügen ...(我想附加)

结束:
... hat einen großen Einfluss auf das heutige Leben.
... ist heute leider kaum noch bekannt.
... hat mich sehr beeindruckt.
Zusammenfassend lässt sich sagen, dass ...
Das war meine Präsentation zu ... (这是我的报告关于)
Ich bin nun gerne bereit, Fragen zu beantworten.
Gibt es Fragen?
Nächste Frage.
Genau.
Das ist richtig. / Das stimmt.
Das ist nicht richtig.

2010年8月13日星期五

推荐一张精选集《工作,阅读时需要的旋律》

我在8月6日在虾米网上做了一张AM精选集:
http://www.xiami.com/song/showcollect/id/1563300?trace_collect_orinew_list
还挺受欢迎的,截止8月13日已经有超过7万次的播放,超过150次的推荐和600次以上的收藏。
看来这张精选集还是挺受大家认可的 ^_^
这张精选的曲子其实大多数是我们家琳琳选的 *^_^*

我在虾米上的主页:http://www.xiami.com/u/492943
这个id主要是由我们家琳琳管理 ~^o^~

这里做一个小小的推荐,工作,阅读时听听这张精选集,也许可以提高工作效率哦 ∩__∩y

 

最后附带发一张照片:
这就是传说中的章鱼哥的一只脚。
上个星期六,我和我们家琳琳特地坐了2个多小时火车到奥博豪森Oberhausen的See life去看章鱼哥。
章鱼哥的水族箱不大,但是前来围观的粉丝,超级多。
可惜那天章鱼哥不赏脸,一直躲在角落,让人无法一睹尊容,只能看到一只脚。
于是就产生了以下这张照片。

章鱼哥的一个脚

2010年8月5日星期四

编程的时候我喜欢听吉他,你呢?

编程的时候,阅读的时候,工作的时候,或者是做家务的时候,最适合听一些轻快,充满节奏感的吉他曲,常常让人有种耳花缭乱的感觉,但是吉他的声音又丝毫不会打乱我们的思考,也许还可以提高工作效率。

说起来还有点不好意思,我大学的时候还学过一阵子吉他,但是现在几年没碰几乎全忘了,前几天在朋友家看到一把吉他,稍微试试,结果连最基本的和铉都弹不出来,哎。但是唯一还剩下的就是我还是认识一些吉他大师,所以我使用了虾米做了一张吉他的精选集,大大地赞一下虾米网,非常棒,我几乎可以找到我需要的大部分歌曲。

45701_1277044589M27X

精选集的地址为:琴弦上的舞蹈--吉他

http://www.xiami.com/song/showcollect/id/570736 

 

让我们去感受:

清新自然的木吉他。
使人沉醉精雕细琢的编曲。
吉他音箱共鸣声的无限通透。
奔放与热情,却不失文雅的琴声。
通过吉他带来的精彩绝伦的空间感。
也许你还可以发现一些放荡不羁的音符。
不经意的点弦手法和滑音,轻轻飘荡在空气中。
演奏家的指尖在琴弦上舞动着,融合了力量,柔美。

一切都等待着你来发觉,请告诉我这是在空中弥散的音符是什么味道,是青柠味,是海水,香浓浓的咖啡,还是...
是什么场景,是夏季校园的午后,还是冬日的暖阳中的带着寂寞格调的都市,还是...
描述的是什么感情,甜蜜的,或者悲伤的,还是...

这张精选里有:
由德冈庆也及三浦拓也二人合组而成的DEPAPEPE。
Trace bundy。
岸部真明。
押尾コータロー。
JerryC。
等等...

特别收录了三首卡农,由不同的味道,同样的是它们会把你带入不同的舒缓人心的音乐空间。

通过他们的吉他声来聆听音乐的灵魂吧。
指弹,琴弦上的舞蹈

2010年7月30日星期五

混合的美妙-鸡尾酒

dd-cocktail最近在一本杂志上看到了一些鸡尾酒的做法,突然间很有兴趣,今天有机会就恶补一下鸡尾酒的常识,家里正好有这几年积累下来的几瓶烈酒,过几天自己调一下试试。

以下内容来都自百度百科,这里摘抄出一些我感兴趣的内容。

 

 

鸡尾酒的灵魂
白兰地(Brandy)
白兰地在荷兰语中是“烧焦的葡萄酒”。13世纪那些到法国沿海运盐的荷兰船只将法国干邑地区盛产的葡萄酒运至北海沿岸国家,这些葡萄酒深受欢迎。至16世纪,由于葡萄酒产量的增加及海运的途耗时间长,使法国葡萄酒变质滞销。这时,荷兰人利用这些葡萄酒作为原料,加工成葡萄蒸馏酒,这样的蒸馏酒不仅不会因长途运输而变质,并且由于浓度高反而使运费大幅度降低,葡萄蒸馏酒销量逐渐大增,这就是现在的被称之为原白兰地的蒸馏酒。四个等级,特级(X.O)、优级(V.S.O.P)、一级(V.O)和二级(三星和V.S)。其中,X.O酒龄为20-50年,V.S.O.P最低酒龄为6-20年,VO最低酒龄为3年,二级最低酒龄为2年。

朗姆酒(RUM)
朗姆酒是以甘蔗糖蜜为原料生产的一种蒸馏酒,也称为“兰姆酒”。用甘蔗压出来的糖汁,经过发酵、蒸馏而成。此种酒的主要生产特点是:选择特殊的生香(产酯)酵母和加入产生有机酸的细菌,共同发酵后,再经蒸馏陈酿而成。

金酒(GIN)
金酒,又名叫杜松子酒,最先由荷兰生产,在英国大量生产后闻名于世,是世界第一大类的烈酒。
荷式金酒被称为杜松子酒(Geneva),是以大麦芽与裸麦等为主要原料,配以杜松子酶为调香材料,经发酵后蒸馏三次获得的谷物原酒,然后加入杜松子香料再蒸馏,最后将精馏而得的酒,贮存于玻璃槽中待其成熟,包装时再稀释装瓶。英式金酒的生产过程较荷式金酒简单,它用使用酒槽和杜松子及其它香料共同蒸馏而得干金酒。

伏特加(VODKA)
伏特加是由水和经蒸馏净化的乙醇所合成的透明液体,一般更会经多重蒸馏从而达到更纯更美味的效果,市面上品质较好的伏特加一般是经过三重蒸馏的。在蒸馏过程中除水和乙醇外亦会加入马铃薯、菜糖浆及黑麦或小麦,如果是制作有味道的伏特加更会加入适量的调味料。伏特加酒的酒精含量通常由35%到50%不等。

威士忌(Whisky)
威士忌(Whisky,Whiskey)是一种以大麦、黑麦、燕麦、小麦、玉米等谷物为原料,经发酵、蒸馏后放入橡木桶中陈酿、勾兑而成的一种酒精饮料,属于蒸馏酒类。

龙舌兰(Tequila)
龙舌兰酒又称“特基拉酒”,是墨西哥的特产,被称为墨西哥的灵魂。特基拉是墨西哥的一个小镇,此酒以产地得名。特基拉酒有时也被称为“龙舌兰”烈酒,是因为此酒的原料很特别,以龙舌兰(agave)为原料。龙舌兰是一种龙舌兰科的植物,通常要生长12年,成熟后割下送至酒厂,再被割成两半后泡洗24小时。然后榨出汁来,汁水加糖送入发酵柜中发酵两天至两天半,然后经两次蒸馏。

鸡尾酒的配料
力娇酒(Liqueur)及五大汽水:苏打水(Soda Water),可口可乐(Coke Cola),干姜水(Ginger Water),七喜(7 Up),汤力水(Tonic Water)。

 

调鸡尾酒的主要工具
长匙Bar Spoon
摇酒器Shaker
量酒杯Measure Cup:通常以毫升、量杯(盎司)为单位。
冰桶Ice Bucket,冰铲Scoop
过滤器(隔冰器)Strainer

马丁尼
介绍一下鸡尾酒之王(MARTINI),由1.5盎司「金酒」以及几滴「涩苦艾酒」,再加上橄榄一个或柠檬皮一片作为装饰,口感锐利、深奥。MARTINI其实市面上就有卖现成的。

鸡尾酒的调色
基酒:基酒除伏特加、金酒等少数几种无色烈酒外,大多数酒都有自身的颜色。如白兰地呈琥珀色,威士忌色泽棕黄带红,葡萄酒有深红、桃红和浅金黄色等。
鸡尾酒的颜色大多是通过不同颜色的原料调配出来,通常用来调色的原料主要有石榴糖浆,橙汁,蓝橙力娇酒,对于了红黄蓝三种颜色,好比我们熟悉的三原色,可以使用它们调制更多色彩的鸡尾酒。

2010年7月27日星期二

推荐一本书《摆出好POSE:美少女外拍动作完美图解》

DSC00142 附图为法兰克福一个商场的大型乐高积木。

很久没写书评,今天另类一点,写一篇关于一本摄影的书。
因为这本书的书名出现“美少女”,“完美图解”,这几个关键词,大大提高对我的吸引力,我这个摄影入门小白,才会想提起兴趣翻翻这本书,读了一下,其实还真不错嘛。
正如这本书的简介说的。
会玩相机,人像摄影只能算成功了一半,让模特儿摆出美丽的POSE才是成功的关键。
如何摆出美丽的POSE其实也是一门小小学问。看了这本书后,一定会有所收获的。

 

你知道吗,拍摄时模特的基本站姿应该怎样?
摆站姿时,如果想表现出模特儿修长与美丽的腰,可以请模特将重心放在远离镜头的脚上,靠近镜头的脚则稍微往后伸展,并让脚尖轻轻着地,放在腰上的手可以稍稍用力往前推一下,加强凸显腰部曲线。
还有一些小技巧,这里摘抄几点。

站立时,较靠近镜头的手记得要有点动作。
在椅子上时,两脚前后分开会比两脚放在一起来得美丽。
性感的蹲姿,比较适合侧面。

 

这本书的绝大部分篇幅在于"外拍好POSE全图解"这部分。
这部分主要是日系清淡风的动作,比较自然,亲和力也够,书中MM够可爱。
里面提供了有上百种拍照姿势,只要照着书上的例子来摆POSE就可以拍出不错的照片。
里面有很多快速简单的技巧教学。
这里随便摘抄一些。

侧躺比较好拍,用手将头撑起来会比较好,腰部往地上压,这样身体的曲线才会出来。
如果可能的话,坐在墙上眺望远方是一个不错的选择。
在墙边,可以让模特背靠墙,目光向下看,可以呈现出忧郁可怜的气质,如果墙上有趣味点如涂鸦,可以请模特与其互动,增加画面的趣味性。
用广角时,可以使用夸张动作,例如摆出一个相框。
稍微侧面的微笑,通常会比正面更吸引人,更活泼有变化。
手不知道放哪里时,就找个身体部位摸吧。摸耳朵,头是最常见好用哦,摸的时候轻轻碰到即可,不要太用力压迫到肌肉导致变形。

 

最后来一个总结。
很适合新手,简单又非常实用的书,更重要的是书中的MM都非常养眼,即使不学摄影,看看可爱的MM也是不错的,哈,推荐一下。

2010年7月25日星期日

今天你已经食用了5份蔬果了吗?

德国有一项已经开展了长达10年的健康饮食推广运动,就是“每日五份蔬果 - 5 am Tag Obst&Gemuese(http://www.5amtag.de/)”,我觉得这个运动非常好,以后在我的博客,我会对这个运动进行一些推介。我们都知道,其实健康就是良好的作息加上健康正确的饮食还有坚持运动,当然还有一个好的心态。

obstundgemuese_01

健康正确的饮食其实很简单,就从每日五份蔬果开始吧。

一天食用5份水果和蔬菜 - 这其实比你想像还要容易。

至于每份蔬果的分量,你可以参考以下例子:

一份蔬菜,可以是...
一个小萝卜,1个青椒或者3个西红柿
2把的生菜沙拉或切碎胡萝卜
1小罐蔬菜(大概125克)
2把冷冻西兰花,菠菜或蘑菇(约125克)
1把干豆类例如扁豆或豌豆
1把腌制的白菜或蔬菜
1杯番茄或胡萝卜汁

一份水果,可以是...
1个苹果,1个香蕉,桔子或桃子
2把草莓,覆盆子或葡萄
4汤匙炖水果
5个梅干或杏干
1杯含量100%的果汁
1/2把坚果(约25克)

2010年7月16日星期五

推荐一款免费又好用的系统监测软体 OpenHardwareMonitor


可以从它的官方网站下载:http://openhardwaremonitor.org/

几天前,一个同事给我介绍了一个系统监测软体OpenHardwareMonitor,试了一下很不错,很轻量但是非常简单好用。
这里做一个简单的介绍。


OpenHardwareMonitor是一个免费的开源应用程序,可以用它来监测计算机温度,风扇转速,电压,CPU的负载等等。
它支持大多数主流的硬件监测。 CPU温度可以监视通过阅读英特尔和AMD处理器的核心温度传感器。可以显示从ATI和Nvidia显示卡的传感器以及硬盘的温度传感器得到的数据。
Openhardwaremonitor可以在32-bit and 64-bit的Microsoft Windows和任何基于x86的Linux操作系统上运行。
更酷的是,我们还可以将温度变化绘制成图形。

下图是在我的笔记本上使用OpenHardwareMonitor的截图。

Enjoy!

2010年7月12日星期一

法国人,美国人,日本人,研发的机器人

最近看了一些关于机器人设计的论文,无意间看了几个视频,实在令人惊叹。

最精彩的不是视频,而是以下“20 Nao Robots Dancing in Synchronized Harmony”(这是来自法国的机器人)这个视频的网友的评论。
这个总结实在太精彩的,风趣幽默,赞一个。
the US isn't leading in this tech because they can't carry a gun
Japan isn't leading in this tech because you can't have sex with it
but? what does France do?...makes them fucking dance

接下来看看日本人的机器人吧

美国人的机器人

2010年7月4日星期日

看完德阿比赛,上一张bild.de上截的图片

和朋友看完德国4:0阿根廷
太疯狂了,史上最嗜血德国队诞生
市中心的德国球迷也陷入疯狂
刚刚上了bild.de
一上网就听到
"Don't Cry for Me Argentina"
这句背景音乐,阿根廷真的是太惨了
我既不是德国球迷也不是阿根廷球迷
我只是一个伪球迷
看到3:0的时候已经不忍心了
希望阿根廷能够扳回一两个球

  WM2010_bild_de

上一张bild.de上截的图片(我特选这张图片,比我在市中心用手机拍的照片震撼多了)
上面的德语为:
Wir sind so stolz auf Euch!
我们真为你们感到骄傲!
IHR seid Wahnsinn!
你们是疯狂的!
Halbfinale gegen Spanien
Aber die packen wir!
半决赛对阵西班牙
但是我们搞定他们!

 

现在德国人,真的是陷入疯狂
今天德国天气极热,大概是今年最热的
极热的天气加上德国队疯狂的胜利
这个胜利够全德国疯狂一阵子了
我的一句话点评
德国队的胜利,这也是令人信服的“整体足球”胜利吧

2010年6月28日星期一

容器格式 Container format

这是一个非常长期的计划,在hanyionet的博客中将陆续对“流媒体技术”的方方面面进行介绍。在这里我试图梳理一些重要的知识点,力求以最简单易懂的语言进行介绍,并且适度提供部分英文特殊名称,以便读者进行进一步的搜索。每篇文章都尽量精简,只对一个小的方面进行探讨,以前也写过一部分关于流媒体技术的文章,以后也会陆续收录到这个专栏里。

容器格式 Container format

一个多媒体容器格式是一种文件格式,它指定如何将数据存储在文件中。它并不指定数据应该如何编码。它也被称为meta-format,因为它不是只存储实际数据,而且描述了数据信息是如何在文件中存储。音频或视频流可以使用许多不同的算法进行编码,但它们只是在很少的几种文件格式中存储。
下图(来自互联网)体现了编解码器Codec和容器格式Container format的关系。

video-container

用于实际上编码/解码视听数据的算法称为编解码器。编解码器Codec是为编码器/解码器的简称。容器中的编解码器的头(Codec header)包含了非常重要的信息对于用来解码视频文件。例如,它描述了有关视频的帧的帧率,分辨率和编码算法等。音频/视频流解码总是根据在编解码器中的资料头结构。不同的容器格式会拥有不同的头结构(header structure)。

 

视频播放器先读取在容器文件编解码器的头信息,然后在视频播放器里找到对应分路器,并初始化将用于视频解码运行时播放视频流的适当的解码器。

 

现在大部分的编解码器信息不是被储存在文件的开头,就是被存储在文件的末尾,在播放视频的时候,作为头信息没有需要作任何的改变。这意味着每当视频播放器遇到一个新的视频文件,视频播放器必须读取头文件信息,然后初始化相应的解码器,最后解码和播放视频。这个过程会导致在视频播放的时候会产生几毫秒的延迟。这就是为什么我们不能播放两个单独视频文件,在同一个视频播放器实例,除非视频播放器同时提供了一个或多个缓冲区,或者相应功能的多个实例编解码器。

2010年6月27日星期日

数字视频 Digital Video

对“流媒体技术”有了一定的接触后,hanyionet现在开了一个“流媒体技术”的专栏。这是一个非常长期的计划,在hanyionet的博客中将陆续对“流媒体技术”的方方面面进行介绍。在这里我试图梳理一些重要的知识点,力求以最简单易懂的语言进行介绍,并且适度提供部分英文特殊名称,以便读者进行进一步的搜索。每篇文章都尽量精简,只对一个小的方面进行探讨,以前也写过一部分关于流媒体技术的文章,以后也会陆续收录到这个专栏里。

 

什么是流媒体技术,其实流媒体技术也称流式媒体技术。所谓流媒体技术就是把连续的影像流媒体技术和声音信息经过压缩处理后放上网站服务器,让用户一边下载一边观看、收听,而不要等整个压缩文件下载到自己的计算机上才可以观看的网络传输技术。在第一篇文章,我想介绍的是数字视频。

其实一个视频是由多个数据流组成。在每一个电影文件,至少有两个单独的数据流对于音频和视频。最常见的其中一个标准,用于视频编码就是我们所熟悉的MPEG。运动图像专家组(MPEG)是由国际标准组织(ISO)和International Electrotechinical Commission (IEC)成立。运动图像专家组(MPEG)负责界定和发展音像和其他多媒体内容的标准。

每个的MPEG编码视频的组成成分是连续Group of Pictures (GOPs),见下图。一个GOP还可能包含一个或全部的I-帧任何,P帧,B帧和D帧。I帧是Intra-frame的缩写形式,它被称为Intra-frame,因为它不依赖于任何其它帧它可以独立解码。I帧也称为关键帧。它们是类似的JPEGimage。当我们播放MPEG视频,寻找到其他视频位置的时候,它总是从开始最近的一帧。当然啦,一个视频的编码可以只使用I帧。这种压缩类型,通常是很快,但它会产生非常大的文件大小。两个I帧之间的非I帧的数目称为GOP的长度。通常,对于MPEG-1格式,GOP的大小通常为15至18,这意味着在两个I帧只间有15至18个非I帧。

Group of Pictures

P帧,为预测帧(Predicted-frames)的缩写,也称为forward-predicted frames。该P帧只包含有关和以前引用帧图像的差异,可以是一个I帧或其他P帧。因此,使用P帧的主要目的是为了提高压缩率。

双向帧,B帧,也称为backward-predicted frames向后预测帧。它们相当类似的P帧进行预测,但是B帧同时使用上一帧和下一帧的信息。在B帧被解码并显示之前,邻近的I帧或者P帧必须被解码。这使得B帧解码的计算相对比较复杂。因此,它们需要更大的数据缓冲区,以避免出现显示拖延现象。

D帧是一种特殊的帧类型,只在MPEG - 1标准的出现。它们没有使用在后来的MPEG视频标准。D帧是一个独立的图像,提供非常低的图像质量和数据大小。它仅用于视频的快速预览。

2010年6月22日星期二

不要“想当然”地编程

100_2891

本图和本文无关,摄于汉诺威动物园。

很久没有在“电子工程师乱弹编程”这个系列写一些东西,这个系列是我的一些关于编程“自爽文”的集合,今天有点时间,来写一个小小的编程体验。
今天下午又花了一大堆时间来找bug。
经过一番一番的跟踪才发现bug的程序代码。
找到bug后,又是一阵痛心疾首。

花了那么多的时间就是为了一个非常愚蠢的bug。
在代码中,我需要配长度为DEF_I_FRAME_BUFFER_SIZE字节的内存块。
DEF_I_FRAME_BUFFER_SIZE 长度为一个MPEG编码的I Frame的大小。
_last_buf = (uint8_t *)malloc(DEF_I_FRAME_BUFFER_SIZE);
我当时“想当然地”分配了200000。
自认为已经足够大了。

请看以下分析:
如果分辨率为500*500
使用了的是4:2:0 (YV12) --> 12 bit pro Pixel
8 Bit = 1 Byte
那么可以得到maximal frame size:
4:2:0 (YV12) --> 500*500*(12/8) = 375000 Byte = 0.375 MB
哈,就是这样,对于一个500*500一个帧也许会需要375000 Byte,就是这么简单。

“想当然”的足够大的size,就产生了一个愚蠢的bug。
使用malloc固然非常危险,但是最危险的是“想当然”的编程态度。
我常常不够谨慎地进行编程,一味求快。
这常常会出现很多思考的遗漏。
其实,在当时编这段愚蠢的代码的时候,自己问问自己,是这样吗?
如果自己的回答是不太确定,那么就去google一下,就像今天的例子,我当时只需要几分钟google一下,就可以分析出我所需要的buffer的大小。
然而,当时的“想当然”,就会产生后来的一个小时以上时间的浪费。

好了,最后再总结一下。

第一个经验为:
不要“想当然”地编程

第二个小小的经验为:
在动手找bug解决它的时候,一定一定要分析理解一下问题的本质。抓住问题的本质,根本,这很重要。
不要乱猜测bug的来源或者随意随机的修改,这肯定会让你的程序比找bug之前更糟糕。

2010年6月21日星期一

阅读和使用LIVE555的一些简单记录

行2 012

注意,此图和本文无关。图为以前拍的汉诺威动物园的企鹅。要了解正文请继续阅读。

最近继续看了看live555的代码,进行了一些具体的实验。
对live555的部分特性有了一定的了解。
稍微看了网上的一些关于live555的文章,千篇一律。
大部分都是转载自一个人的博客。
很少人进行一些实验或进行一些比较深入的代码阅读,然后写出一些其他的经验之谈。
我想应该是很多人都进行了代码阅读,理解了代码,但是就是懒的写一些东西吧。
这里自夸一下自己,哈,hanyionet真是大好人,大闲人。
这里我尽我自己一份小小的力,给大家写一些小小的经验之谈。如果有时间的话,我将写一些更多的文章关于live555。

以前在网上看到一个论坛有人问:
使用live555的testMpeg1or2VideoReceiver在其FrameSink的afterGettingFrame1(unsigned frameSize, struct timeval presentationTime) 接受的buffer是否是代表一个帧。
大概是这个问题。

当时看到没有太在意。
因为没有搞这部分。
刚刚做了一些实验。
根据实验的结果。我可以得出:
live555如果采用 A test program that reads a MPEG-1 or 2 Video Elementary Stream file就是testMpeg1or2VideoStreamer.cpp发送rtp包,那么得到的rtp包包含的就不是一个完整的帧。

如果不是完整的一帧那么我们该如何进行“正确”的解码呢。
例如我们使用的是FFmpeg的avcodec_decode_video()进行解码。
那么如果要正确解码,就必须将一个完整的帧的buffer放入这个解码API中去。
如果没有正确的一帧,我们直接将buffer放入avcodec_decode_video()进行解码,会有什么结果呢。
我们就会得到抖动的画面,带着马赛克,或者画面模糊等等。
这说明了,我们没有正确的解码。

接下来的问题是,我们该如何得到完整的一帧呢。
因为我们现在得到的是一些buffer(它为unsigned char*)。
很多人会想到要使用avcodec_decode_video()进行解码然后得到的例如AVFrame *_decoded_frame这样的_decoded_frame的指针。
通过类似_decoded_frame->pict_type == FF_I_TYPE 或FF_P_TYPE,进行判断。
但是我进行的实验证明这是不可以的,也就是说无法正确地判断这些buffer是否为同一帧的buffer。
我使用的avcodec_find_decoder( CODEC_ID_MPEG2VIDEO );
可能其他的codec可以通过_decoded_frame->pict_type == FF_I_TYPE 或FF_P_TYPE,进行判断。
但是在CODEC_ID_MPEG2VIDEO或CODEC_ID_MPEG1VIDEO的情况下不行。

经过一点思考。
我发现使用live555中afterGettingFrame1(unsigned frameSize, struct timeval presentationTime) 的presentationTime进行判断就可以判断出是得到的buffer是否是同一帧的。
具体实现如下,我只是提供一点思路。
具体实现请自己搞定。
请不要问我如何编。
很简单,请想想吧,请不要写信要源代码。

一点思路:

可以将每次进入afterGettingFrame1的presentationTime进行判断,如果是相同的
那么将相同的buffer存入一个buffer中去,也就是两个buffer连接在一起,不知道我是否表述的清晰。
其实就是使用memcpy这个函数。
当presntationTime不同时候,将以前存的buffer(已经是完整一帧)传给avcodec_decode_video()就可以正确地解一帧了。

当然了,这里在提一下,我们最好设两个thread,一个thread进行live555的接受,另一个thread进行解码使用FFmpeg或其他。
两个thread如果读取同一变量,请设定mutex进行锁。

在进行一些延伸的思考,为什么可以使用presentationTime判断是否为同一帧呢。
如果读过live555的http://www.live555.com/liveMedia/doxygen/html/DeviceSource_8cpp-source.html
liveMedia/DeviceSource.cpp的朋友就知道了,非常非常不负责任的简单地说,如果我们想自己进行编码然后再播放那么就要使用DeviceSource这个类,自己进行一些拓展,DeviceSource是在服务器端,进行rtp包发送前的处理。
DeviceSource里的deliverFrame()函数的用途就是将编码后产生的buffer连同想对应的presentationTime一起“发送出去”,如果熟悉FFmpeg可以使用avcodec_encode_video()进行编码。
看到了吧,在这里就可以找到了presentationTime和一帧里的buffer之间的联系。
当然了,我的这个解释很不负责任,极度简单。
只是通过一个例子进行说明。
有兴趣的朋友可以通过进行更进一步的代码阅读了解presentationTime和一帧里的buffer之间的关系。

好了,随手写一些东西,比较不见条理性。希望大家见谅。
希望大家在需要的时候,能搜索到这篇文章,并得到一点帮助。

注意,以上的解释和记录比较不负责任,极度简单,因为没有进行更系统的代码阅读和分析,不能保证以上所诉完全正确。

2010年6月16日星期三

两个关于char*的bug (QDebug, itoa)

100_2995

此图和本文无关。图为德国埃森的华纳影城的街景(4年前拍的,昨天在整理照片发现的),我很喜欢这张,海绵宝宝。要了解正文请继续阅读。

我今天刚刚发现的我写的两个愚蠢的bug,都和char*有关。
这个两个愚蠢的bug都是因为我自己对一些函数的不正确,过于简单的理解造成的。
要警惕啊,随手写下来,记录一下。

[1]
在使用Qt的时候,我非常喜欢使用QDebug。
可以任意输出什么东西。
可是没有想到,QDebug也会给我造成bug,使测试崩溃。
例如我使用:
QDebug & QDebug::operator<< ( const char * s )
Writes the '\0'-terminated string, s, to the stream and returns a reference to the stream.

rmsg.Answer是一个char*
qDebug() << " Answer:" << rmsg.Answer;

就会得到类似的输出
First-chance exception at 0x670a7fb9 (QtCored4.dll) in **.exe: 0xC0000005: Access violation reading location 0x0000000f.
Unhandled exception at 0x670a7fb9 (QtCored4.dll) in **.exe: 0xC0000005: Access violation reading location 0x0000000f.

发现
Qt的qstring.cpp

QString::Data *QString::fromLatin1_helper(const char *str, int size)
{
    Data *d;
    if (!str) {
        d = &shared_null;
        d->ref.ref();
    } else if (size == 0 || (!*str && size < 0)) {    //程序崩溃在这里
    } else {
        if (size < 0)
            size = qstrlen(str);
        d = static_cast<Data *>(qMalloc(sizeof(Data) + size * sizeof(QChar)));
        d->ref = 1;
        d->alloc = d->size = size;
        d->clean = d->asciiCache = d->simpletext = d->righttoleft = d->capacity = 0;
        d->data = d->array;
        ushort *i = d->data;
        d->array[size] = '\0';
        while (size--)
           *i++ = (uchar)*str++;
    }
    return d;
}

这到底是什么原因呢?

因为我给了错误的指针。

如果得到比较怪异的指针,qDebug()无法正确转换成QString或者(whatever进行一些有关于QString的处理)进行输出的时候就会产生这样的错误。

[2]
现在来谈谈第二个关于char*的bug。

/***
*xtoa.c - convert integers/longs to ASCII string
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       The module has code to convert integers/longs to ASCII strings.
***/

常常使用<stdlib.h>里的函数itoa进行int 到char*的转换
char * itoa ( int value, char * str, int base );

如果这样写
/* use the itoa() to convert int to char* */
int id = 10;
char *id_char;
itoa (id, id_char, 10);

就会出错,然后如果使用Visual Studio进行debug就会跳到xtoa.c里。

/***
*xtoa.c - convert integers/longs to ASCII string
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       The module has code to convert integers/longs to ASCII strings.
***/

为什么呢,还是因为没有定好char*的具体范围。
大概是这样的。
该怎么做呢,其实很简单。
只需如下定义char*就行了。
char id_char[3];

/* use the itoa() to convert int to char* */
int id = 10;
char id_char[3];
itoa (id, id_char, 10);

2010年6月15日星期二

使用Qt Designer进行QLayout设定

用Qt开发GUI的朋友一定对QLayout类很熟悉
我们常常使用QGridLayout,QFormLayout,QBoxLayout,QHBoxLayout,QVBoxLayout 
但是完全用写代码的方式设计GUI,往往是挺麻烦的,至少对我而言
还好我们有Qt Designer

今天,非常简单地谈谈如何使用Qt Designer进行Layout
这里举一简单的例子,我们使用Qt Designer进行Layout做一个视频播放程序的非常简单的用户操作界面

在Qt Designer中Layout可以从Widget Box中选择
也可以从Menu Bar中选择
例如下图

Qt_Designer_1_hanyionet

圈选我们需要进行Layout的Widget例如一些已经设定好的PushButton,Slider等等
然后点击我们进行Layout的类型,例如这里使用了QGridLayout
完成后在Object Inspector中可以看到我们的选择
在Property Editor里可以看到我们的Layout的Stretch等等变量
我们也可以继续手动进行一些微调,例如水平和垂直spacing等等
具体如下图所示

Qt_Designer_2_hanyionet

接下来进行一些类似的QHBoxLayout将一些Label放入其中,和上面的操作类似

最后将QHBoxLayout和QGridLayout整体再放入QWidget的Vertical Layout里
现在大功告成,看吧,实在非常简单吧

可以看到我们完成的一个视频播放程序的非常简单的用户操作界面
如下图所示,点击下面的图可以看大图

Qt_Designer_3_hanyionet

Qt_Designer_hanyionet

在做一些非常简单的演示程序的时候,如果采用Qt Designer进行Layout,常常会节省很多时间,提高编码效率

Enjoy!

2010年6月14日星期一

闲来谈谈理财

金融学上有所谓72法则、71法则、70法则,用作估计将投资倍增或减半所需的时间,反映出的是复利的结果。
计算所需时间时,把与所应用的法则相应的数字,除以预料增长率即可。例如:
假设最初投资金额为100元,复息年利率9%,利用“72法则”,将72除以9(增长率),得8,即需约8年时间,投资金额滚存至200元(两倍于100元),而准确需时为8.0432年。
要估计货币的购买力减半所需时间,可把与所应用的法则相应的数字,除以通胀率。若通胀率为3.5%,应用“70法则”,每单位之货币的购买力减半的时间约为70/3.5=20年。

股票投资比重股票投资适当比重=100-年龄/100。风险与报酬成正比,对一个30岁的年轻人,追求成长,适当地投资股票比重是七成(100-30/100);一名70岁的退休者,股票投资就不宜超过三成(100-70/100)。这个法则是国外教科书推荐的法则,那么在国内,我们应把100变为社会平均生活年龄,比如80岁,或75岁。

活期存款"6个月生活费"活期存款利息极少,存多了则浪费,存少了怕不够家庭应急。一般来说,活期存款为个人或家庭6个月的生活支出最合适。

金融资产1:1固定资产,家庭金融资产(存款、基金、股票、债券等等)和固定资产(房产、汽车、商铺等等)的比例最好为1:1。

保险 "10定律"
保险额度为家庭年收入10倍,总保费支出为家庭年收入的10%。

以上内容来自维基百科及网络。

images_starbucks 

好了进入正题。
还是要坚持每周至少一篇博客,今天写一个简单的读书笔记吧。
最近稍微简单地翻阅了一本书《喝星巴克咖啡的女人VS买星巴克股票的女人》韩国财经专业记者的金姬姃写的书,其实这本书还是挺有趣的,闲来无事的时候看看还不错,可以汲取很多的新知。
男生看看这本书也不错。
从这本书中我了解了一个最浅显而常常会被人忽略的道理:
理财的首要目标在于累积资产管理的能力。

书中也谈到了我在上面摘出的72法则和股票投资比重股票投资适当比重等等概念,很多人一定都知道吧,哈,我一点都不知道,我还是通过这本书才知道的。
所谓真正了解理财,其实要先摆正观念。
就是要先摆脱一获万利的甜蜜诱惑。
然后知道什么是理财。
书中提出:
理财就是将管理的“理”与钱财的“财”合在一起而成的辞汇。理财一词让人有种庸俗,金钱游戏的感觉。但若将理财视为资产管理来看的话,感觉又如何呢?这就
让人有种是对人生长期规划的感觉。因此,专家们为了避免“理财”一词给人一种金钱游戏的负面联想,有时也会使用“资产管理”的说法来代替。
我们应该做什么呢。
首先是放弃所谓的“一获万利”的白日梦,别想不劳而获 。
然后相信自己,透过持续性的资产管理,来达到经济独立,同时借此增加自己的财富。
具体来说就是,每个星期花点时间,彻底掌握经济与金钱的走向,进行稳定的投资,慢慢达到致富目标。

其他的理财方法我这里就不提了。
这里谈谈投资股票。
这本书提到,投资股票,买一股是一股。
但是我们真的知道,该如何投资股票。
其实买股票的时候我们永远不可能买的最低或最高。应该会买到不高不低的价格吧。其他的其实并不需要关心吧。
我们应该参考技术图形或消息吗。
其实做长线投资的时候,我们应该知道一些的内容。

知道这家公司是干什么的,它的思想和理念是什么,有什么主业副业。会不会倒。
这家公司市盈率等参数是什么。平均交易量,流动性,是否存在大量关联交易。
它在什么行业,这家公司的行业地位。这个行业是否会相对其他行业具有较高的成长性。
它的产品或者提供的服务,是否有大量的消费者愿意使用(这一点可以观察一下自己身边的人)。

最近读的“闲书”明显少了。与其说是比较没时间,其实是比较懒。
自己的一个小感受,读书还是很重要的,读一本好书就像听智者聊天。
不仅感受智慧还会发现差距,接受新知。有时间还是一定要多读书啊。

2010年6月6日星期日

咖啡因到底不会让人清醒?

我们常常早上时来一杯咖啡,以图让自己清醒。
然而咖啡因真的会让人清醒吗?
这是真的吗?有科学依据吗?
我其实也考虑过这个问题。

刚刚在网上看了一则报道,也提到了这个问题。
这个报道也解决了我很久以来的困惑。以科学的角度来解释这个问题。
这里做一个非常简单的介绍。

coffee_art

其实咖啡和其他含咖啡因的饮料本身不会使人清醒。其实这只是幻想的兴奋剂的效果。现在英国专家发现,事实上,咖啡因并没有刺激使我们感到清醒,但是如果我们戒断咖啡因摄入,反而这会让人感到非常累。只有当咖啡因继续进入人体,因咖啡因的戒断产生的症状才会消失,我们才会感到清醒。以上的结论来自研究者的结论,发表在“神经精神药理学杂志Journal of Neuropsychopharmacology”。

这将意味着:我们甚至不应该开始习惯喝咖啡,茶或其他含咖啡因的饮料。因为,如果发生“戒断咖啡因”,我们的疲劳只能通过更多含咖啡因的饮料来缓解。另外,在大脑中的咖啡因依赖的影响已被证明。前一段时间,美国科学家曾在科学期刊“精神药理学Psychopharmacology”发表了一份报告,发现因咖啡因的戒断会改变大脑的血流量,因此会导致头痛。但是如果该物质(咖啡因)再次进入体内,痛苦的反应在大多数情况下会迅速消失。

 

参考:
www.nature.com/npp/journal/vaop/ncurrent/abs/npp201071a.html
http://de.news.yahoo.com/12/20100604/thl-koffein-soll-doch-nicht-wach-machen-d343981.html

2010年6月5日星期六

土豆使人发胖?

今天来聊一些生活常识。
土豆使你发胖?食用生的蔬菜比煮熟的健康吗?
你和我一定不是很清楚吧。
以下是在的德国雅虎生活频道看到的一则报道,这里做一个简单的翻译。希望大家会喜欢。

Eisbergsalat

我们这里谈论一下了五个对蔬菜这个大自然的礼物常见的误解。

第一,新鲜的蔬菜比冷冻的更好?
有研究表明,冷冻蔬菜往往含有更多的营养。收获后,大部分的蔬菜,维生素损失不断。储存的时间越长,蔬菜中对健康有益的成分损失越大。

第二,生的蔬菜比熟好?
这取决于蔬菜种类。富含维生素C的蔬菜更适合生食。另一方面,维生素A的发挥需要一定的加热。此外,熟的蔬菜更容易被消化。健康食品中的抗氧化剂可以更好地被人体吸收。

第三,生菜(Eisbergsalat)没有营养?
除了水,生菜还含有蛋白质,纤维,维生素和矿物质。然而,我们也可以选择比生菜更健康的长叶生菜,它含有更少的水 - 但是含有更多维生素。

第四,土豆让你发胖?
马铃薯几乎不含脂肪和只会提供极少的热量 - 但有它含有大量的纤维。因此,土豆可以持续长时间的饱足感。这不是土豆本身,而是在于我们对土豆的再加工。

第五,市场上的蔬菜始终是“有机”?
如果你直接从农民购买蔬菜,这并不意味着,这些蔬菜是真正的有机产品。可靠的指标是国家有机认证。如果产品上有这个有机认证,那么就可以确保您购买的是经过测试的“有机”产品。

原文出处(德文):
http://de.lifestyle.yahoo.com/04062010/442/gemuese-mythen.html

2010年6月3日星期四

德国房租和房价最高的城市

今天在德国雅虎看到一则关于德国的平均房租和价格最高的城市的新闻。
这里做一个非常简化的翻译。
其实和中国一线城市还有部分二线城市对比,其实德国的房子一点都不贵,而且德国的平均工资水平远高于中国。闲话不多说,看数据。

Dusseldorf Skyline

市场研究机构Empirica的一项最新研究,研究了称近120个德国城市平均价格。这些数据适用于拥有居住面积60-80平方米的公寓。
图:德新社

第十位是德国黑森州州的首府威斯巴登。每平方米平均达到9.31欧元。

第九位是德国本身狂欢大本营和莱茵兰普法尔茨的州府莱茵河口的美因茨。这个城市每平方米的租金为9.37欧元。

第八次是德国的科技城黑森州的达姆施塔特。每平方米为9.67欧元一平方米。

第七位是北威州的州府杜塞尔多夫。平均价格为9.95欧元。

第六位是巴登符腾堡州的州府斯图加特。这个内卡河边的城市大概为十欧元每平方。

第五名是汉堡。这个两条河流流过的国际大都会每平方米为10.61欧元。

第四名是弗莱堡。这个巴登符腾堡州的大学城平均每平方米高达10.62欧元。

第三位是海德堡。又是巴登符腾堡州的大学城,平均每平方米的租金已经高达10.77欧元。

第二位当然是美因河畔法兰克福。这个位于黑森州的金融中心,不仅拥有德国的天际线而且还有极高的租金,大概11.07欧元一平方米。

第一名没有意外还是巴伐利亚州首府的慕尼黑。这个伊萨尔河上的大都会,不仅是德国足球场上的纪录保持者而且她每平方米12.11欧元的租金也是德国最高的。

 

以下是德国10个房价最昂贵的地方:

第十:巴伐利亚州的罗森海姆。这个61万居民的城市的公寓平均一平方米的售价为2533欧元。

第九:巴伐利亚州的埃尔兰根。这个只有10.5万人口的城市(西门子在这个城市极具影响力,西门子很多重要的部门都在这里)。这里的房价为平均每平方米2567欧元。

第八:巴登符腾堡州的首府斯图加特。2643欧元只能在这里买公寓的一平方米。

第七:美因河畔法兰克福。购买价格为每平方米2654欧元。

第六:巴登符腾堡州的弗莱堡。至少为每平方米2737欧元。

第五:巴登符腾堡州的海德堡。德国最古老的大学城不仅有学生,可怕的高租金,还有极高的购买价格。平均2760欧元每平方米。

第四:巴登符腾堡州的巴登巴登。这个拥有著名的温泉和赌场巴登符腾堡州的城市。平均每平方米的房价为2799欧元。

第三:巴伐利亚州的雷根斯堡。这个城市的命名采取的方式从河流的名称,而不是降水量多。每平方米2807欧元。

第二:汉堡。每平方米为2972欧元。

第一:还是巴伐利亚州的的州府慕尼黑。平均为3586欧元每平方米。

德国平均房租和平均房价最低的地方在大部分位于东德地区。

 

原文地址(德文):
http://de.finance.yahoo.com/nachrichten/wo-mieten-und-kaufpreise-krftig-steigen-hblatt-d5f0e21028d8.html

2010年6月2日星期三

读书笔记:《写给生存不安的年轻人》

现在想开始改变博客风格
在编排方式也做一些改变并减少一些所谓偏技术性的文章
排版的方式将以让人看起来不累为指导原则
增加一些随笔,读书笔记和心情感悟

前不久看了《写给生存不安的年轻人》这本书
强烈推荐
这本书也是当年日本AMAZON商业类榜单上的畅销书
作者是一个日本人山本真司
其实日本人写的商业类书籍在很多情况比较符合我们中国人的需要
这本书谈到年轻人要做到脱颖而出
要实行差异化策略
找出感兴趣的领域
每个人都有其自身优势
如果能在自己有兴趣的领域发挥自己的创造力
那么距离成功也就不远了

很多书都谈到了目标为导向的学习法
这本书也提到了这种学习法的优点
最重要的是这种方法极具针对性和效率
简单而言就是越专注越有效率
知识爆炸的时代
新的知识永远学不完
我们所需要的就是别人无法取代的实力
而这种实力的取得
其实一是靠积累
二是靠本书所提到的目标为导向的学习法

很多年轻人都希望拥有MBA学位给自己加分
然而什么是MBA
MBA的核心和精华什么?
我认为很多人和我一样并不是真正地了解
这本书提到
其实MBA就是不外乎以下这些方面
logical thinking,investment,finance,marketing,corporate strategy
请摆脱MBA情节
其实MBA并没有什么
对一个年轻人而言
拥有一个MBA学位
已经无法创造出差异化竞争力
其实我们大可以自学
重点掌握MBA精华

学海无涯而我们的时间有限
我们要做到的其实只是通过目标为导向的学习法
然后注重「软性技能」
发挥创造力
突显自己与众不同之处
创造差异
整体不要看局部
努力和专注提高自己的“核心竞争力”

2010年5月29日星期六

用CamStudio做软件程序演示视频

上个星期一个师兄告诉我可以用CamStudio软件程序演示视频,自己使用了一下非常满意,这个软件不仅开源,而且非常简单易用,可以满足我们创建软件程序演示视频的绝大部分要求。接下来,我在这里做一个简单的介绍。

software_CamStudio CamStudio能够记录你的电脑屏幕和音频的所有活动,并创建符合行业标准的AVI视频文件,我们还可以使用CamStudio内置的SWF Producer将AVI文件转换成流媒体Flash视频(SWF文件)。

 

 

 

 

 

可以用CamStudio做到:

可以使用它来创建任何软件程序演示视频。
或者建立一系列的视频来回答最常见问题。
可以为中学或大学创建视频教程。
可以用它来记录与你的计算机上经常出现的问题,以便展示给技术支持人员。
可以使用它来创建以视频为基础的信息产品。
甚至可以用它来记录你发现的新的技巧关于使用你喜欢的软件程序,你忘了之前。

可以在CamStudio的主页下载到这个软件,并获得更多的帮助:
http://camstudio.org/

最后谈一点无关本文主题的东西。上个星期看了欧洲冠军杯决赛,国米夺冠,内心非常激动。
附上网上看到的笑话一则:
皇马买了C罗,曼联进8强了;皇马买了本泽马,里昂进8强了;皇马卖了斯内德,国米进8强了;皇马卖了罗本,拜仁进8强了......见过悲剧的球队没见过这么悲剧的球队。AC米兰抱着皇马的大腿使劲摇啊,哭啊:“你丫,我买的亨特拉尔呢,就我没有晋级!”皇马大吼一声:“我靠,你派来的卡卡呢!”

Enjoy!

2010年5月19日星期三

工业加工的肉类产品影响心脏的健康

今天谈谈别的肉类消费风险。今天在德国雅虎首页看到的新闻挺触目惊心的题目是Schinken schlaegt aufs Herz(火腿打击心脏)。


AA041239

这里做一个简单的翻译:
红色的肉类消费造成的健康风险是众所周知的。这肉是不一样的肉。最近一项研究表明,工业加工的肉类产品对心脏的健康有很大的负面影响。
不仅因为保持身材的原因,你应该减少食用早餐火腿。如香肠,冷盘加工肉类,不仅增加了胃癌的风险。哈佛公共卫生学院的科学家发现,对这种产品的消费中,罹患心脏病的风险增加了百分之四十二,糖尿病的风险增加了百分之十九。大概每天食用50克 - 相当于约2片培根或香肠,就会增加这些风险。但是未经工业处理的红色肉如羊肉,猪肉或牛肉不会增加这些健康风险。研究是基于对一些国际数据收集与超过百万志愿者的比较。
所以想要健康一定要注意减少工业加工的肉类产品的食用。

2010年5月9日星期日

可用性工程的可用性评估 - 用户评估

再回顾一下,我在以前的文章提到过,可用性评估大概有以下五种:

  • 用户模型(User Model
  • 启发式评估 (Heuristic Evaluation)
  • 认知性遍历 (Cognitive Walkthrough)
  • 用户测试 (User Testing)
  • 用户问卷调查 (Questionnaire)

大体上分为三类:也就是所谓的理论评估、用户评估和专家评估。理论评估和专家评估已经简单介绍过了。现在继续介绍可用性工程的可用性评估 - 用户评估部分也就是用户测试 (User Testing)和用户问卷调查 (Questionnaire)评估方法这两种方法也是我们常常采用的方法,虽然看似简单,但是也常常会忽略很多重要的因素。以下是这两个方法的具体介绍。

用户测试 (User Testing)

1. 前期准备工作

(1)明确测试的目的

    • 帮助改进交互设计
    • 通过测试了解交互中有待改进的地方,要搞清楚为什么出错,而不仅仅是知道错了。可以在测试中收集过程数据——定量的去观察发生了什么问题以及为什么会这样。
    • 评估交互的整体质量
    • 根据一定的衡量指标,通过测试评估交互的水平,比如用户在某个交互任务上耗费的时间,任务是否成功,出错情况等等。也可对两个以上的可选设计针对确定的性能需求进行比较性评测。

(2)准备测试环境
(3)准备测试设备
(4)确定测试过程中的各种角色分配


2.测试执行的六个阶段

  • 为了有效地进行可用性测试,需要正确设计、准备和执行试验。一个测试执行过程一般要经过一些步骤。


3.可用性测试的评价 

(1)通过搜集一些客观、量化的数据进行性能评价 

    • 完成特定任务的时间
    • 在给定时间内完成的任务数目
    • 发生的错误数目  
    • 成功交互与失败交互的比率
    • 恢复错误交互所消耗的时间
    • 使用命令或其他特定交互特征(如快捷键)的数量
    • 测试完毕后用户还能记住的特定交互特征的数量
    • 使用帮助系统的频度
    • 使用帮助的时间
    • 用户对交互的正面评价与负面评价的比率
    • 用户偏离实际任务的次数         

                                                                                                                                                                                                           (2)如果要比较两个可选的交互设计,即对两个交互界面A和B根据某一准则做一个客观的测试,决定那个更好,可以采用如下方法:

    • 选择两个同等规模的测试用户群
    • 将用户随机分配到两个组中
    • 在每个组内执行同样的任务
    • 规定第一组只使用系统A,第二组只使用系统B,分别进行测试


(3)统计分析

  • 使用统计学原理和手段对得到的测试数据进行进一步的统计分析。比如使用统计学中的假设检验,判断系统A与B有没有统计意义上的明显差别。使用统计学中的点估计、平均值等指标评价差别的大小,对结果的准确性进行判断等。

 

问卷调查(Questionnaire)


优点:

  • 问卷法节省时间、经费和人力,这是为什么经常采用问卷法的原因。
  • 问卷法调查结果容易量化
  • 问卷调查是一种结构化的调查,其调查问题的表达形式、提问的顺序、答案的方式与方法都是固定的,而且是一种文字交流方式,因此,任何个人,无论是研究者,还是调查员都不可能把主观偏见代入调查研究之中。其调查的统计结果一般都能被量化出来。
  • 由于问卷调查结果便于统计处理与分析。现在有大量的相关统计分析软件可以帮助我们进行数据分析,有些甚至能直接帮助我们设计问卷。方便实施和分析。也方便进行数据挖掘。
  • 现在的电子问卷克服了纸质问卷的一些缺点,方便实施与调整。虽然他不可能取代面对面的问卷调查,但由于成本更低,更容易及时调整问卷设计上的不足,越来越多的问卷采用电子问卷的形式,可以通过网站,e-mail进行发布与回收。数据直接使用数据库记录,方便筛选与分析。
  • 问卷调查法可以进行大规模的调查。无论研究者是否参与了调查,或者参与的多少,都可以从问卷上了解被访者的基本态度与行为。这种方式是其他任何方法也不可能做到的,而且问卷调查可以周期的进行而不受调查研究人员变更的影响,可以跟踪某些问题用户的变化。

缺点

  • 面向设计的问题问卷调查比较难
    面向未来的调查(为设计进行的调查)很多时候需要了解用户的意图、动机和思维过程。问卷调查这类问题往往效果不佳,或者说问题设计比较难。而开放式的问题,回收质量、分析和统计等工作也会受影响。
  • 调查问卷设计难。
    调查问卷的主体内容设计的好坏,将直接影响整个专项调查的价值。问题的设计需要大量的经验,不同的人针对同一个问题,尤其是面向思维的问题,设计问卷差别可能会很大,信度和效度控制需要丰富经验。
  • 调查结果广而不深。
    问卷调查是一种用文字进行对话的方法,如果问题太多,被访者会产生厌烦情绪,因此,一般的问卷都比较简短,也就不可能深入探讨某一问题及其原因;
  • 问卷调查经常采用由用户自己填答问卷的方式,所以其调查结果的质量常常得不到保证
    因为在被访者填答问卷时,用户的调查过程我们很难得知,是我们需要调查的真实用户吗?(经常有人冒充用户参与调查,目的是为了获得参与调查的回报与奖励)用户当时的情绪状况是怎么样的?是否有其他人影响用户的回答?是否是同别人商量进行填答?用户是否是随意填写问卷的?得到的结果是用户的真实情况?研究者并不知道,所以有人说过:“问卷调查法所得资料的信度与效度问题一直是困扰问卷法的‘幽灵’”。
  • 问卷调查的回收率难以保证。
    问卷调查必须保证有一定的回收率,否则资料的代表性就会受到影响,回收率受问卷长度,问题难易程度,是否涉及隐私,参与调查获得回报多少等因素相关。另外,网络调查的回收率一般都不高,质量也难以保证。

问卷调查的执行过程

  1. 用户要求分析:设定软件的质量目标,准确描述质量目标,通过用户调查,了解用户在使用方面的切实感受。可以定义一些通用的可用性质量因素
  2. 问卷设计:根据用户需求分析进行问卷的设计,需要遵循这样的原则:从用户的角度出发,问题要精确、概括,避免二义性;可以采用的问卷类型包括事实陈述、用户填写意见、用户对事物的态度等;问题形式可以采用单项选择,多项选择(选择所有适用选项)、李克特量表(Likert scales)、开放式问答题等形式
  3. 问卷实施及结果分析:采用抽样调查、针对性调查、广泛调查(附带收集用户信息并进行分类)等方式,其实施可以采用发放调查表、电子邮件、网页等方式。结果分析主要是对调查收集到的数据运用统计方法进行分析、归纳,得到有用的信息

问卷分析

  • 选择题:统计不同选项所占的百分比
  • 李克特量表(Likert scales):统计每个问题的平均得分和标准差等
  • 开放式问题:对答案进行归纳,分类和总结

 

 

以上内容百分之九十不是我写的,都来自一个课件,详见文末参考资料。

可用性评估的五种方法已经介绍完毕。其实应该根据软件的特性和目标对象,销售市场来决定对软件的可用性评估的具体方法。各种方法各有优缺点,我们所要做的就是因地制宜巧用各种方法,也可采用多种方法相结合以得到更好的评估结果。

 

参考资料:
其实本文的大部分资料来自:
http://wenku.baidu.com/view/ab600322192e45361066f54d.html
上的“主讲:刘婷婷 - 人机交互界面设计”PPT文档。(我实在找不到具体最终的来源)
这个人机交互界面设计的PPT做得非常不错,推荐。

可用性工程的可用性评估 - 专家评估

以前的文章提到过,可用性评估大概有以下五种:

  • 用户模型(User Model
  • 启发式评估 (Heuristic Evaluation)
  • 认知性遍历 (Cognitive Walkthrough)
  • 用户测试 (User Testing)
  • 用户问卷调查 (Questionnaire)

大体上分为三类:也就是所谓的理论评估、用户评估和专家评估

今天继续介绍可用性工程的可用性评估 - 专家评估部分。

其实我对专家评审法这种用户不参与的方法挺有兴趣的。所谓的专家评审法大略有以下两种方法:

  1. 启发式评估(Heuristic Evaluation):可用性专业人员根据已有的可用性原则,对界面进行逐一评估。
  2. 认知性遍历(Cognitive Walkthrough):可用性专业人员将自己“扮演”成为用户,通过一定的任务对界面进行检查评估。

具体地说,专家评估就是由评估者(人因专家)以一种可以称为结构化的方式使用系统,测试是否符合预先定义的准则。评估结果反映了评估者的主观看法。这种评估方式主要是系统一致性的评估,即将系统和已建立的人因标准、规则(guideline)或原则(principle)进行比较。

专家评估快速并且便宜,但其缺点是,虽然专家是根据情况(用户水平、群体习惯等)作出判断,但专家关于任务的知识很少,难以从用户的立场看问题,且各人倾向会影响判断。以上的文字来自网络,无法判断最初来源。

 

启发式评估(Heuristic Evaluation)

启发式评估法就是使用一套相对简单、通用、有启发性的可用性原则(即“启发”)来进行可用性评估。具体方法是,专家使用一组称为“启发式原则”的可用性规则做为指导,评价用户界面元素(如对话框,菜单,在线帮助等)是否符合这些原则。

虽然任何人都可以充当评审人员的角色,有试验表明,选用既具有可用性知识又具有和被系统相关专业知识的“双重专家”是最有效的,这样的双重专家比只用可用性知识的专家平局多发现大约20%的可用性问题。每一个评审人员在1~2各小时的评估后都应该提供一个独立的报告,将各独立的报告综合以后就得到最后的报告。在报告中应该包括可用性问题的描述,问题的严重性,改进的建议。

可用性启发的原则又有哪些呢?

可用性启发原则

  1. · 系统状态可见性
  2. · 系统与用户现实世界相互匹配
  3. · 用户控制权与自主权
  4. · 一致性与标准化
  5. · 错误预防
  6. · 识别而非回记忆
  7. · 使用的灵活性与有效性
  8. · 美观而精炼的设计
  9. · 帮助和文档

接下来细细讨论这些原则:

系统状态的可视性

  • 在适当的时候应提供适当的反馈,以便用户随时掌握系统的运行状态
  • 系统的反馈形式可以分为两类:
    • 一类是非文字反馈,另一类是文字反馈
    • 非文字反馈是指系统通过改变人机界面元素的外观或显示暂时的元素,让用户知道他们行动的结果
    • 文字反馈指的是系统根据用户的行动而产生的文字信息
  • 根据反馈显示时间的长短,可以分为非持久反馈和持久反馈。
  • 非持久反馈只与某一个动作有关,在动作完成后,反馈也应被取消。
  • 一些非常重要的反馈则应该成为界面的一部分,持久显示

系统应与用户真实世界相符合

  • 使用用户语言,也就是使用用户熟悉的词汇、惯用语和概念,而不是面向系统的术语。系统还应符合真实世界中的习惯,信息应该按一个自然、合理的顺序出现
  • 其实不仅仅使词语和概念,非语言性的信息同样重要,例如图标、工作的流程等也要符合用户在真实世界的使用习惯

用户的控制权及自主权

  • 提供标记醒目的“紧急出口”,便于用户退出异常状况
  • 与此相关的可用性问题的例子:
    • 在不可逆转的行动之前系统没有提供足够警告
    • 系统没有在适当的实际提供取消的功能
    • 系统的取消功能不明显或是很难找到
    • 系统不支持撤销的功能

一致性和标准化

  • 避免用户无法确定不同的词汇(或情景、动作)是否具有相同含义的情形。
  • 一致性包括两个方面:
  • 内部一致性和外部一致性。
    • 内部一致性指的事系统的各部分之间要保持一致
    • 外部一致性是指系统应该和其他系统、传统习惯及标准保持一致,也就是标准性

帮助用户识别、诊断和修复错误

  • 使用简明的语言,描述问题的本质并推荐解决方法
  • 系统信息应该礼貌,不应该将错误归咎于用户。如“非法命令”或“非法用户名或密码”
  • 在设计错误信息时,另一个常见的策略是先为用户提供一个短的信息,如果这个信息不能满足用户的需要,他们可以用一个按键或链接找到更详细的帮助信息。短的错误信息用来处理比较常见的情况,读起来简单一些,并且可以在大多数情况下帮助用户解决问题。

预防错误

  • 应尽可能预防错误的发生
  • 基于知识的行为和学习是没有区别的,这常常发生在人们刚刚开始使用一个新的系统的时候。在这个层次的行为中,错误主要是由于用户对系统理解的差错引起的。为了防止错误,应该为用户提供正确的帮助信息,帮助他们在解决问题的过程中建立对系统的正确理解
  • 基于规则的行为层次,用户根据记忆中已经形成的规则来处理所接受到的信息。错误常常是因为忽略了重要的步骤,或是使用了错误规则来处理问题。在这个行为层次里,防止错误最有效的方法就是提供明确的文字提示,或是非语言的暗示(如鼠标的变化)
  • 基于技巧的行为层次,用户的行为是一种近乎机械的行为,他们可以不断地对接受到的信号进行条件反射式的处理。错误常常是与用户的知觉及运动技能有关。系统提供的信息应该能清晰地从背景中分辨出来,防止用户错误。在必要时,还应该使用户的行为提升到基于规则的行为层次,用正确的规则处理问题

识别而非记忆

  • 使得对象、动作和选项清晰可见。用户应该不需要在系统的一个部分记忆一些信息,才能使用系统的另一个部分,系统的使用说明应该在需要时容易找到,并清晰可见。

使用的灵活性及有效性

  • 提供一些新用户不可见的快捷键,以便有经验的用户快速执行任务
  • 相关可用性问题的例子:
    • 系统缺少自动化,没有自动地执行下面地任务,例如,一个新的视窗打开时,视窗的大小不合适,用户不得不自己改变视窗的大小
    • 系统没有提供应有的默认值
    • 默认值不正确
    • 使用系统需要太多的控制动作
    • 系统没有提供捷径,如:没有定义必要的功能键

最小化设计

  • 用户界面应美观、精练,不应该包括不相关或不常用的信息。任何多余的信息都会影响哪些真正相关的信息,从而降低他们的可见性
  • 从视觉角度来说,界面上如果有几个元素距离比较接近,或是被先或线框所包围,或是一起移动、变化,或是在形状、颜色、大小、字体上比较相似,人们会认为他们是同一个部分或同属于一组。界面设计中正确地应用这个原则可以起到简化的效果,如果使用不当,则会引起用户理解上的混乱。
  • 人体工程学告诉我们,人的注意资源是有限的,过多的信息不但会使新用户迷惑,也会让熟练用户慢下来。当人的心理活动指向和集中于某一对象时,该对象即成为人的注意中心,它所提供的信息,将得到大脑最有效的加工。处于注意边缘的事物,虽位人所仪式,但大脑反映得模糊不清。而处于注意范围之外的事物,则完全不为人所仪式。所以,人机交互时,人不可能把界面上的所有元素全部接受并产生意识,当用户只能注意某一方面的信息时,就不能注意其他方面的信息。
  • 因为用户注意资源的有限性,界面的设计不但要引导用户合理地使用他们的注意资源,也应该保持界面提供的信息精练简介,在界面上突出某一个元素的方法很多,如使用和背景或其他元素不同的颜色,使用粗体字或大一些的字号,放在页面左上角的信息比右下角的信息得到更多的注意

帮助及文档

  • 提供易于检索、便于用户逐步学习的帮助信息
  • 实验表明,用户使用联机帮助比使用用户手册找到相关信息的时间要短。
  • 相关可用性问题的例子
    • 帮助信息或用户手册不存在
    • 帮助信息没有意义或使用户更加迷惑

 

 

认知性遍历(Cognitive Walkthrough)

在认知性遍历中,专家测评者从一个说明书或早期的原型出发勾践任务场景,然后让用户使用此界面完成任务,即“遍历”界面。用户(称为典型用户)就像使用真正的界面那样对界面进行遍历,使用它们来完成任务。仔细观察用户使用界面的每一步骤,如果界面中存在妨碍用户完成任务的地方,就表明界面中缺少某些必要的内容;完成任务的功能顺序如果繁杂反复,就表明界面需要新的功能以简化任务并修改功能的顺序。

进行认知性遍历活动,需要以下四个条件

  1. 对系统原型的详尽描述,这种描述不一定是完整的,但要相当详尽。诸如菜单的位置描述或措辞选择等这样的细节也可能导致相当大的差异。
  2. 对用户在系统中要完成任务的描述,该任务应当是大多数用户将要执行的有代表性的任务。
  3. 一个完整的、书面的操作清单,列出使用给定原型完成任务所需执行的操作。
  4. 确定用户的身份,以及评估人员能够确定这些用户已具有哪一类别的知识和经验。

 

认知性遍历认为用户完成一个任务的过程有三步:

  1. 用户在交互界面上寻找能帮助完成任务的行动方案。
  2. 用户选择并采用看起来最能帮助完成任务的行动。
  3. 用户评估系统作出的反馈,判断在完成任务上的进展。

 

评审人员可以对用户的每个交互过程模拟这三个步骤去评价,并以回答下列三个问题为基础:

  1. 界面上执行正确动作的控件(按钮、菜单、选项等)是否可见?
  2. 用户是否知道正确动作可以到达希望的结果?
  3. 根据系统对动作的反馈信息,用户是否能够知道他的动作是否正确?

比如用户去一家网上书店买一本数,第一个任务是找到这本书,用户要知道如何找到这本书。这时网站上的图书分类和查询系统可能会暗示用户如何完成交互。用户可以尝试从网站的图书分类里寻找,并根据具体的分类一步步地接近要找地那本书,这时候就要记录下用户是否能够方便地使用网站的分类系统;用户也可以使用网站的查询系统,并长时使用查询规则,系统是否支持方便的查询,以及在查询过程中及时地反馈信息都会影响用户交互任务的完成。

认知性遍历评估过程中记录的信息非常重要,每一个否定的回答都表示存在一个潜在的可用性问题,可以用于知道改进交互设计。

 

以上内容百分之九十不是我写的,都来自一个课件,详见文末参考资料。

我比较注意的是“专家评估快速并且便宜”这句话,对于我而言,快速并且便宜的评估最能实现最大的价值。如果一个进行比较小的软件的可用性评估,我个人也比较倾向使用专家评估法。如果能注意使用启发式评估法的各个要点,并进行详细分析,就可以发现很多的问题,根据我自身的经验,我们可以取得提高软件的可用性立竿见影的效果。认知性遍历方法需要有一定经验的人员对软件可用性进行评估,这对评估人员的经验和能力要求比较高。如果能够结合“认知性遍历”和“启发式评估”这两种方法定能发现软件的可用性的缺陷并提高软件的可用性。

 

参考资料:

其实本文的大部分资料来自:

http://wenku.baidu.com/view/ab600322192e45361066f54d.html

上的“主讲:刘婷婷 - 人机交互界面设计”PPT文档。(我实在找不到具体最终的来源)

这个人机交互界面设计的PPT做得非常不错,推荐。

2010年5月7日星期五

可用性评估 - 理论评估

如果自己无所事事的时候,与其在在网上乱逛,还不如写一篇博客。最近写文章的频率明显提高就是因为最近无所事事的时间很多。
Hanyi on ET 软件可用性工程系列文章:

  1. 软件的可用性测试(usability testing) 要点总结(上)
  2. 软件的可用性测试(usability testing) 要点总结(下)
  3. 可用性测试问卷的一个简单示例
  4. 软件可用性概述

前几天我在UPB图书馆闲逛,一般来说我到图书馆总是有目的,到图书馆这么冷门的地方闲逛,真不是我这种人的风格,在无意中发现了Jakob Nielsen的大作Usability Engineering,而且这本1993年出版的书放在图书馆十几年几乎是还是全新的,看来没有什么人借过这本书。要谈可用性,Jakob Nielsen还是要介绍一下的,这个丹麦人号称是"the king of usability",他拥有大概79个美国的专利,当然都在可用性领域啦。在这里http://www.useit.com/jakob/有关于他的介绍。

关于可用性的测试和评估,在国外现在已经形成一个新的专业,称为可用性工程(Usability Engineering)

在本系列的文章中已经提到了可用性测试的几种常用的方法:

用户模型法
用户调查法
专家评审法
用户测试法

注意以上是可用性测试的方法(Testing)。

这里来聊聊可用性评估(Evaluation),可用性评估是检验软件系统的可用性是否达到了用户的要求。如同本系列的文章中已经提到的我们的目的就是要满足“用户为核心”的设计原则。也就是以让用户爽为最高原则。当然啦,提高软件的可用性还有一些其他的好处例如降低系统技术支持的费用,缩短最终用户训练时间。更有效地利用计算机系统资源等等。

对于一个软件的可用性的评估(Evaluation)方法有那些呢?
根据我Google而来的结果,可用性评估大概有以下五种:
用户模型(User Model)
启发式评估 (Heuristic Evaluation)
认知性遍历 (Cognitive Walkthrough)
用户测试 (User Testing)
用户问卷调查 (Questionnaire)

其实评估方法有很多,但是大体上分为三类:也就是所谓的理论评估、用户评估和专家评估区分标准在于数据来源

理论评估一般是由设计者或评估者根据某种形式化方法计算任务或用户模型与系统描述的匹配情况,这种方法可以给出定量的结果
这篇文章先谈谈理论评估里的用户模型法。
用户模型法是用数学模型来模拟人机交互的过程。这种方法把人机交互的过程看做是解决问题的过程。认为人使用软件系统是有目标的,而一个大的目标可以被细分为许多小的目标。
在人机交互领域中最著名的预测模型是GOMS模型(1983年由Card, Morgan和Newell 提出在交互系统中用来分析建立用户行为的模型。它采用“分而治之”的思想,将一个任务进行多层次的细化。),GOMS 是描述任务和用户执行该任务所需知识的方法,通过目标 (Goal)、操作符 (Operator)、方法 (Method) 以及选择规则 (Selection rule) 四个方面进行描述。(也可以说GOMS模型假设通过方法和选择性规则,形成一些目标和子目标。)
这个GOMS其实在计算机系统的评估方面也有广泛的应用。据说GOMS是人机交互研究领域内少有的几个广为人知的模型之一,并被称为最成熟的工程典范。

详细地说,在GOMS中:
1.目标 Goals
目标就是用户执行任务最终想要得到的结果,它可以在不同的层次中进行定义。
2. 操作 Operators
操作是任务分析到最低层时的行为,是用户为了完成任务所必须执行的基本动作。
3. 方法 Methods
方法是描述如何完成目标的过程。一个方法本质上来说是内部的算法,用来确定子目标序列及完成目标所需要的操作。
4.选择 Selection
选择是用户要遵守的判定规则,以确定在特定环境下所要使用的方法。
当有多个方法可供选择时,GOMS中并不认为这是一个随机的选择,而是尽量来预测会使用哪个方法,这需要根据特定用户、系统的状态、目标的细节来预测要选择哪种方法。

但是GOMS也是有很明显的缺点,它没有清楚的描述错误处理的过程,假设用户完全按一种正确的方式进行人机交互,因此只针对那些不犯任何错误的专家用户。GOMS对于任务之间的关系描述过于简单,只有顺序和选择。事实上任务之间的关系还有很多种,另外选择关系通过非形式化的附加规则描述,实现起来也比较困难。GOMS把所有的任务都看作是面向操作目标的,而忽略了一些任务所要解决的问题本质以及用户间的个体差异,它的建立不是基于现有的认知心理学,无法代表真正的认知过程。  

你或许还有兴趣知道,还有一些用于创建和分析GOMS模型的工具,例如:

GOMSED (Goms-Editor - in german),德国达姆工大GOMSED工具
QGoms (Quick-Goms)
CogTool KLM-based modelling tool

洋洋洒洒一大堆,以上百分之九十不是我写的,都来自一个课件,详见文末参考资料。

用户模型法这个理论评估的方法可以给出定量的结果,但它的假设条件太多,离真正应用还有一段距离。换句话来说就是有点用想当然的方式去探索,然后得出所谓的评估结果。如何建好一个好的预测模型例如GOMS模型,是用户模型法的一个难点。为什么很困难呢,这里举一个例子。譬如我们做数学建模用计算机进行模拟,我们常常必须人为给定各种约束,以避免np hard 问题。但是这些约束常常是以一些经验为前提,和一些不确定的假设。然而如果约束本身就有问题会导致错误的结果。
但是使用用户模型法(理论评估的方法)相对快速并且便宜,如果有一个非常好的模型,和一个相对较好的建模方式,那么用这种方法进行评估还是相当有价值。

参考资料:
其实本文的大部分资料来自:
http://wenku.baidu.com/view/ab600322192e45361066f54d.html
上的“主讲:刘婷婷 - 人机交互界面设计”PPT文档。(我实在找不到具体最终的来源)
这个人机交互界面设计的PPT做得非常不错,推荐。

http://en.wikipedia.org/wiki/GOMS 

http://www1.tu-darmstadt.de/fb/fb3/psy/kogpsy/indexgoms.htm

2010年5月2日星期日

软件的可用性测试概述

今天继续软件可用性测试的系列文章,先前的文章很不完整,可能会让人看得一头雾水,今天将比较完整地从可用性测试的定义延伸,然后谈谈可用性过程(Usability process)以及可用性测试的方法,以下文字大多来自期刊文献的拼凑,具体内容,请参阅本文后的参考文献。

Hanyi on ET 软件可用性测试系列文章:

  1. 软件的可用性测试(usability testing) 要点总结(上)
  2. 软件的可用性测试(usability testing) 要点总结(下)
  3. 可用性测试问卷的一个简单示例
 

软件的可用性定义小结:

软件的可用性定义[引用1]:
ISO 9241-11 (ISO 1993c)的原话:"The effectiveness, efficiency and satisfaction with which specified users achieve specified goals in particular environments".
ISO 9241-11国际标准对可用性定义如下:产品在特定使用环境下为特定用户用于特定用途时所具有的有效性(effectiveness)、效率(efficiency)和用户主观满意度(satisfaction)。其中,有效性是指用户完成特定任务和达到特定目标时所具有的正确和完整程度;效率是指用户完成任务的正确和完整程度与所使用资源(如时间)之间的比率;满意度就是用户在使用产品过程中所感受到的主观满意和接受程度。从人的角度来看软件系统是否易用,高效,使人满意。
下图清晰地表明了可用性各个关键元素的关系:

quality_of_use_usebiltytest_hanyionet 

可用性工程的好处
对产品开发厂商来说,可以减少后期维护,降低开发成本,缩短工期,提高用户接受度,增强产品竞争力,提高企业信誉度。 对用户和使用单位来说,可以提高用户生产效率,减少培训和技术支持费用,提高用户工作的舒适满意程度,提高系统建设投资效益和使用效益。

可用性测试的时机
尽早做,经常做。问题越早发现和弥补,所造成的损失就越低。

ISO 9241: 9241是关于办公室环境下交互式计算机系统的人类工效学国际标准,它由17个部分组成,根据人类工效学和可用性原理,分别对各种硬件交互设备属性和软件用户界面设计问题作了详细的规定和建议。可以对一个产品设计符合该标准的程度进行评估和认证。

 

可用性过程(Usability process):

可用性过程帮助用户交互设计师在回答这些问题分析阶段的设计和支持在设计阶段(见下图[引用2])。可用性的方法有很多,所有的方法基本上基于同样的可用性过程,所以我们有一个从不同的方法中而来的通用的可用性过程抽象[引用2]。下图已经很清晰了表明了可用性过程的各个阶段以及具体操作,具体过程的步骤的分析请看[引用2]

The_usabilty_testing_process_hanyionet

 

可用性测试的方法[引用3]

可以分为四类,用户模型法用户调查法,专家评审法和用户测试法[引用3]

用户模型法是用数学模型来模拟人机交互的过程。这种方法把人机交互的过程看作是解决问题的过程。它认为人使用软件系统是有目的的。而一个大的目的可以被细分为许多小的目的。这了完成每个小的目的,又有不同的动作和方法可供选择,每一个细小的过程都可以计算完成的时间。这个模型就可以用来预测用户完成任务的时间了。这个方法特别适合于无法进行用户测试的情形。在人机交互领域中最著名的预测模型是GOMS(Goals, Operators, Methods, Selections)模型。[引用3]

用户调查法包括问卷调查法访谈法。这两种方法是社会科学研究,市场研究和人机交互学中沿用已久的技术,适用于快速评估,可用性测试和实地研究,以了解事实,行为,信仰和看法。访谈与普通对话的相似程度取决于待了解的问题和访谈和类型。访谈有4种主要类型:开放开(或非结构化)访谈,结构化访谈,半结构化采谈和集体访谈.具体就采用何种访谈技术取决于评估目标,待解决的问题和选用的评估范型。例如,如果目标是大致了解用户对新设计构思(如交互设计)的反映,那么非正式的开放式访谈通常是最好的选择。但如果目标是搜集关于特定特征(如新型WEB浏览器的布局)的反馈,那么,结构化的访谈调查通常更为适合,因为,它的目标和问题更为具体。调查问卷是用于收集统计数据和用户意见的常用方法,它与访谈有些相似,也是用来了解用户的满意度和遇到的问题。问卷需要认真的设计。可以是开放式的问题,也可以是封闭的问题,但必须措辞明确,避免可能的误导问题,保证所收集的数据有高的可信度。在学术论文中常见的可用性问卷包括:用户交互满意度问卷(questionnaire for user interaction satisfaction, QUIS),软件可用性测量目录(software usability measurement inventory, SUMI)计算机系统可用性问卷(computer system usability questionnaire, CSUQ). [引用3]

专家评审法分为启发式评估走查法。启发式评估是由Jakob Nielsen和他的同事们开发的非正式可用性检查技术,使用一套相对简单,通用,有启发性的可用性原则来进行可用性评估。具体方法是,专家使用一组称为“启发式原则”的可用性规则作为指导,评定用户界面元素(如对话框,菜单,在线帮助等)是否符合这些原则。在进行启发式评估时,专家采取“角色扮演”的方法,模拟典型用户使用产品的情形,从中找出潜在的问题。参与评估的专家数目可以不同。由于启发式评估不需要用户参与,也不需要特殊设备,所以它的成本相对较低,而且较为快捷,因此也称为“经济评估法”。[引用3]
走查法包括认知走查和协作走查,是从用户学习使用系统的角度来评估系统的可用性的。这种方法主要用来发现新用户使用系统时可能遇到的问题,尤其适用于没有任何用户培训和系统。走查就是逐步检查使用系统执行的过程,从中找出可用性问题。走查的重点非常明确,适合于评估系统的一小部分。[引用3]

用户测试法:可用性既然是评价软件质量的标准,而且是从用户的角度出发,评价起来当然少不了用户的参与,在所有的可用性评估法中,最有效的就是用户测试法了。该方法是在测试中,让真正的用户使用软件系统,而测试人员在旁边观察,记录,测量。因此,用户测试法最能反映用户的要求和需要的。根据测试的地点不同,用户测试可分为实验室测试和现场测试。实验室测试是在可用性实验室里进行的,而现场测试则是由可用性测试人员到用户的实际使用现场进行观察和测试。根据试验设计的方法不同,用户测试以可分为有控制条件的统计试验和非正式的可用性观察测试。这两种试验方法在某些情况下也可以混合使用,所以经常被笼统的称为可用性试验。可用性的实验就是在产品实际应用的环境之外,就特定的环境、条件、使用者进行测试,藉以记录系统的表现,更能对特定的因果关系进行验证,得到量化的数据。

用户测试常用的方法包括实验室的实验、焦点团体讨论(Focus Group Discussion)及发声思考(Thinking Aloud)。焦点团体讨论是一般市场营销研究常用的手段。邀请一群使用者,一般五至八人一起就几个焦点问题进行讨论,由一位主持人掌控讨论的方向,围绕着预定的题目进行,让参与者都能畅所欲言并热烈讨论。不过若针对软件进行讨论,必须要考虑系统的规模与使用的体验,对企业的软件来说,一次的讨论绝对不够,必须要进行一系列的讨论与评价。[引用3]
发声思考法是心理学研究所用的研究方法,在国外被人机交互或可用性的研究者用来评估软件的使用。发声思考法要求受测者使用指定的系统,边用边说话,说出使用之时心中想的一切,包括困难、问题、感觉等。这个方法能从每位受测者的评价过程中收集到相当大的信息,而所需邀请的受测者也不多,在国外的相关业界可说是标准的软件使用质量评价方法。[引用3]

参考文献:
[引用1]
:N. Baven, M. Macleod , “Usability measurement in context,” Behavior and Information Technology, 13, 1994, pp. 132-145.
[引用2]:Xavier Ferre;, Natalia Juristo, Helmut Windl, Larry Constantine, "Usability Basics for Software Developers," IEEE Software, pp. 22-29, January/February, 2001
[引用3]:吴鹏越,佟秋利,杜炤。软件系统可用性评估综述,清华大学计算机科学与技术系,清华大学计算机与信息管理中心。

2010年5月1日星期六

可用性测试问卷的一个简单示例

Hanyi on ET 今天继续趁热打铁,今天提供应用程序的可用性测试问卷的一个简单示例。这是我的“可用性测试系列”的第三部分,如果有兴趣可以阅读前两部分:

软件的可用性测试(usability testing) 要点总结(上)

软件的可用性测试(usability testing) 要点总结(下)

 

请填写此问卷

我们的软件开发团队非常感谢你志愿参加这次可用性测试占用你宝贵的时间。您的参与对我们软件的应用的开发十分重要。我们希望,参加这次可用性测试是一个有趣和愉快的经历!

问题 1

你觉得成功地完成了任务表上的所有任务?

是的           没有

问题 2

与其他我使用过的软件相比,我发现该软件的应用原型是:

很难使用1 … 2 … 3 … 4 … 5 … 6 非常容易使用

问题 3

作为一个观察者,我发现该软件的应用原型是:

很难使用1 … 2 … 3 … 4 … 5 … 6 非常容易使用

问题 4

软件的目录是设置非常合理,并且功能很容易找到。

强烈反对 1 … 2 … 3 … 4 … 5 … 6 非常同意

问题 5

我立刻明白了每个菜单项的功能。

强烈反对 1 … 2 … 3 … 4 … 5 … 6 非常同意

问题 6

我所期待的功能在目录中都可以找到相对应的。

强烈反对 1 … 2 … 3 … 4 … 5 … 6 非常同意

问题 7

该应用的按钮都设置组织良好,易于查找。

强烈反对 1 … 2 … 3 … 4 … 5 … 6 非常同意

问题 8

我立刻明白每个按钮的功能。

强烈反对 1 … 2 … 3 … 4 … 5 … 6 非常同意

问题 9

我所期待的功能在按钮栏中都可以找到相对应的。

强烈反对 1 … 2 … 3 … 4 … 5 … 6 非常同意

问题 10

我发现该软件应用的导航的使用是:

非常困难 1 … 2 … 3 … 4 … 5 … 6 非常容易

问题 11

我对这个软件应用的总体印象是:

非常负面的 1 … 2 … 3 … 4 … 5 … 6 非常正面的

问题 12

你是否感兴趣参加开发团队今后的其他可用性测试?

 

姓名:

E-mail:

日期:

附加评论



参考及延伸阅读:

Sample Application Usability Test Questionnaire

http://it.toolbox.com/blogs/enterprise-solutions/sample-application-usability-test-questionnaire-17827

Sample Usability Test Plan

http://it.toolbox.com/blogs/enterprise-solutions/sample-usability-test-plan-17826

Sample Website Usability Questionnaire

http://it.toolbox.com/blogs/enterprise-solutions/sample-website-usability-questionnaire-17825

Practical Usability Testing

http://www.digital-web.com/articles/practical_usability_testing/

(完)

如何进行软件的可用性测试(usability testing) 要点总结(下)

继续简要介绍可用性测试的要点:

[6]
筹备工作

安装硬/软件
- 运行安装配置

写出指示和关于任务的描述
  任务是否可以进行?
  需要多少工作时间来解决?

写问卷
  是否所有问题可以被回答和被负责?
  是否遗失重要的问题?

通知,并邀请用户和观察员
  确保所有的人已经做好准备

代表职责
  摄像机,登入,帮助,观察...

测试测试的设置
  运行一个预测试!

[7]
重要方面

至少有一位观察员拥有工具使用知识
  主要的工作是熟悉交互系统/工具/产品

至少有一位观察员要有相关领域的知识
  必须努力去熟悉任务域

批评事件的尺度
- 如果你对用户的行为感到惊讶
- 如果用户意气用事
- 观察员之间的差异

了解用户的意图
  想想,对视频的抗拒

[8]
询问和问卷调查

主观印象
- 你喜欢什么?
- 你怎么不喜欢?
- 是缺少什么?
- 是有些东西多余?
- 你会怎么变化?

主观评价
单极:
1 =好,2 =好,3 =最好
两极:
-2 =太差,-1 =坏,...,2 =非常好

决定一个标准值
  例如,平均比1,5更好

留空间给意见补充

[9]
一个典型的测试时间表

每个情况2到2.5小时

5个最终用户/测试者

额外的可用性测试的方法
- 设计的讨论
- 原型
- 检查
- 面向任务的模拟

观察员

设计者,开发者
- 对软件的变更负责

信息管理者
- 对手动更改负责

质量经理
- 对质量的保证负责

领域/工具专家
- 对帮助提示负责

最终用户
- 对任务的工具不对应负责

可用性工作人员1
- 对测试的设置负责

可用性工作人员2
- 对记录数据工作负责

[10]
观察室

录像机
'shadow'屏幕
登入软件
多个显示器
可用性测试的工作人应注意提供...

- 舒适的环境
- 较暗淡的光线
- 舒适的椅子
- 茶点
- 休息

测试室

应该看起来像一个正常的工作地点
+单向镜子
+摄像机,麦克风
[让测试者知道, 他将被观察!]

[11]
撰写报告

分析协议

关键事件的重要性
[1]必须立即修复
[2]必须在交付前修复
[3]应该在交付前修复
[4]应该在下一版本发表前修复
[5]应该在未来修复

定量数据分析
- 频率
- 均值加标准差

磁带的编辑
  视频序列与关键事件

参考文献:
Jakob Nielsen, Usability engineering. Academic, 1993

http://www.idemployee.id.tue.nl/g.w.m.rauterberg/publications/UE_Tutorial.pdf

(完)

2010年4月30日星期五

如何进行软件的可用性测试(usability testing) 要点总结(上)

最近在做一个小软件交付前的可用性测试,看了一些资料,在网上找到一个还不错的总结,这里我做一个简单的翻译,本篇文章比较长,希望对一些需要进行可用性测试的朋友有所帮助。

什么是软件的可用性测试(usability testing)?
一个用来记录和衡量一个交互系统的交互质量的方法。

[1]
实验室或现场测试:
运行测试...
  和真正的最终用户(即'测试者')
  使用代表性任务
  在一个'真实的'环境

进行记录/协议 ...
  所有重要事件
  用户和观察员的全部评论
  主观印象

控制/测量
  脑力负荷

[2]
形成性评价
  一个测试组(小于5)
  一个交互系统
  要求测试人员的意见
  目标:找到关键事件

总结性评价
  两个或多个测试人员小组(大于 12)
  测量测试人员的的计算机水平
  两个或两个以上的接口版本
  衡量脑力负荷
  询问测试人员的意见
  性能比较
  分析与应用统计数据
  目标:选择最好的系统

[3]
必要的组件

情景/任务
  选择适当的工作环境

真正的最终用户作为测试者
  选择所有目标群体
  [任务,性别,年龄,经验,等级,工作各部门,使用语言,...]

交互系统
  最小硬件/最大软件

观察员
  项目经理,设计师,软件开发人员,培训教员,额外的最终用户

数据记录
  音频/视频,日志文件,问卷调查

[4]
重要的制约

每个测试者的测试时间要小于2.5小时
  否则最终用户迅速变得很累!

只作重要功能的测试
  高频率的使用
  关键任务方面

只测试主要交互类型
  典型的使用,避免重复

测试完整的任务
  最终用户应该会成功!

社会心理方面
  不要责怪用户/测试者!

[5]
重要行动

测试者的简报
  “我们测试软件,而不是你!”
  “你可以随时取消测试!”
  - 解释测试环境
  - 如果要记录数据时要求用户的允许

记录数据/关键事件
  是否所有设备准备好了吗?
  视频中的日期/时间戳是否正确?
  协议中的日期/时间是否正确?

收集所有测试材料
  将所有的测试材料夹在一起,放入一个文件夹中

测试人员汇报情况
  给予时间让测试者提问,付给测试者工资,并感谢用户!

 

参考文献:
Jakob Nielsen, Usability engineering. Academic, 1993

http://www.idemployee.id.tue.nl/g.w.m.rauterberg/publications/UE_Tutorial.pdf

2010年4月27日星期二

VLC如何进行RTSP的支持(源码阅读心得)

今天天气很好,心情大好,Hanyionet和大家分享一下阅读VLC的源码的一些心得。

先小小吹捧和介绍一下VLC。
大家都知道VLC是一个免费,开放源码,跨平台媒体播放器,并集合先进的流媒体功能可以通过IPv4或IPv6的高带宽网络进行流媒体传输。它还支持多种视频格式和流协议。VLC的编解码基于著名的开源项目FFmpeg的libavcodec的开源库。VLC同时提供不同的接口(命令行,网络,图形用户界面,远程登录),以及提供流行的语言如C,C++,C#,Python,和Java可以使用的APIs,这使得VLC变得高度灵活,并且用于任何类型播放或流媒体处理。

VLC支持RTSP功能是通过使用liveMedia库,这个库是live555开源项目一部分。VLC支持RTSP协议,可用于在线或离线转码,视频点播服务和单播或组播流。除了这些以外,VLC还提供各种接口和API,VLC还允许被集成在一个更复杂的环境,可以让我们建立一个更先进的视频应用程序。

进入正题,VLC到底是如何进行RTSP的支持。

VLC对RTSP的支持的实现的方式是通过一种输出链(output chains)。VLC读取各种类型的视频输入(文件,流,DVD等),然后通过定义一个或多个输出链(output chains)的内容,然后用于播放流。一个链可以连接到另一个链条,然后就可以形成一个比较复杂的工作流程。下图为一个简单的例子说明。图中VLC设置并读取本地文件,然后转码,并通过使用两个链将数据传输到一个多播地址。链1将读取文件,然后转码。链2读取链1输出的转码文件,然后将流发送到至指定地址。整个过程类似UNIX管道的工作方式。

VLC RTSP example hanyionet

Enjoy!

2010年4月25日星期日

不要抱怨,不要过于计较

今天想写一篇短文,谈谈两种行为:抱怨和过分计较。过分计较和抱怨这两种行为和心态,几乎是共生的。请观察一下,那些喜欢抱怨的人往往就是平日在工作上最爱计较的人。

很多人都读过《不抱怨的世界》,谈不要抱怨,这本书说的比我好上万倍,这里就直接引书中几句,关于抱怨这个行为漂亮精确的分析。

《不抱怨的世界》作者认为:“抱怨就是自夸,没有人会喜欢爱吹牛的人。”

人们为什么会抱怨,书中谈到,“没有安全感、质疑自己的重要性、不确定自我价值的人,才会吹牛和抱怨。他们会昭告自己的成就,希望看到听者眼中投射出赞赏的目光。他们也会抱怨自己遭逢的困难,以博取同情;或是把它当作藉口,以逃避自己向往却没有完成的目标。他们会抱怨,其实是因为自觉不配得到他们想要的东西。他们缺乏自我肯定,于是便藉由抱怨,把自己想要的东西推开。”

所以不要抱怨吧,现在开始,请散播阳光和喜乐,这样会给自己的家庭和工作带来正面的影响力。

 

我主要来聊聊“过于计较”这种行为。

很多人在读研究所的时候总是过于计较自己是否做得过多事情,自己的时间是否被占用,计较自己是教授的免费劳动力。很多人总是斤斤计较自己的时间,计较着读完硕士的时间等等,我认为这只是和小学生一般的“读书升级”的幼稚心态,其实人生中的真正积累和收获不是因为一个硕士头衔而得到任何的变化。过于计较的人,以最小的代价获得最大的收获为傲,认为那些花很多时间去做对自己无用的人很笨,在我看来,那些爱计较的人才是一种真正的蠢蛋。

在上班时,过于计较的人总是喜欢进行比较,他们爱发表例如此类的言论:“我只是编程的我不是测试的,这些代码又不是我要维护”等等。他们做这些所谓“不是他们的事”的时候总是不甘不愿的,超级影响团队士气。遇到这种人,最好的方法就是把他踢出项目组,然后项目组的其他同仁一起加倍诚恳和努力把项目搞定。相信我....这绝对是最好的方法,我的痛苦经验就是和爱计较的人一起做了一个项目,他一个人搞得整个团队乌烟瘴气,士气全无,项目做得很痛苦,请想想我们玩过的三国志,如果一个部队士气全无,那么这个部队就几乎毫无战斗力。

过分计较的人是无法进行真正的积累的,知识和生活经验的积累往往从所谓的“困境”当中,或者是那些过分计较的人眼中的“做免费劳动力”的过程中。

不要过于计较自己的外在得失,要做的事情很简单就是花费心力将该做的事情做好。其实看事情要大方向,大格局地看事情,不要过于计较那一点的得失。曾经看过一篇文章,谈到“生命就是一种长期而持续的积累过程”。人生的“大格局”就是“一种长期而持续的积累过程”,我们所要坚持的大方向也就是“长期而持续的积累”,而不是不断地计较自己的外在得失。

最后给自己拍拍手,居然欢叽叽歪歪写一篇所谓的大道理的“自爽文”。

2010年4月18日星期日

FFmpeg和SDL的API

使用FFmpeg的API和SDL的API进行视频的解码和显示,似乎还是有点技术含量的东西,我最近收到一些email询问视频的解码和显示的实现,今天hanyionet就献上博文一篇简单地说明一下如何使用这些API,其实使用这些API其实一点都不难,不要被复杂描述吓到。我们所要做就是先要了解视频的解码和显示到底是怎样的一个过程,然后了解各个API的作用。


进行解码和视频的现实一般来说就是这样的步骤:
初始化-->解码-->图像缩放-->视频显示
以下是一个简单的过程流程图,在每一个步骤中给出一些比较重要的API。

Process flow of video decode module new

可以看出,不同的步骤的实现,就是找到并使用相对应的API。
图中的API的具体说明,今天一同给出。

FFmpeg API

描述

av_register_all()

Initializes libavformat and registers all the muxers, demuxers and protocols.

avcodec_find_decoder(…)

Finds a decoder with a matching codec ID.

avcodec_alloc_context()

Allocates an AVCodecContext and sets its fields to default values.

avcodec_alloc_frame()

Allocates an AVFrame and sets its fields to default values.

sws_getContext(…)

Returns an SwsContext to be used in sws_scale().

sws_scale(…)

Scales the data in source according to our settings in our SwsContext c. srcStride and dstStride are the source and destination linesize.

avcodec_decode_video(…)

Decodes a video frame from buffer into picture.

 

SDL API

描述

SDL_SetVideoMode()

Set up a video mode with the specified width, height, and bits-per-pixel.

SDL_CreateYUVOverlay()

It is used to create a YUV overlay of the specified width, height and format for the provided display.

SDL_BlitSurface()

This performs a fast blit from the source surface to the destination surface.

SDL_FreeSurface()

Frees (deletes) a SDL surface.

SDL_UpdateRect()

Makes sure the given area is updated on the given screen.

SDL_Flip()

It is used to swap screen buffers. On hardware that supports double-buffering, this function sets up a flip and returns.

SDL_FreeYUVOverlay()

Free a YUV video overlay.

其实要理解FFmpeg的API还有一个非常重要的地方就是理解,各种数据结构的具体内容,譬如AVFrame和AVCodecContext,个人认为这两个结构是比较重要的。
了解的这些API的使用方法后,现在应该做的就是找一个例子例如ffplay.c或者http://dranger.com/ffmpeg/里的例程,体会一下,最后使用这些API搭建出属于自己的视频播放程序。

Enjoy!