what does our project look like?

啥也不说了,有共鸣的顶

Project

---

linux的ir设备

一台Sigma的板子,遥控器异常灵敏,拖了好久终于无法忍受,决定解决一下

看驱动源码,发现一个ioctl,IR_IOCSETWAITPERIOD,驱动(2.4内核)本来的默认设定是100,于是设定为1000



问题解决,不过还是不太明白,这个period的时间单位是什么呢?毫秒?微秒?纳秒?知道的兄弟告诉一声啊

---

关于标准c的select

不知道哪个哥们写得,从ir红外线设备获取数据居然轮询,搞得程序一起来CPU占用率就达到99%,哪怕什么也不做…

于是动手改成对设备的fd进行select,block至获取数据或超时



结果发现:

  • 设备一定要以block方式打开,即不能加O_NONBLOCK的mask

  • fd_set在select返回时会变化,如果重新对同一个设备进行select,则需要重新调用FD_SET来加入fd到fd_set

    不可能没学过的,居然一点印象都没有了…诶

    其次, 后来发现select的另一个用途—sleep线程

    在多线程程序里,在某个线程内调用sleep,usleep会导致整个程序的sleep,相信这个在大多数情况下都不是大家所期望的结果,那么你可以这样:

---

Microsoft Visual Studio 2005 fatal error C1902错误解决

前两天公司笔记本的XP系统崩溃,于是在twitter上骂了下微软,结果昨天配好的WinCE开发环境今天就挂了,难道是我骂ms的缘故?反省,于是决定。。。再痛骂一次ms。。。

骂归骂,问题也还是要解决的,但是试了重装和修复,都一样没有效果,于是去google了一下下,才发现遇到这个问题的人还真不少。

于是找到了解决方案,其实很简单,就是找不到mspdb80.dll、mspdbsrv.exe两个文件嘛,在系统属性环境变量的path里加上ms vc的bin(比C:Program FilesMicrosoft Visual Studio 8VCbin),然后到Microsoft Visual Stuido 8Common7IDE下面把这两个文件拷贝到VCbin

重启电脑,解决

末了,再bs一下ms。。。

---

segmentation fault

在继我被一个不知道什么人写的程序的segmentation fault搞到segmentation fault之后,没想到gdb自己也segmentation fault了

Program received signal SIGABRT, Aborted.
[Switching to Thread -1209059648 (LWP 3740)]
0×006bd402 in __kernel_vsyscall ()
(gdb) bt #0 0×006bd402 in __kernel_vsyscall () #1 0×00b0bd40 in raise () from /lib/libc.so.6 #2 0×00b0d591 in abort () from /lib/libc.so.6 #3 0×00b0538b in __assert_fail () from /lib/libc.so.6
… #36 0×00cb5342 in g_main_context_dispatch () from /lib/libglib-2.0.so.0 #37 0×00cb831f in g_main_context_check () from /lib/libglib-2.0.so.0 #38 0×00cb86c9 in g_main_loop_run () from /lib/libglib-2.0.so.0 #39 0×0664dbe4 in gtk_main () from /usr/lib/libgtk-x11-2.0.so.0 #40 0×08052578 in GNFLCDeco_Start (deco=0×8bf3de0) at gnflcdeco.c:232 #41 0×0804c3fb in main (argc=146784256, argv=0×8be2df0) at main.c:50
(gdb) p deco
Segmentation fault


真不知道是程序太烂还是我水平太烂……

---

自己定制deb

ubuntu提供的deb包有时并不能完全满足我们的需要,这时就需要自己来加入一些patch或者修改它的编译选项,例如实现mac menu applet时对gtkmenubar控件的patch就需要我们重新编译安装gtk
Mac Menu Bar
详细信息看这里
帖子里的ubuntu包只有gtk2.10.6的版本,最新的feisty已经到了gtk2.10.11,所以只好手工patch

1.下载gtk源码
ubuntu里下载源码是很方便的,确定sourcelist里有deb-src的条目,然后

apt-get source libgtk2.0-0

目录里会得到3个文件和一个文件夹:

gtk+2.0_2.10.11-0ubuntu3.dsc 包含对gtk包的说明和md5校验码,确保源码包正确

gtk+2.0_2.10.11-0ubuntu3.diff.gz diff的patch

