技术笔记-2010

1.TortoiseSVN支持file///,http://,svn://三种协议访问。
2.sprintf中格式化double类型到字符串的规则
double a = 397.0054
sprintf(szTmp, "%3.2f", a); // szTmp = "397.01"
sprintf(szTmp, "%03.2f", a); // szTmp = "397.01"
sprintf(szTmp, "%04.2f", a); // szTmp = "397.01"
sprintf(szTmp, "%06.2f", a); // szTmp = "397.01"
sprintf(szTmp, "%07.2f", a); // szTmp = "0397.01"
只有当格式化的输入字符格式(sprintf的第二个参数)小数点前的数字大于double类型的变量的格式总长度(包括小数点)时,格式化后的字符串前面才会有“0”字符。格式串的小数点前表示总宽度。

2.utf-8是编码而不是字符集,unicode是字符集;gb2312既是字符集,又是编码。gb2312是unicode的子集,但是不排除在其他的(或者未来的)某种汉字字符集/编码里,有些字连unicode都没有收录。这种字就只有那种汉字编码方式,而没有utf-8的标准编码。这时,在一定的局部范围内,软件会使用unicode的私有部分临时和这些字关联,这样一来一方面便于那些基于Unicode的API来处理,另一方面也可以真的用utf-8编码了

4. 关于类8583通信报文方面的代码笔记:
4.1 压缩BCD码与非压缩BCD码的区别—— 压缩BCD码的每一位用4位二进制表示,一个字节表示两位十进制数。例如10010110B表示十进制数96D;非压缩BCD码用1个字节表示一位十进制数,高四位总是0000,低4位的0000~1001表示0~9.例如00001000B表示十进制数8,0000010100000110B是56的非压缩型BCD码. (简单地说:非压缩BCD一个字节存放一位十进制数,压缩BCD一个字节存放两位十进制数)。
4.2 域数据的填充:右补空格,左补零(RIGHT_SPACE, LEFT_ZERO),还有一种左靠右补零和右靠左补零。
4.3 ASC2BCD中的算法:数值向右移一位是除以2,向左移一位是乘以2;这个函数把字符"123456"转成数字:12,34,56(Byte Format)。这个函数把ASC字符串转成压缩BCD码;
4.4 BCD2ASC把BYTE串BYTE bcd[3] = {0x12, 0x34, 0x56} 转成了字符1, 2, 3, 4, 5, 6(Byte Format),这个函数的长度nLen应该是转换后的字节的个数。

5.数据库中可以建立复合主键,即多个字段同时作为主键。但这种情况表示每个字段都不能唯一,而不是这几个字段和起来唯一。
6.lambda是一种特殊的函数声明方式,它可以用来声明一个匿名函数,所谓的匿名函数是指没有函数名的函数。函数调用是可以直接调用lambda表达式返回的结果。一般lambda函数的声明方式:lambda 参数列表:表达式;
7.闭包(Closure)指携带着它们被定义所处的“环境”的函数。通俗的说法是函数里嵌套函数,并且子函数可以引用外函数定义的局部变量。

8.尽量用const和inline,而不是define。
无参的宏定义用const int MAXNUM = 500这种类型来代替;带参数的宏用inline内联函数来代替。使用const可以进行类型安全检查。

9.CDC中画笔的用法
CDC *pDC;
pDC = new CClientDC(this);
CPen pen(PS_SOLID, 1, RGB(255,0,0));
CPen *pOldPen = pDC->SelectObject(&pen);
pDC->SelectObject(pOldPen);
delete pDC;

10.VC++操作技巧
10.1 在资源编辑界面,CTRL+D设置控件焦点顺序。
10.2 WTL中模态对话框不需要继承CMessageFilter, CIdleHandler和重写PreTranslateMessage和OnIdle函数。

STL相关的知识
1. 最近刚开始使用STL中的容器,发现map中的元素在insert之后,会自动依key排序。我想问一下,各位高手,能不能让map的元素按照 insert的顺序排列,而不是自动的依key自动排序?
回答: 那就没必要用map了,用vector就行,vector中放pair 就行了。

