2006年10月24日

完全的版本号定义,分三项::<主版本号>.<次版本号>.<修订版本号>,如 1.0.0。

版本号升级原则:

主版本号:功能模块有大的变动,比如增加多个模块或者整体架构发生变化。

次版本号:和主版本相对而言,次版本号的升级对应的只是局部的变动。但该局部的变动造成了程序和以前版本不能兼容,或者对该程序以前的协作关系产生了破坏,或者是功能上有大的改进或增强。

修订版本号:局部的变动,主要是局部函数的功能改进,或者bug的修正,或者功能的扩充。

 

原则上,自第一个稳定版本发布后,修订版本号会经常性改动,而次版本号则依情况作改动,主版本号改动的频率很低,除非有大的重构或功能改进。对于小项目而言,甚至可以简化为:>.<次版本号>.<修订版本号>。

 

2006年10月17日

a 分手(彻底的不喜欢)
b 还在一起,继续相互了解(你还不确定喜欢不喜欢)
c 和好(你确实有一点喜欢我)

彻底的不喜欢

 

2006年10月12日

一:遵循一致的准则,确立标准并遵循

  无论是控件使用,提示信息措辞,还是颜色、窗口布局风格,遵循统一的标准,做到真正的一致。
  这样得到的好处:

  1:使用户使用起来能够建立起精确的心里模型,使用熟练了一个界面后,切换到另外一个界面能够很轻松的推测出各种功能,语句理解也不需要费神理解
  2:降低培训、支持成本,支持人员不会行费力逐个指导。
  3:给用户统一感觉,不觉得混乱,心情愉快,支持度增加

  做法:

  项目组有经验人士,确立UI规范:
  ·美工提供色调配色方案,提供整体配色表
  ·界面控制程序人员、用户体验人员提出合理统一使用的控件库。参考标准界面使用规范:

  控件功能遵循行业标准,windows平台参见《Microsoft 用户体验》(MSDN中有,中文已经翻译发行,项目组必须有一本)

  控件样式在允许的范围内可以统一修改其样式、色调
  参考其他软件先进操作,提取对本项目有用的功能,以使用,绝对不能盲从,漫无目的。
  根据需要,设计特殊操作控件,准则为:简化操作、达到一定功能目的

  ·界面实施人员与美工商榷控件可实现性,(如不实行此步骤,将会导致各自对对方工作不满意,也会产生不一致的混乱)。重复叠代上述工作。
  ·建立合理化文档《UI标准》描述上述规范,
  ·强行界面设计者理解之,并作为开发准则,
  ·SQA人员进行监控开发人员是否遵循,及时告诫开发人员。

  二:(Color)颜色使用恰当,遵循对比原则

  1:统一色调,针对软件类型以及用户工作环境选择恰当色调:
  安全软件,根据工业标准,可以选取黄色,绿色体现环保,蓝色表现时尚、紫色表现浪漫等等,淡色可以使人舒适,暗色做背景使人不觉得累等

  2:如果没有自己的系列界面,采用标准界面则可以少考虑此方面,做到与操作系统统一,读取系统标准色表

  3:色盲、色弱用户,即使使用了特殊颜色表示重点或者特别的东西,也应该使用特殊指示符,如"!","?"着重号,以及图标等

  4:颜色方案也需要测试,常常由于显示器、显卡的问题,色彩表现每台机器都不一样,应该经过严格测试,不同机器进行颜色测试

  5:遵循对比原则:在浅色背景上使用深色文字,深色背景上使用浅色文字,蓝色文字以白色背景容易识别,而在红色背景则不易分辨,原因是红色和蓝色没有足够反差,而蓝色和白色反差很大。除非特殊场合,杜绝使用对比强烈,让人产生憎恶感的颜色。

  6:整个界面色彩尽量少的使用类别不同的颜色

  itop色表
  具体标准参考美术学统计学术标准。
  色表的建设,对于美工在图案设计、包装设计上起着标准参考作用,对于程序界面设计人员设计控件、窗体调色起到有章可循的作用。

  三:(Resource)资源

  一个多姿多彩的人机交互界面,少不了精美的鼠标光标、图标以及指示图片、底图等。

  1:也需要遵循统一的规则,包括上述颜色表的建立,图标的建立步骤也应该尽可能的形成标准,参考itop的outlookbar图标设计标准
  2:有标准的图标风格设计,有统一的构图布局,有统一的色调、对比度、色阶,以及图片风格
  3:底图应该融于底图,使用浅色, 低对比,尽量少的使用颜色。
  4:图标、图像应该很清晰的表达出意思,遵循常用标准,或者用户机器容易联想的到物件,绝对不允许画出默认奇妙的图案。
  5:鼠标光标样式统一,尽量使用系统标准,杜绝出现重复的情况,例如某些软件中一个手的形状就有4钟不同的样子。