gtk+2.0_2.10.11.orig.tar.gz gtk的官方源码,没有改动的

gtk+2.0-2.10.11 debian包的定制目录,包括changelog,版本信息以及所有的patch,这个目录可以由以上3个文件生成

2. 修改包
进入gtk+2.0-2.10.11目录:

debchange -i Add mac menu support

没有debchange的话安装devscripts包先,-i参数后面的是对本次修改的注释,可以看一下debian下的changelog,此时会发现开头已经自动加入了注释并且版本号由gtk+2.0_2.10.11-0ubuntu3变成了gtk+2.0_2.10.11-0ubuntu4,不需要做特殊修改的话直接下一步

3. 加入patch
所有的patch都在debian下的patches目录,不过我们的diff文件需要作些修改才可以


—- gtk/gtkmenubar.c.old 2006-07-03 08:25:06.000000000 +0800
+++ gtk/gtkmenubar.c 2006-11-04 23:18:50.000000000 +0800
-38,6 +38,18 #include “gtkwindow.h” #include “gtkprivate.h” #include “gtkalias.h”
+// For mac menubar
+#include “gdk/x11/gdkx.h”
+#include “gdk/x11/gdkwindow-x11.h”

将开头两行的路径修改成和其他patch一样:

—- gtk+-2.4.9.orig/gtk/gtkmenubar.c.old 2006-07-03 08:25:06.000000000 +0800
+++ gtk+-2.4.9/gtk/gtkmenubar.c 2006-11-04 23:18:50.000000000 +0800
-38,6 +38,18 #include “gtkwindow.h” #include “gtkprivate.h” #include “gtkalias.h”
+// For mac menubar
+#include “gdk/x11/gdkx.h”
+#include “gdk/x11/gdkwindow-x11.h”

然后把这个文件复制到debian/patches下面

4. 安装编译所依赖的软件包
这个也很简单

sudo apt-get build-dep libgtk2.0-0

5. 打包deb

sudo debuild

完成之后会在gtk+2.0-2.10.11的上层目录生成ubuntu4版本的dsc, build, changes以及一些deb包,先在可以dpkg -i 8.deb安装deb包了

---

常用正则表达式

转贴备忘

正则表达式用于字符串处理、表单验证等场合,实用高效。现将一些常用的表达式收集于此,以备不时之需。

匹配中文字符的正则表达式: [u4e00-u9fa5]
评注:匹配中文还真是个头疼的事,有了这个表达式就好办了

匹配双字节字符(包括汉字在内):[^x00-xff]
评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)

匹配空白行的正则表达式:ns*r
评注:可以用来删除空白行

匹配HTML标记的正则表达式:<(S*?)[^>]*>.?|<.?>
评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力

匹配首尾空白字符的正则表达式:^s*|s*$
评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式

匹配Email地址的正则表达式:w+([.]w)*@w+([.]w+)*.w+([-.]w+)*
评注:表单验证时很实用

匹配网址URL的正则表达式:[a-zA-z]+://[^s]*
评注:网上流传的版本功能很有限,上面这个基本可以满足需求

匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注:表单验证时很实用

匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
评注:匹配形式如 0511-4405222 或 021-87888822

匹配腾讯QQ号:[1-9][0-9]{4,}
评注:腾讯QQ号从10000开始

匹配中国邮政编码:[1-9]d{5}(?!d)
评注:中国邮政编码为6位数字

匹配身份证:d{15}|d{18}
评注:中国的身份证为15位或18位

匹配ip地址:d+.d+.d+.d+
评注:提取ip地址时有用

匹配特定数字:
^[1-9]d*$    //匹配正整数
^-[1-9]d*$   //匹配负整数
^-?[1-9]d*$   //匹配整数
^[1-9]d*|0$  //匹配非负整数(正整数 + 0)
^-[1-9]d*|0$   //匹配非正整数(负整数 + 0)
^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮点数
^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配负浮点数
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮点数
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非负浮点数(正浮点数 + 0)
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮点数(负浮点数 + 0)
评注:处理大量数据时有用,具体应用时注意修正

匹配特定字符串:
^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
^w+$  //匹配由数字、26个英文字母或者下划线组成的字符串
评注:最基本也是最常用的一些表达式

