首先,HE和Think Aloud 都是两用可用性测试的方法,HE,也就是这个启发式评估可以在设计的早期阶段(比如草稿)就开始使用,并且不需要太多的其他步骤。而Think Aloud则更多建立在已经设计出来的原型系统上。需要更多的步骤。这两个各有利弊。互相协作。才能更好嘛,有些问题,HE可以发现,有些则只有Think Aloud可以发现。
1.Many Usability Aspects Identified in HE are Confirmed in Think-Aloud Usability Tests 许多可用性方面的问题可以在HE中识别。然后在Think Aloud测试中被确认。
2.When HE Predictions are not Confirmed by Think-Aloud Usability Tests 当HE预测了问题但是Think Aloud中,并没有发现。这种情况下。请相信Think Aloud测试。因为用户是王道。数据比预测更准确。
3.“False Alarms” vs. True Problems 假警告vs真问题,这个举个例子,在对话框中,有三个按钮。OK ,Apply和Cancel ,虽然HE规则预测了这个迷惑性。但是进行Think Aloud测试的时候,并没有这个问题,原因是用户就没想过这个事,他只按ok,但这并不能避免问题,或者说似乎这个问题并不是个问题,还有一种情况,比如HE规则中的文档帮助的问题,可能用户在测试的时候就没打开文档。这就需要HE来评估了。所以,这种情况下,还是应该好好分析一下HE给出的评估来改进系统。
4.Think-Aloud Usability Tests Can Show Things HEs Can’t Show Think Aloud测试可以展示HE没有发现的问题。
HE规则因为是建立在早期草稿原型上的。并不是真实情况,他只是在早期给出设计上的问题,他不能预测真实系统的问题,比如程序运行速度非常慢,以至于用户难以忍受。这就需要Think Aloud才能发现了。
基本上SSD4就讲了这么些东西了。四篇文章四点写到7点。。基本上算是写完了。工科男求安慰。。
Think-Aloud 可用性测试介绍
中文是指出声思考:出声思考。可用性测试中常用也很有用的一个数据收集方法,来改善产品。要求被测试者把在测试过程中即时的把自己的想法大声说出来。比如,你说我不知道干什么,这个好像有点问题,等等。然后有人来记录。
SSD4给出的具体步骤翻译添加解释如下:
Define the study’s framework, 定义该测试报告的框架。比如系统准备解决什么问题,适合什么类型的用户,希望评估首次使用还是其他什么,希望最终的目标是什么,比如希望90%的用户可以初次顺利使用。 Choose what to observe, 选择打算观察测试者的什么行为,比如用户如何打开,先干了什么 Prepare for the think-aloud usability test, 为测试做准备,比如模拟真实情景,写个流程。开个会,招募实验人员。 Introduce the participants to the observation procedure, 给实验人员介绍步骤。抚慰一下他们的情绪。告诉他们目的,并且希望他们think aloud。 Conduct the observation, 进行观察 Analyze the observation, 分析观察结果 。 Find possible redesigns, 找到可能需要进行重新设计的地方 Write a report. 写个总结报告出来。完成 这不也就这样嘛。
UAR报告的简单说明
UAR报告由以下几个部分构成。就这个例子简单说一下。 Example UAR — Time Zone ListBox Is Not Good //标题 UAR Identifier //问题编号,从1开始,每个问题都这样的格式来说明,就构成了UAR报告 HE18—Problem //后面这个problem表示有问题,也可以是Good,表示这部分很好。没问题。
Succinct description: //简短的描述 Time Zone pull-down ListBox provides too much irrelevant information.
Evidence for the aspect: //违反了哪条规则,共有十条规则。 Heuristic: Aesthetics and minimalist design
**Interface aspect: **
The pull-down ListBox has 50 lines of information—in very small font. There are many competing items of information to visually search, the vast majority of which are irrelevant to any one user’s particular task of finding a single desired time zone
The presentation of this structured information violates the aesthetics and minimalist design heuristic because the structure is not preserved visually from item to item. For example, the words are not always lined up vertically; see the entries for:
[GMT -01:00] Azores, Cape Verdi Is.[GMT] Greenwich Mean Time; Dublin, Edinburgh, London, Lisbon[GMT] Monrovia, Casablanca[GMT +01:00] Berlin, Stockholm, Rome, Bern, Brussels, ViennaExplanation of the aspect: //详细解释,说明问题 There are about 30 distinct time zones in the world (one for each of the regular 24 hours, plus several others either with offsets that include an additional half hour or that follow daylight savings time differently than neighboring zones).
10条可用性准则(Heuristics)
SSD4第二单元其实就讲了这么一点东西,包括一点VB的控件常识
可用性测试(Usability testing),是一项通过用户的使用来评估产品的技术,由于它反应了用户的真实使用经验,所以可以视为一种不可或缺的可用性检验过程[1]。也就是说,可用性测试是指让用户使用产品(服务)的设计原型或者成品,通过观察,记录和分析用户的行为和感受,以改善产品(服务)可用性的一系列方法。它适用于产品(服务)前期设计开发,中期改进和后期维护完善的各个阶段,是用户中心设计的思想的重要体现。
10条可用性准则(Heuristics) These are ten general principles for user interface design. They are called “heuristics” because they are more in the nature of rules of thumb than specific usability guidelines.
1.Visibility of system status——系统状态的可见性
The system should always keep users informed about what is going on, through appropriate feedback within reasonable time.
系统应该始终在合理的时间以适当的反馈信息让用户知道系统正在做什么。
2.Match between system and the real world——系统和现实世界之间的吻合
The system should speak the users' language, with words, phrases and concepts familiar to the user, rather than system-oriented terms. Follow real-world conventions, making information appear in a natural and logical order.
系统应该用用户熟悉的词,短语和概念来说用户的语言,而不是用面向系统的术语。遵循现实世界中的惯例,让信息以自然的合乎逻辑的次序展现在用户面前。
3.User control and freedom——用户控制和自由
Users often choose system functions by mistake and will need a clearly marked “emergency exit” to leave the unwanted state without having to go through an extended dialogue. Support undo and redo.
用户经常错误地选择系统功能,所以在不需要查看由于误操作而延伸出来地对话的情况下有一个明显地标志为“紧急退出”的操作来离开不想要的状态。另外,系统需要支持“撤销操作”和“重做”的功能。
4.Consistency and standards——一致性和标准
Users should not have to wonder whether different words, situations, or actions mean the same thing.
VS2010 编译安装boost库
实践是最好的办法。。学习C++,想试试线程,然后打算用boost库,结果boost库编译差点吓到我。。没看到比较完整的安装教程。。一直耽搁。今天动手。完成了。方法记录如下: 1.下载boost 从boost官网( http://www.boost.org )上下载最新的boost版本,现在最新是1.49版本,解压到自定义目录(我解压到了D:/program files,最终的目录结构是D:\Program Files\boost_1_49_0)
2.编译安装
在D:\Program Files\boost_1_49_0的目录下,有一个bootstrap.bat文件,直接双击运行。就会在同目录生成b2.exe;bjam.exe两个文件。
3.设定编译环境 修改user-config.jam (D:\Program Files\boost_1_49_0\tools\build\v2\user-config.jam) 的MSVC configuration
MSVC configuration Configure msvc (default version, searched for in standard locations and PATH). using msvc ; 在上面这段的下面直接添加如下的文字。
保存关闭。
4.开始编译 点击开始->所有程序->“Microsoft Visual Studio 2010”,指向“Visual Studio tools(工具)”,然后单击“Visual Studio 2010 command prompt(命令提示)” 使用cd切换到D:\Program Files\boost_1_49_0目录。这个就不说了 然后输入如下的代码:
解释一下命令的意思: 1.toolset:表示编译器工具,我安装的是VS2010,所以是msvc-10(如果你是VS2005,可以使用msvc-8.0 VS2008是msvc-9.0) 2.architecture:表示架构,也就是你的CPU架构,x86,x64,因为我安装的是win7 32位,所以使用了x86的架构 3.instruction-set:表示指令集,依然是8086指令集 4.address-model:表示地址长度为32位 5.link:表示生成动态/静态链接库,动态链接库是shared,静态链接库是static,一般都会编译成静态库,因为给出程序的时候打包boost的库会非常庞大 6.variant:表示生成的Debug或者release版本,一般情况下会两种版本都会编译出来的 7.threading:表示单/多线程编译,一般我们的程序都会用到多线程,所以选择了multi 8.runtime-link:表示动态/静态链接C/C++运行时库(C/C++ Runtime),我们选择了动态链接 9.without/with:表示不需要编译/需要编译哪些库,一些自己不用的库可以无需编译 10.stage/install:stage表示只生成库文件(DLL和Lib),install还会生成包含头文件的include目录,推荐使用stage,因为boost_1_49\boost中就是boost库完整的头文件,所以无需再拷贝一份出来。编译出来的库会放在stage文件夹中 这样一份完整的boost库就生成了,剩下就是直接使用到项目中了。
其实编译的具体命令都是可以自己写的。如果你需要编译所有。只需要使用下面的这行代码 b2 –toolset=msvc-10.0 –build-type=complete 就可以了。
不出问题的话。就开始编译了。。登个半个多小时吧。就会完成了。 5.设置vs 打开vs,新建一个工程。然后工程属性。配置属性->C/C++ ,附加包含目录 填上 D:\Program Files\boost_1_49_0;%(AdditionalIncludeDirectories) 这个是最终的结果,你也可以手动添加
在左侧选择链接器->附加库目录,填上 D:\Program Files\boost_1_49_0\stage\lib;%(AdditionalLibraryDirectories) 就可以了。
6.测试 在你新建的工程里输入如下的代码。运行成功就说明可以了
参考: http://www.cppfans.org/1317.html http://www.cnblogs.com/ComputerG/archive/2011/03/10/1979730.html http://www.cppblog.com/shaker/archive/2011/11/30/33583.html
C++ 独立引用,为什么?
问题:
I read in some good C++ tutorial that independent references do exist, and act like aliasing. 我读了一些好的C++文章,发现独立引用确实存在,并且很像别名。 But… I wonder what it is made for. 但是,,,我想知道他适用于什么情况。 Why should one want to use aliasing.Besides, some piece of code that is not clear to me: 为什么有人想使用别名呢,另外,下面这段代码我不太清楚。
First, ref is a ‘reference’ to a.I understand from second line of code that address for ref (hence the ampershead) is 首先,ref是一个对a的引用,从第二行代码那我认为ref的地址也就是a,(括号里面不清楚什么意思。貌似是作者写错了)
a. Then, integer ref is assigned the value of b (19). First cout returns a and ref, both equal to 19. 然后呢,整数ref被b(19)被赋值,第一次输出a和ref,都是19,
Why? Isn’t integer a the address for ref? Then, decrements ref, and last cout gives two times 18. a and ref where decremented. 为什么,难道整数a不是给ref的地址?然后ref自减,最后输出了2个18,a和ref都减少了。
Only strange possible interpretation of mystery: here int&; is a type in itself, ‘independent reference to an integer’, 唯一可能的解释就是:在这里,int& 是一个类型,表示对一个整数的独立引用。
and this type means aliasing. Then whatever you do to ref, the same is done to a.
c & c++中sizeof返回值不同?
问题: A character array is defined globally and a structure with same name is defined within a function. 一个字符数组被定义为全局变量,一个相同名字的结构体被定义在一个函数内部。
Why sizeof operator returns different values for c & c++ ? 为什么sizeof操作符对于C和C++返回了不同的值呢?
答案: Because in C++, the struct you defined is named S, while in C, 因为在C++中,你定义的结构体的名称是S,而在C中,
it’s named struct S (which is why you often see typedef struct used in C code). 他叫做struct S(这也是为什么我们可以经常看到typedef struct 被用在C代码中)。
In C, to refer to the struct type, you need to say struct S. Therefore, sizeof(S) refers to the array. 在C中,引用一个结构类型的时候,你必须说struct S,因此,sizeof(S)调用的是数组S。
In C++, struct is unnecessary. So the local S hides the global S. 在C++中,struct这个字不是必需的,所以局部变量S隐藏了全局变量S。
If you were to change the code to the following, you would get the expected results: 如果你把代码改成下面的样子,你就能得到你期望的结果了。
原文:http://stackoverflow.com/q/10670261/764869
为什么sizeof(str.substr(0,3).c_str())=8?
问题: string str = "abcdefgdcb"; cout < < sizeof(str.substr(0,3).c_str()); For some reason, the above string is giving me 8. I assumed c_str() returns a null string, 由于某些原因,上面的这个字符串得到的结果是8,我估计c_str()返回了一个null,
and sizeof uses the null to determine the size of the string. 并且sizeof函数使用这个null来定义这个字符串的大小。
答案: Because sizeof doesn’t give you the length of a string, 因为sizeof给你的不是一个字符串的长度,
it gives you the size of the type (const char * in this case). Try strlen. 他给你的是这个类型的大小(这种情况下的类型是c_str()返回的const char*类型),想要得到正确的结果,试试strlen函数吧。
On your system, sizeof (const char ) == 8, like any other pointer. 在你的系统上,sizeof(const char)=8,和其他所有的指针类型一样。
8 is the size of a pointer on your machine (64-bit) 8是在你的64位电脑上一个指针的大小
There’s your problem. sizeof tells you the size of a variable, 别乱假设,sizeof告诉你一个变量的大小,
which has nothing to do with the value inside the variable, ever. 他不会进入变量里面对变量做任何改变的。。永远不会。
问题:http://stackoverflow.com/q/10668764/764869
快速排序算法
对象数组的Xml序列化和反序列化
使用Serialization来进行序列化和反序列化,因此需要引入System.Xml.Serialization;命名空间。
为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中;内存中的对象如果需要传递给其他系统使用;或者在关机时需要保存下来以便下次再次启动程序使用就需要序列化和反序列化。
本文的原始例子在参考文中,但是参考文中没有给出反序列化的例子,且xml文件不清晰。于是修改了代码,同时实现对象数组序列化和反序列化。
参考: http://www.cnblogs.com/yukaizhao/archive/2011/07/22/xml-serialization.html