八:(TAB ORDER)TAB顺序

  习惯用法,阅读顺序,从从左到右,从上到下
  窗体中控件的Tab按键激活顺序,TabOrder,. BCB/DELPHI中使用窗体设计右键菜单选择taborder设置,VC中窗体RES编辑区域使用ctrl+D

  九:(ShortcutKey & Accelerator& PopMenu)快捷键、加速键和弹出菜单

  ·快捷键:

  1:全局快捷键菜单中加以描述 CTRL+XXX 并入帮助列表。

  2:快捷键写入帮助,特殊说明,并在使用培训时强调使用

  ·加速键:

  1:使用非破坏性缺省按钮,回车、ESC键的正确使用

  一个窗体,有默认加速键,如回车表示激活当前窗口设置为default的按钮动作,esc表示关闭窗口。

  在调用default按钮动作和关闭动作时候,不应该做有破坏性的操作,避免用户错误操作产生危害程度,例如不能把删除数据等功能的按钮作为缺省按钮。当用户要提交很多数据时,应该屏蔽esc,或者做退出提示,告诫用户是否保存提交。

  2:可接收动作控件必须拥有加速键,统一加速键描述(&A)

  为结合键盘使用,可操作控件都应该有加速键,加速键定义准则,为英文单词第一个字母,如果同一窗体重复则用第二个字母,以此类推,则加速方式为alt+这个加速键,用统一的方法标识在界面中,如XXX(A) 或者wps的 A.XXX 英文可直接在字母下标识下划线 Cancel,

  对于无法像button一样显示快捷键的Edit等控件,则在Edit描述的Label中显示快捷键。

  ·弹出菜单

  辅助菜单必须在可视化界面上拥有对应的按钮或者菜单选项。

  由于辅助菜单由用户点击鼠标左右键或者别的动作才能调出来显示给用户。无法清晰的显示给用户,所以对应选项应该可以通过别的途径得到,例如界面上有相应控件或弹出右键菜单的按钮等。

  十:(ACTION)用户交互

  1:disable而不是not visible

  要使一个功能有时允许有时不允许用户使用,则这个控件的不能随便隐藏,应该使用disable属性进行表示,以免用户发现控件失踪后措手无策

  2:窗口弹出位置要明显

  点击一个控件,弹出窗口或者菜单,应该给人明显提示,最低要求是覆盖刚才点击的位置,让用户轻松跳转到新的界面。

  3:执行动作要提示

  给用户一个视觉感受的同时,写程序的时候应该注意用户的交互感受,UI作为人机对话的工具,用户做了任何动作,应该给用户一个视觉或者听觉、触觉提示。而且这个提示应该行明显,但不应提示过长,可以有以下几种方法:

  当用户点击按钮等动作进行一个工作时:

  1:弹出交互对话框让用户点击确认。
  2:改变UI中控件参数提示:(处理不用用户确认的提示,有一定延时,或者用户按键后自动清除。)
  如:改变标题栏字符串,显示“信息:提交成功”,或者专门设置一个状态栏、TLable等用来进行提示。
  3:听觉提示:
  在确定有声卡,用户可以听到声音的时候,发出特殊声音提示。一般作为重要提示的辅助。声音不应过长,紧急错误提示应该短促,频率较高,成功提示应该舒缓,轻松。等等……

【zt】

手机上内置聊天软件的争夺日趋白热化。日前,一种可以利用手机直接进行对讲通话的新兴聊天工具——PICA(皮咔),正试图借德信无线抢占手机终端。“掌中无限”CEO梁晖介绍说,在中国最大的手机软件和整机方案设计供应商牵手后,内置PICA的手机很快将要上市,年底之前估计能达到100多万部。据悉,在未来的一年里,德信无线将把“掌中无限”这款核心产品在其手机设计程序平台预置,从而实现跨终端、跨平台的手机对讲服务。