---

[转贴备忘] 便利的开发文档工具-doxygen

作者:mounTon 时间:2003-01-19 11:03 出处:互联网 责编:chinaitpower


摘要:便利的开发文档工具-doxygen


便利的开发文档工具-doxygen
mounton {www.ihere.org} ( &#60;a href=&#34;mailto:mount0nyahoo.com”>mount0n@yahoo.com)
2003年8月

0. 序言



代码写注释一直是大多数程序员有些困扰的事情。当前程序员都能接受为了程序的可维护性、可读性编码的同时写注释的说法,但对哪些地方应该写注释,注释如何
写,写多少等这些问题,很多程序员仍然没有答案。更头痛的是写文档,以及维护文档的问题,开发人员通常可以忍受编写或者改动代码时编写或者修改对应的注
释,但之后需要修正相应的文档却比较困难。如果能从注释直接转化成文档,对开发人员无疑是一种福音。而doxygen就能把遵守某种格式的注释自动转化为
对应的文档。

Doxygen是基于GPL的开源项目,是一个非常优秀的文档系统,当前支持在大多数unix(包括linux),
windows家族,Mac系统上运行,完全支持C++, C, Java, IDL(Corba和Microsoft
家族)语言,部分支持PHP和C#语言,输出格式包括HTML、latex、RTF、ps、PDF、压缩的HTML和unix
manpage。有很多开源项目(包括前两篇文章介绍的log4cpp和CppUnit)都使用了doxygen文档系统。而国内的开发人员却使用的不
多,这里从开发人员使用的角度介绍这个工具,使开发人员用最少的代价尽快掌握这种技术,并结合这个工具探讨如何撰写注释的问题。以下以linux下的C+
+语言为例进行介绍,以下讨论基于doxygen1.3.3。

1. doxygen使用步骤


由于只是工具的使用,这里不介绍它的原理,直接从使用步骤开始。Doxygen的使用步骤非常简单。主要可以分为:
1)第一次使用需要安装doxygen的程序
2)生成doxygen配置文件
3)编码时,按照某种格式编写注释
4)生成对应文档
doxygen的安装非常简单, linux下可以直接下载安装包运行即可,下载源代码编译安装也是比较通用的编译安装命令。请参考其安装文档完成安装。

Doxygen在生成文档时可以定义项目属性以及文档生成过程中的很多选项,使用下面命令能够产生一个缺省的配置文件:
doxygen -g [配置文件名]
可以根据项目的具体需求修改配置文件中对应的项,具体的修改过程在下面介绍。修改过的配置文件可以作为以后项目的模板。

让doxygen自动产生文档,平常的注释风格可不行,需要遵循doxygen自己的格式。具体如何写doxygen认识的注释在第3节详细介绍。

OK,代码编完了,注释也按照格式写好了,最后的文档是如何的哪?非常简单,运行下面的命令,相应的文档就会产生在指定的目录中。
doxygen [配置文件名]

需要注意的是doxygen并不处理所有的注释,doxygen重点关注与程序结构有关的注释,比如:文件、类、结构、函数、变量、宏等注释,而忽略函数内变量、代码等的注释。

2. doxygen配置文件


doxygen配置文件的格式是也是通常的unix下配置文件的格式:注释’#‘开始;tag = value [,value2…];对于多值的情况可以使用 tag += value [,value2…]。

对doxygen
的配置文件的修改分为两类:一种就是输出选项,控制如何解释源代码、如何输出;一种就是项目相关的信息,比如项目名称、源代码目录、输出文档目录等。对于
第一种设置好后,通常所有项目可以共用一份配置,而后一种是每个项目必须设置的。下面选择重要的,有可能需要修改的选项进行解释说明,其他选项在配置文件
都有详细解释。

TAG 缺省值 含义
PROJECT_NAME 项目名称
PROJECT_NUMBER 可以理解为版本信息
OUTPUT_DIRECTORY 输出文件到的目录,相对目录(doxygen运行目录)或者绝对目录
INPUT 代码文件或者代码所在目录,使用空格分割
FILE_PATTERNS *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh
.hxx *.hpp *.h++ *.idl *.odl 指定INPUT的目录中特定文件,如:.cpp *.c *.h
RECURSIVE NO 是否递归INPUT中目录的子目录
EXCLUDE 在INPUT目录中需要忽略的子目录
EXCLUDE_PATTERNS 明确指定的在INPUT目录中需要忽略的文件,如:FromOut*.cpp