WTL相关知识
1. 有些控件出现IsWindow断言,可能是没有将控件变量和控件ID关联起来,需要调用m_Text1.Attach(GetDlgItem(IDC_STATIC1))这样来绑定。注意:只有非模态的对话框才需要这么做,模态的对话框不需要加这行代码,直接可以像这样m_Text1.SetWindowText(...)使用。
2. 首先需要记住的是对话框必须是无模式的,因为CUpdateUI需要在程序的消息循环控制下工作。如果对话框是模式的,系统处理消息循环,我们程序的空闲处理函数就不会被调用,由于CUpdateUI是在空闲时间工作的,所以没有空闲处理就没有UI updating。
3. UIAddChildWindowContainer(),它告诉CUpdateUI我们的对话框含有需要Updating的子窗口。

零碎知识整理
1. _gcvt函数把flout/double型数据转成char型字符;
2. 编译Qt4.6.2的configure参数
configure -debug-and-release -platform win32-msvc2005 -opensource -fast -nomake examples -nomake demos -no-webkit

nmake confclean

3. socket中的timeval是指数据包的间隔时间,即:多长时间没有接受到数据,和文件大小没有关系。

4. fwrite的两个参数,count,1,一个是缓冲区大小,一个是缓冲区数量。

5. 介绍一下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。

6. 可以用命令行模式启动apache,并带上参数,apache会提示你哪句有误,然后就可以针对性的解决,命令如下: httpd.exe -w -n "Apache2" -k start

7. 有时即使使用了#pragma warning(disable: errnum)后还有警告,是因为把头文件放到预编译头中了,这种情况在使用STL中的后经常出现。

8. CreateThread 启动了一个线程,同时产生一个句柄让你好操纵这个线程,如果你不要用这个句柄了就CloseHandle关掉它。调用这个CloseHandle并不意味 着结束线程,而是表示不关心此句柄的状态了,也就无法控制子进程的线程了。如果需要关心,可以在子进程结束后再CloseHandle,但一定得 CloseHandle。操作系统内核管理内核对象的生命期,应用程序通过CloseHandle操作内核对象的引用计数,当引用计数由1降为0时,内核 负责销毁相应的内核对象。进程和线程都有一个内核对象与它们对应,操作系统通过内核对象管理进程和线程。当你在程序中,不需要再操作创建的线程时,就 CloseHandle掉,即便是那个线程目前计数为1,等你调用CloseHandle后该计数降为 0,但已经创建的线程并没有被马上撤消,而是等线程函数执行完毕后才撤消,或者是在线程函数执行完毕前整个进程结束,那么该线程也被撤消。

9. 如 果一个进程在写入数据库的时候,因为断电或者操作系统崩溃而突然的退出,没有来得及完成写操作,那么它就会留下一个数据库临时日志文件("hot journal"). 随后的进程在试图读取数据库的时候,如果发现这个文件存在就会用它来恢复数据库,从而保证数据库的完整性。

10. UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。规定存储方式的称为UTF(Unicode Transformation Format),其中应用较多的就是UTF-16和UTF-8了。

11. Unicode 编码方式:UCS(Unicode Character Set)-Unicode字符集。实现方式:UFT(UCS Transformation Format)-可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。UTF-8、UTF-16、UTF-32分 别以BYTE、WORD、DWORD作为编码单位。UTF-8的编码是字节流。UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。

12. 例 1:“汉”字的Unicode编码是0x6C49。0x6C49在0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001, 用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
例2:Unicode编码 0x20C30在0x010000-0x10FFFF之间,使用用4 字节模板了:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx。将0x20C30写成21位二进制数字(不足21位就在前面补0):0 0010 0000 1100 0011 0000,用这个比特流依次代替模板中的x,得到:11110000 10100000 10110000 10110000,即F0 A0 B0 B0。

13. MBCS : 多字节字符集,是一种替代 Unicode 以支持无法用单字节表示的字符集(如日文和中文)的方法。为国际市场编程时应考虑使用 Unicode 或 MBCS,或使程序能够通过更改开关来生成支持两种字符集之一的程序。最常见的 MBCS 实现是双字节字符集 (DBCS)。一般来说,Visual C++(尤其是 MFC)完全支持 DBCS。