据了解,在将PICA软件植入手机终端后,通过手机用户可以实现基于移动数据网络的语音对讲、即时语音信息、图片或视频文件的传输。事实上,想抢占手机终端的聊天软件不仅只有PICA。近日,中国移动花很大精力开发的即时通信工具Fetion的Beta已经正式上线,进入公测阶段,这项被中国移动命名为“飞信”的业务,现在正以功能免费的形式进行业务正式商用前的基础用户积累。“飞信”业务现在提供PC到手机免费发送短信、2-8人的群组语音聊天以及交友活动,模式和功能与目前的PI鄄CA完全一致。

在被中国移动定制的手机中,中国移动不允许微软操作系统的手机内置MSN软件。面对中国移动对即时通信工具的垄断意图,PICA目前貌似强大的用户基础很可能不堪一击。这也可以看做是PICA与德信无线直接结盟并在年内规模推出PICA手机的重要原因———在中国移动“飞信”还没有完全成熟之前,借用手机企业的力量,进一步扩大用户市场,为以后赢得更大的话语权做准备。(n101)

 

/**

 *感叹中移动一手折天。

 *客户端平台依旧按计划开发。

 *命运受别人左右。不过我们还有一点点主动权。

 */

2006年10月10日

  中午跑回家睡觉,居然有种恐惧感,一个人在家待上5分钟也觉得压抑不堪,想想,昨晚老大睡我旁边居然能对我起到催眠作用。可以后怎么办呢???一天半包烟好像只会让脑袋更加清醒,只好出绝招了。疲,终极目标就是一个疲啊,哈哈。每天下班先去跑步吧。挑战自我从跑步开始:D

让耳边只有重金属

让生活只剩工作

我好喜欢这个世界

脸上一定要挂着微笑哦,哈哈

工作工作工作…………………….

2006年10月09日

从天堂到地狱的感觉

不是世界末日

寻找继续走下去的理由

失忆会是美好的

 

 

2006年09月28日

VC中定制Doxygen注释宏

 

感谢曾发明同学

 

1 参照vc自带的sample.dsm生成文档yymacro.dsm

2 编辑yymacro.dsm内容,添加如下三个宏:

       A)

生成Doxygen样式的函数注释

YYAddDoxygenFunctionDescription()

对应注释为:

       /**

        * Func1 declaration

        * @param int a input1 a

        * @param int b input2 b

        * @see TestMe()

        * @return int

 */

对应按钮为:

Ctrl+shift+f

 

       B)

生成doxygen样式的公开变量的注释

YYAddDoxygenValDescription ()

对应注释为:

/**< . . */

对应按钮为:

Ctrl+shift+v

       C)

生成doxygen样式的一般通用的注释

YYAddDoxygenCommenDescription ()

对应注释为:

/**

       *

 */

对应按钮为:

Ctrl+shift+c

3 保存yymacro.dsm,并添加该宏文件到sample.dsm所在目录中。

4 参照msdn To assign a macro to a toolbar button”,” To assign a macro to a key sequence映射对应宏到按钮和菜单。

 

5 附录:

A yymacro.dsm

‘——————————————————————————

‘FILE DESCRIPTION: 杨勇定制的宏,内含doxygen注释宏等。

‘——————————————————————————

 

辅助函数

‘Strips the leading tab spaces.

Function YYStripTabs (ByVal MyStr)

       Do While InStr(MyStr, vbTab) <> 0

              MyStr = Right(MyStr, Len(MyStr) – InStr(MyStr, vbTab))

       Loop

       YYStripTabs = Trim(MyStr)

End Function

 

生成Doxygen样式的函数注释

Sub YYAddDoxygenFunctionDescription()

‘DESCRIPTION: AddDoxygenFunctionDescription