OUTPUT_LANGUAGE English 生成文档的语言,当前支持2、30种语言,国内用户可以设置为Chinese
USE_WINDOWS_ENCODING YES(win版本)
NO(unix版本) 编码格式,默认即可。
EXTRACT_ALL NO 为NO,只解释有doxygen格式注释的代码;为YES,解析所有代码,即使没有注释。类的私有成员和所有的静态项由EXTRACT_PRIVATE和 EXTRACT_STATIC控制
EXTRACT_PRIVATE NO 是否解析类的私有成员
EXTRACT_STATIC NO 是否解析静态项
EXTRACT_LOCAL_CLASSES YES 是否解析源文件(cpp文件)中定义的类
SOURCE_BROWSER NO 如果为YES,源代码文件会被包含在文档中
INLINE_SOURCES NO 如果为YES,函数和类的实现代码被包含在文档中
ALPHABETICAL_INDEX NO 生成一个字母序的列表,有很多类、结构等项时建议设为YES
GENERATE_HTML YES 是否生成HTML格式文档
GENERATE_HTMLHELP NO 是否生成压缩HTML格式文档(.chm)
GENERATE_LATEX YES 是否乘车latex格式的文档
GENERATE_RTF NO 是否生成RTF格式的文档
GENERATE_MAN NO 是否生成man格式文档
GENERATE_XML NO 是否生成XML格式文档

3. doxygen注释


3.1 注释风格

面是工作量最大部分,安装doxygen格式写注释。通常代码可以附上一个注释块来对代码进行解释,一个注释块由一行或者多行组成。通常一个注释块包括一
个简要说明(brief)和一个详细说明(detailed),这两部分都是可选的。可以有多种方式标识出doxygen可识别的注释块。
1)JavaDoc类型的多行注释。
/**
  • ….text….

/
2)QT样式的多行注释。
/
!
….text….

/
3) /// …text….
4) //! …text….
简要说明有多种方式标识,这里推荐使用@brief命令强制说明,例如:
/
*

  • @brief [some brief description ]
  • [ brief description more. ]
*

  • [some more detailed description…]
*/
以上这些注释格式用来对紧跟其后的代码进行注释。doxygen也允许把注释放到代码后面,具体格式是放一个’<‘到注释开始部分。例如:
int var1 ; /**< ….text…. */
int var2; ///< ….text….


释和代码完全分离,放在其他地方也是允许的,但需要使用特殊的命令加上名称或者声明进行标识,比如:class、struct、union、enum、
fn、var、def、file、namespace、package、interface(这些也就是doxygen关注的注释类型)。这里不推荐使
用,建议注释尽量放在代码前后。具体使用方式参见doxygen手册。

3.2 doxygen常用注释格式
通常的选择上面的一、两种注释风格,遇到头文件中各种类型定义,关键变量、宏的定义,在其前或者后使用 @brief 定义其简要说明,空一行后继续写其详细的注释即可。

对函数的注释,是比较常常需要注释的部分。除了定义其简要说明以及详细注释,还可以使用param命令对其各个参数进行注释,使用return命令对返回值进行注释。常见的格式如下:
/** *@brief func’s brief comment. *

  • Some detailed comment.
*@param a [param a ‘s comment.]

*@param b [param b ‘s comment.]

*@exception std::out_of_range [exception’s comment.]

*@return [return’s comment.]

*/
int func1(int a, int b);

进行设计时,通常有模块的概念,一个模块可能有多个类或者函数组成,完成某个特定功能的代码的集合。如何对这个概念进行注释?doxygen提供了group的概念,生成的模块的注释会单独放在一个模块的页面中。使用下面的格式定义一个group。
/** [group_name] [brief group description ]

  • detailed group description ]
  • { */ code /** } /
    group中的代码可以有自己的注释。单纯定义一个模块,去除{ 和}命令即可。任何其他代码项(比如类、函数、甚至文件)如果要加入到某个模块,可以在其doxygen注释中使用ingroup命令即可。Group之间使用ingroup命令,可以组成树状关系。
    /
    * file util.cpp * ingroup [group_name]
  • @brief file’s brief info.
*/
把多个代码项一起添加到某个模块中可以使用addtogroup命令,格式和defgroup相似。