14. 关于字符集和编码我们必须明确一个概念,UTF-8是unicode字符集的一个编码方案,当我们在说到UTF-8字符和Unicode字符的时候,在某些 情况下,它们在逻辑上是等价的,但是,他们并不是同一个东西,因为Unicode字符在二进制上还有一个选择就是原生的UTF-16编码。

15. 代码页Codepage,codepage实际上是一张表,通常的codepage是一个从unicode到其他mbcs的转换索引表, 比如windows上常用的MS936代码页,实际上就是GB2312到unicode的转换表,我们知道,windows是完全基于unicode 的,MS的应用程序也大多是基于unicode开发的,他们对GB2312的支持,正是来源于codpage932,通过cp932的转换,应用程序可以 在unicode和gb2312之间来回转换。

16. UTF-8 的设计明显是用英文为主的西方人搞出来的东西。对于中文一点都不环保。所有汉字和中文标点都需要 3 个字节才能表达。而少量欧洲字母可以用 2 字节表达,英文的 ASCII 符号则可以只用单字节。

17. SOAP的构建模块:一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素:
* 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息
* 可选的 Header 元素,包含头部信息
* 必需的 Body 元素,包含所有的调用和响应信息
* 可选的 Fault 元素,提供有关在处理此消息所发生错误的信息

SOAP的语法规则:这里是一些重要的语法规则:
* SOAP 消息必须用 XML 来编码
* SOAP 消息必须使用 SOAP Envelope 命名空间
* SOAP 消息必须使用 SOAP Encoding 命名空间
* SOAP 消息不能包含 DTD 引用
* SOAP 消息不能包含 XML 处理指令

SOAP 在默认的命名空间中 ("http://www.w3.org/2001/12/soap-envelope") 定义了三个属性。这三个属性是:actor、 mustUnderstand 以及 encodingStyle。

19. 如果一个进程在写入数据库的时候,因为断电或者操作系统崩溃而突然的退出,没有来得及完成写操作,那么它就会留下一个数据库临时日志文件("hot journal"). 随后的进程在试图读取数据库的时候,如果发现这个文件存在就会用它来恢复数据库,从而保证数据库的完整性.

120. UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。规定存储方式的称为UTF(Unicode Transformation Format),其中应用较多的就是UTF-16和UTF-8了。

21. 总结一下SOAP客户端开发的关键步骤
1.导入类型库
2.需要创建一个SoapConnector
3.下一步创建SoapSerializer
4.下一步把消息附加到SoapConnector的输入流
5.下一步读取结果.要读取服务器的回复,客户端应用需要使用SoapReader,
6.SoapReader被连接到SoapConnector输出流
7.用IXMLDOMElement对象可以从SoapReader里读到服务器的回复

22. Win32程序中为什么不能响应WM_KEYDOWN消息?
原来,我的窗体上有一个Button控件,我按下之后,窗口焦点(Focus)被它抢走了,所以我的主窗口就无法响应了。背后的原因是键盘是一个共享设备,所以Windows只让获得焦点的窗口能够响应键盘消息。并且Windows创建了一个system message queue储存键盘和鼠标消息,然后等应用程序处理完一个消息后,才把下一个消息放到应用程序的application's message queue 里。之所以要两个队列,是为了进行同步,使消息能够正确的分发到应用程序。比如当一个用户按键过快时,应用程序的处理速度可能赶不上用户按键的速度。如果用户按键的过程中切换了窗口焦点(比如按下ALT-TAB),那么接着的键盘消息就应该分发到新获得焦点的窗口去。如果只有一个消息队列则不能做到这一点。(参考《Programming Windows》第5版)
调用SetFocus(hWnd)解决问题。

23. SQLite删除前n条记录:delete from APLtb where upc in (select upc from APLTb limit 100);

24. VC中设置成UNICODE模式后要在Link->Category->Output->wWinMainCRTStartup输入这个

你可能感兴趣的:(技术笔记-2010)