‘DESCRIPTION: Creates a comment block for the currently selected C/C++ function prototype

 

       ‘Throughout this file, ActiveDocument.Selection is used in place

       ‘of ActiveDocument.Selection.Text.  The two are equivalent, and can

       ‘be used interchangeably. The reason for the equivalence is that

       ‘Text is regarded as the default property to use. All uses of

       ‘ActiveDocument.Selection without any other property default to the Text

       ‘property.

      

       if ActiveDocument.Language = dsCPP Then

              Header = YYStripTabs(Trim(ActiveDocument.Selection))

 

              ‘Get the function return type.

              ‘RetTp 返回类型

              if Header <> "" then

                     Reti = InStr(Header, " ")

                     Loc = InStr(Header, "(")

                     if Reti < Loc Then

                       RetTp = Left(Header, Reti)

                       Header = Right(Header, Len(Header) – Reti)

                     End If

 

                     ‘Get the function name.

                     ‘fcName 函数名城

                     Loc = InStr(Header, "(") – 1

                     Loc2 = InStr(Header, ")")

                     if Loc > 0 And Loc2 > 0 then ‘make sure there is a ‘(‘ and a ‘)’

                            fcName = Left(Header, Loc)

                            Header = Right(Header, Len(Header) – Len(fcName))

 

                            ‘Do we have storage type on the return type?

                            Trim (fcName)

                            If InStr(fcName," ") <> 0 Then

                                   retTp = retTp + Left(fcName,InStr (fcName," "))

                                   fcName = Right(fcName, Len(fcName) – InStr(fcName," "))

                            End If

 

                            ‘Get the function parameters.

                            iPrm = 0

                            iPrmA = 0

                            prms = Header

 

                            ‘Count the number of parameters.

                            Do While InStr(prms, ",") <> 0

                                   iPrm = iPrm + 1

                                   prms = Right(prms, Len(prms) – InStr(prms, ","))

                            Loop

                           

                            ‘Store the parameter list in the array.

                            If iPrm > 0 Then  ‘ If multiple params.

                                   iPrm = iPrm + 1

                                   iPrmA = iPrm

                                   Redim ParamArr(iPrm)

                                   Do While InStr(header, ",") <> 0

                                          ParamArr(iPrm) = Left(Header, InStr (Header, ",") – 1)

                                          ‘Remove brace from first parameter.

                                          If InStr(ParamArr(iPrm), " (") <> 0 Then

                                                 ParamArr(iPrm) = Right(ParamArr(iPrm), _

                                                               Len(ParamArr(iPrm))-InStr(ParamArr(iPrm)," ("))

                                                 Trim(ParamArr(iPrm))

                                          End If

                                          Header = Right(Header, Len(Header) – InStr(Header,","))

                                          iPrm = iPrm – 1

                                          Loop

                                   ParamArr(iPrm) = Header

                                   ‘Remove trailing brace from last parameter.

                                   If InStr(ParamArr(iPrm), ")") <> 0 Then

                                          ParamArr(iPrm) = Left(ParamArr(iPrm), _

                                                        InStr(ParamArr(iPrm), ")") – 1)

                                          Trim(ParamArr(iPrm))

                                   End If

                            Else ‘Possibly one param.

                                   Redim ParamArr(1)

                                   Header = Right(Header, Len(Header) – 1) ‘ Strip the first brace.

                                   Trim(Header)

                                   ParamArr(1) = YYStripTabs(Header)

                                   If InStr(ParamArr(1), ")") <> 1 Then

                                          ParamArr(1) = Left(ParamArr(1), InStr(ParamArr(1), ")") – 1)

                                          Trim(ParamArr(1))

                                          iPrmA = 1

                                   End If

                            End If

 

                            ‘Position the cursor one line above the selected text.

                            ActiveDocument.Selection.LineUp

                            ActiveDocument.Selection.LineDown

                            ActiveDocument.Selection.StartOfLine

                            ActiveDocument.Selection = vbLf

 

                            声称Doxygen样注释文档

                            Descr = vbTab + "/**" + _                                                    

                                          vbLf + vbTab + " * " + fcName + _

                                          vbLf

                           

                            ‘Print the parameter list.

                            Last = iPrmA

                            Do While iPrmA <> 0

                                   ‘Remove a line feed from any of the arguments.

                                   If InStr(ParamArr(iPrmA), vbLf) <> 0 Then

                                          ParamArr(iPrmA) = Right(ParamArr(iPrmA), _

                                                        (Len(ParamArr(iPrmA)) – _

                                                        InStr(ParamArr(iPrmA), vbLf)))

                                          Trim(ParamArr(iPrmA))

                                   End If

                                   ParamArr(iPrmA) = YYStripTabs(ParamArr(iPrmA))

                                   ‘If there are 2+ parameters, the first parameter will

                                   ‘have a ‘(‘ prepended to it, remove it here:

                                   if iPrmA = Last AND Last <> 1 then

                                     ParamArr(iPrmA) = Right(ParamArr(iPrmA), _

                                                 Len(ParamArr(iPrmA)) – 1)

                                   End If

                                   Descr = Descr + _

                                                 vbTab + " * @param " + ParamArr(iPrmA) + _

                                                 vbLf

                                   iPrmA = iPrmA – 1

                            Loop

 

                            Descr = Descr + _

                                          vbTab + " * @return " + RetTp + _

                                          vbLf + vbTab + " */" + _

                                          vbLf

                            ActiveDocument.Selection = Descr

                     Else

                            MsgBox("It is possible that the function you are trying to"+_

                                          " work with has a syntax error.")

                     End if

              End If

       Else

              MsgBox("You need to have an active C/C++ document open"+ _

                            vbLF+"with the function prototype selected.")

       End If

End Sub

 

生成doxygen样式的公开变量的注释

Sub YYAddDoxygenValDescription ()

       if ActiveDocument.Language = dsCPP Then

              ActiveDocument.Selection = ActiveDocument.Selection + _

                                                               vbTab + "/**< . . */"                          

       End if

End Sub

 

生成doxygen样式的一般通用的注释

Sub YYAddDoxygenCommenDescription ()

       if ActiveDocument.Language = dsCPP Then

              ActiveDocument.Selection = "/** " + _

                                                               vbLf + " * " + _

                                                               vbLf + " */"

       End if

End Sub

 

 

B)测试文件