对于某几个功能类似的代码项(比如类、函数、变量)等,如果希望一起添加注释,而又不想提升到模块的概念,可以通过下面的方式:
//@{
/** Comments for all below code. */
code…
//@}
对这种组进行命名可以使用name命令。此时中间代码可以有自己的注释。如:
/** name group_name * description for group. */ //{
code…
//@}

3.3 doxygen常用注释命令
doxygen通过注释命令识别注释中需要特殊处理的注释,比如函数的参数、返回值进行突出显示。上面也提到了一些注释命令(如:brief、param、return、以及group相关的命令),下面对其他一些常用的注释命令进行解释说明。
exception &#60;exception-object&#62;&#60;/exception-object&#62;{exception description} 对一个异常对象进行注释。 warning {warning message } 一些需要注意的事情
todo { things to be done } 对将要做的事情进行注释 see {comment with reference to other items } 一段包含其他部分引用的注释,中间包含对其他代码项的名称,自动产生对其的引用链接。
relates &#60;name&#62;&#60;/name&#62;通常用做把非成员函数的注释文档包含在类的说明文档中。 since {text} 通常用来说明从什么版本、时间写此部分代码。
deprecated pre { description of the precondition } 用来说明代码项的前提条件。
post { description of the postcondition } 用来说明代码项之后的使用条件。 code 在注释中开始说明一段代码,直到@endcode命令。
@endcode 注释中代码段的结束。

到此为止,常用的doxygen的注释格式讨论完毕,我们能够按照一定的格式撰写doxygen认识的注释,并能够使用doxygen方便快捷的生成对应的文档,不过注释中应该写些什么,如何撰写有效的注释可能是困扰开发人员的一个更深层次的问题。

4. 注释的书写



释应该怎么写,写多还是写少。过多的注释甚至会干扰对代码的阅读。写注释的一个总的原则就是注释应该尽量用来表明作者的意图,至少也应该是对一部分代码的
总结,而不应该是对代码的重复或者解释。对代码的重复或者解释的代码,看代码可能更容易理解。反映作者意图的注释解释代码的目的,从解决问题的层次上进行
注释,而代码总结性注释则是从问题的解答的层次上进行注释。

推荐的写注释的过程是首先使用注释勾勒出代码的主要框架,然后根据注释撰写相应的代码。对各种主要的数据结构、输出的函数、多个函数公用的变量进行详细地注释。对代码中控制结构,单一目的的语句集进行注释。下面是一些写注释时需要注意的要点:
避免对单独语句进行注释;
通过注释解释为什么这么做、或者要做什么,使代码的读者可以只阅读注释理解代码;
对读者可能会有疑问的地方进行注释;
对数据定义进行注释,而不是对其使用过程进行注释;
对于难于理解的代码,进行改写,而不要试图通过注释加以说明;
对关键的控制结构进行注释;
对数据和函数的边界、使用前提等进行注释;

5. 参考资料


1. doxygen homepage
http://www.stack.nl/~dimitri/doxygen/

2. doxygen manual
http://www.stack.nl/~dimitri/doxygen/manual.html

3.
Code Complete: A Practical Handbook of Software Construction. Redmond,
Wa.: Microsoft Press, 880 pages, 1993. ISBN: 1-55615-484-4.

4. 简介doxygen
http://www.stack.nl/~dimitri/doxygen/doxygen_intro_cn.html

5. 10 Minutes to document your code
asp”>http://www.codeproject.com/tips/doxysetup.asp

6. 使用doxygen
http://www.csdn.net/Develop/article/16%5C16383.shtm

6. 关于作者
mounton {www.ihere.org} 当前关注于网络安全产品的开发、研究;软件开发过程等方面。您可以通过mount0nyahoo.com和他联系。

powered by performancing firefox

---

Google发布Web Toolkit

Google Web Toolkit (GWT)是一套基于Java的开发框架,它允许用户用Java语言来写页面前端,然后由GWT编译器转换为对应使用AJAX实现的JavaScript和HTML

http://code.google.com/webtoolkit/

---