#ifndef __A__H

#define __A__H

 

#include <iostream>

 

/**

 *   class A’s declaration

 */

class A

{

public:

       enum TEnum

       {

              TVal1,           /**< enum value TVal1. */ 

              TVal2,           /**< enum value TVal2. */ 

              TVal3            /**< enum value TVal3. */ 

       };

 

       TEnum *enumPtr; /**< enum pointer. Details. */

       TEnum enumVar;  /**< enum variable. Details. */

 

       /**

        * Func1 declaration

        * @param int a input1 a

        * @param int b input2 b

        * @see TestMe()

        * @return int

        */

 

       int Func1(int a, int b);

 

 

       /**

        * TestMe

        * @param int a

        * @param const char *s

        * @return int

        */

       int TestMe(int a,const char *s);

 

 

       /**

        * TestAutoComment

        * @param int a param1 description

        * @param int b param2 description

        * @param char c param3 description

        * @return int ret description

        */

       int TestAutoComment(int a, int b, char c);

 

       int iA;     /**< iA1. iA’s Details1. */

                     /**< iA2. iA’s Details2. */

      

       /**

       * a public variable iB.

       * Details1.

       * Details2.

       */

       int iB;     /**< . . */

 

       int iC; /**< iC1 中文注释测试. iC’s Details1. */

                     /**< iC2. iC’s Details2. */

};

 

#endif//__A__H

2006年09月13日
Doxygen注释风格
 
1 类的申明
/**
 *   class declaration
 */
 
2 变量申明
/**< val’s brief. val’s details1. */
 
3 函数申明
       /**
       * a normal member taking two arguments and returning an integer value.
       * @param a an integer argument.
       * @param s a constant character pointer.
       * @see Test()
       * @see ~Test()
       * @see testMeToo()
       * @see publicVar()
       * @return The test results
       */
 
4 config文件中的OUTPUT_LANGUAGE设为Chinese即可支持中文。
5 Doxygen下载:
http://www.stack.nl/~dimitri/doxygen/
2006年09月03日

    从10点多出门,在街上溜达了大半夜,虽然其间奢侈的作了足疗,可到了三点这个坎上,还是累得想找个地方歇歇了。原计划是要在天大找个平坦的地露宿一晚的,后来想想后果的严重性,还是打消了这个念头。工作两年多了,也慢慢的有点点经验了,一个人在外,作践自己的身体也得有个度,过了头没法收场也是不好玩的。

    走了一路,思维几乎是停滞的,想来想去总是想不清楚自己该怎么做。还好,有一双可爱的手,可以让我借以舒缓舒缓这种压力。顺便感谢感谢某人,教我这么好的一招。不过我这双手确实也欠奏啊,该罚!说过很多被“誉为”肉麻的话,在承认自己嘴贫的同时,我也不得不承认我是一个不知天高地厚的幻想狂,一个虚伪的爱情受害者。 爱情,我对你的态度,连我自己都很失望,也许有一天我真的能敞开胸怀,翘首以待,那个王老五的时代的到来…

   不愿意想,更不愿意说,自闭的最高境界是自己都不知道在想些什么!头大,好像找个人痛痛快快的打上一架。不情愿的事接着在作,对于未来……

 

 

    人是生而自由的,确是无往不在枷锁之中。