博客

  • Visual Studio macro function for adding function header automatically

    You could use the macro function to add function header that could use by doxygen.

    It is tested in Visual studio 2008.

        Sub FunctionHeader()
            Dim objEditPt As EditPoint
            Dim currentLine As Integer
            Dim endline As Integer
            Dim findString As String
            Dim findString2 As String
            Dim firstPosition As Integer
            Dim voidPosition As Integer
            Dim BoolPosition As Integer
            Dim PtrPosition As Integer
            Dim lastPosition As Integer

     

            objEditPt = DTE.ActiveDocument.Selection.ActivePoint.CreateEditPoint
            currentLine = objEditPt.Line
            objEditPt.EndOfDocument()
            endLine = objEditPt.Line

            If (endLine > currentLine + 50) Then
                endLine = currentLine + 50
            End If

            findString = objEditPt.GetLines(currentLine, endLine)

            ‘get params with “(” and “)”
            findString2 = “”
            Dim strList As New System.Collections.ArrayList

            Dim findVoid As Boolean = False
            Dim findBool As Boolean = False
            Dim findPtr As Boolean = False

            firstPosition = InStr(findString, “(“)
            voidPosition = InStr(findString, “void”)
            BoolPosition = InStr(findString, “BOOL “)
            PtrPosition = InStr(findString, “* “)
            If (firstPosition >= 1) Then
                If (voidPosition >= 1 And voidPosition < firstPosition) Then
                    findVoid = True
                End If

                If (PtrPosition >= 1 And PtrPosition < firstPosition) Then
                    findPtr = True
                End If

                If (BoolPosition >= 1 And BoolPosition < firstPosition) Then
                    findBool = True
                End If

                lastPosition = InStr(firstPosition, findString, “)”)
                If (lastPosition >= firstPosition) Then
                    findString2 = Mid(findString, firstPosition + 1, lastPosition – firstPosition – 1)
                    strList.AddRange(findString2.Split(“,”c))
                End If
            End If

            DTE.ActiveDocument.Selection.NewLine()
            DTE.ActiveDocument.Selection.Text = “/**”
            DTE.ActiveDocument.Selection.NewLine()
            DTE.ActiveDocument.Selection.Text = “* ”
            DTE.ActiveDocument.Selection.NewLine()
            DTE.ActiveDocument.Selection.Text = “* ”
            DTE.ActiveDocument.Selection.NewLine()

            Dim listCount As Integer
            Dim newString As String

            listCount = strList.Count
            For Each stringElement In strList
                stringElement = Replace(stringElement, vbCr, “”)
                stringElement = Replace(stringElement, vbLf, “”)
                stringElement = Replace(stringElement, vbTab, ” “)
                stringElement = Trim(stringElement)
                If stringElement.Length <= 0 Then
                    Continue For
                End If

                Dim bAsIn = “[in] ”
                If InStr(stringElement, “*”) Then
                    bAsIn = “[out] ”
                End If

                newString = “* @param ” + bAsIn + stringElement + ” : ”
                DTE.ActiveDocument.Selection.Text = newString
                DTE.ActiveDocument.Selection.NewLine()
            Next

            DTE.ActiveDocument.Selection.Text = “* ”
            DTE.ActiveDocument.Selection.NewLine()

            If findVoid Then
                DTE.ActiveDocument.Selection.Text = “* @return void.”
                DTE.ActiveDocument.Selection.NewLine()
            ElseIf findBool Then
                DTE.ActiveDocument.Selection.Text = “* @return True success;”
                DTE.ActiveDocument.Selection.NewLine()
                DTE.ActiveDocument.Selection.Text = ”          False, failed;”
                DTE.ActiveDocument.Selection.NewLine()
            ElseIf findPtr Then
                DTE.ActiveDocument.Selection.Text = “* @return valid pointer; or NULL.”
                DTE.ActiveDocument.Selection.NewLine()
            Else
                DTE.ActiveDocument.Selection.Text = “* @return S_OK : the processing completed successfully;”
                DTE.ActiveDocument.Selection.NewLine()
                DTE.ActiveDocument.Selection.Text = “*         E_POINTER : a NULL pointer parameter was passed;”
                DTE.ActiveDocument.Selection.NewLine()
                DTE.ActiveDocument.Selection.Text = “*         E_FAIL : Some other failure occurred;”
                DTE.ActiveDocument.Selection.NewLine()
            End If

            DTE.ActiveDocument.Selection.Text = “* ”
            DTE.ActiveDocument.Selection.NewLine()
            DTE.ActiveDocument.Selection.Text = “*/”

        End Sub

  • 如何使用google的cpplint.py

    http://code.google.com/p/google-styleguide/ 这是google使用的一个C++代码风格规范,可以作为平常开发的参考。

    作为风格参考,google还推出了一个cpplint.py的脚本,可以用作风格规范检查使用。可以在这里下载

    http://google-styleguide.googlecode.com/svn/trunk/cpplint

    在windows下的使用方法也非常简单,(安装python后)把cpplint.py放在项目目录下,然后进入命令行,敲打命令如下:

    C:\temp\>cpplint.py –output=vs7 test1.cpp

    可以通过cpplint.py –help来查看帮助。注意,命令行参数都是两个横线(–)。

  • strlen与性能问题

    在Tony bai的博客上看到他提起strlen的性能问题,这还真是比较有意思的一个话题。

    我在前一阵专门用两周时间来对代码做优化,问题的起因是我们组有人提出来程序跑的慢,另外使用接口功能的外国同事也提起过几次。关于优化还专门做了一张ppt演示,有空节选一下分享出来。不过有意思的是,最后发现速度的最大瓶颈其实并不是在我们新加了多少功能,而是两方的客户端调用代码都写的太烂了,这种巧合都能碰到一起,太奇妙了。

    印象中BSD的kernal开发人员delphij也曾经提到过strlen,开起google一搜果然如此。strlen这个函数貌似简单容易写,但是里面的花花肠还真不少呢。这也间接的说明了阅读学习经典代码的重要性。

  • 一些google开源的项目介绍

    编程中,经常会用到一些开源库或者项目,比如c++中经常用到的boost。

    google的主要软件架构基于linux,c,c++,java,而且作为一个创新型的公司,他们也经常性的回馈社区一些优秀的代码。在不断的反馈修改中,代码质量得到了提高,用户得到优质服务,这也算是双赢的结果。而且google里面牛人多,写出来的代码质量相对比较高,有很大的学习价值。

    周末无事,搜索code.google.com/p,找到一些有趣的google参与的项目,在这里简单分享一下。有一些开源项目没有列出来,主要因为平台是linux-only或者对项目本身不感兴趣。如果想找完全列表,可以在这里看到:
    http://code.google.com/hosting/projects.html

    另外也可以使用google这个label来搜索code.google.com/p,但是这样也许搜出来的并不一定是google开发的项目。

    ———————————-

    http://code.google.com/p/omaha/

    这是最新放出来的google update的代码,想做windows在线update功能的可以参考。(c++)

    http://code.google.com/p/google-breakpad

    http://code.google.com/p/google-glog/

    breakpad,一个项目的开始需要做一些什么样的基础设施,crash dump和运行logging毫无疑问都是应该有的,这个项目就是负责在crash的时候收集信息,发出crash dump报告的。(c++)

    glog就是用于项目中logging功能的,一般桌面程序不太需要logging,但是对于大规模长时间服务的系统来说,logging功能一定要有,而且要记录足够多的信息。(c++)

    http://code.google.com/p/protobuf/

    protocol buffer,可以用来在跨进程、跨机器,不同操作系统,不同编程语言之间进行数据交换。类似于微软的COM IDL或者XML,但是解析速度更快,需要传输字节数更少。(c++, java, python)

    http://code.google.com/p/chromium/

    google chrome浏览器项目,基于webkit,想自己开发个浏览器,学习这个吧。(c++)

    http://code.google.com/p/google-perftools/

    TCMalloc,heap检测,是一个google用于性能检测的工具。(c++)

    http://code.google.com/p/jaikuengine/

    jaiku是被google收购的微博客服务,类似twitter,但是google买下了以后没有什么动作。在将jaiku移植到appengine平台以后就做出了开源而且不再继续开发的决定,jaiku也就这样了。当然,幸福的还是我们这些程序员。(python)

    http://code.google.com/p/googleappengine/

    这个只是appengine在桌面进行测试运行的项目,相比google服务器上的appengine,肯定还是有着相当大的区别。不过我们也可以从中学到google对于python的使用,不是么?(python)

    http://code.google.com/p/v8/

    google chrome浏览器中的javascript引擎项目。可以单独用作解析javascript,号称速度非常快。(c++)

    http://code.google.com/p/app-engine-site-creator/

    使用appengine建立企业及个人网站的朋友,可以试试这个项目。(python)

    http://code.google.com/p/googlemock/

    http://code.google.com/p/googletest/

    测试框架组合,mock怎么用实话说我也不清楚。

    http://code.google.com/p/google-styleguide/

    google c++编码规范,可以学习学习,网上有中文版的了。

    http://code.google.com/p/google-email-uploader

    outlook邮件上传到gmail,可以学学c#。

  • 墨脱

    对于西藏墨脱的印象大概从九几年就有了,那时候西藏还不是什么普遍的旅游概念。记得是在大连市图书馆借到的一本书,作者应该是个军人,书名中就有墨脱,但是名字已经记不住了。

    记得当时印象最深的是墨脱那里的人会给人下蛊,就作者知道的有个军队情报部门的军官,去墨脱出差只是喝了口水,回来就查出中毒了,现代医学对此毫无办法。

    最近看到“渐行渐远渐无书”的“徒步墨脱”系列文章,感觉颇有些心惊肉跳。里面有篇文字如下:

    这个善良美丽的女主人一个劲地给我们添酥油茶一个劲地说多喝点多喝点。但我始终觉得她美丽的脸上总有那么一股哀愁。要不然连微笑都是透着一种忧伤呢。
    至今我想起她,就忍不住难过。两年前(2004年),她去墨脱县城,门巴人用一种以你无法拒绝的热情与好客请你吃饭喝酒。回来后,她开始感觉到身体不适。之后,她去拉萨去成都都看过身体。血液中中了医生无法解释亦无药可医的毒。
    关于门巴人下毒的传说听了很多了。但我还是无法去相信,站在我面前的这个年轻女子是被门巴人下的毒。现在的医疗这么发达,难道还敌不过生活在原始森林里的门巴人土制的毒吗?但,她被门巴人下毒的事从她的嘴中一字一顿地说出来,我又无法不相信。
    传说,毒瘾发作从三个月到三年不等。也就是说,被下了毒,活不过三年。这位有两个孩子的年轻女子,她已经被病痛折磨了两年。那么等待她的岁月还有多少?(当我离开她的时候,我甚至有冲动,明年再到68K去看看,她是否还活着。)
    看她的文字,一路上基本上没有喝过一口门巴族人递上来的水,不管是不是传说,都挺可怕的。
    既然来到了毒村,就说说关于下毒的事吧。这一路来,我也听得够多了。下毒是为了夺福。

    你在门巴人家做客,他们看 你长得很有福气或很有佛相,他们就会对你下毒。他们会认为你死后你的福份就会转到他们身上。下毒的都是女人,代代相传,男人无法知晓。她们把毒种在指甲缝 里,趁你不备,将毒品施到你的酒杯里或茶杯里。你必须得死。如果你不死,下毒的人就得毒死自己的儿子或丈夫,如果自己的亲人不被毒死,那么她就要把自己毒 死。毒药发作分快慢,快则三分钟之内当场毙命。慢则三个月,三年。总之过不了三年。我对毒药的成份比较好奇。据说是从复杂的植物中提炼出来的。你不觉得很 神奇么?这些原始的地方竟然可以通过毒药的剂量来控制毒药发作的日期。而且,被下毒者被下了毒后还毫无所知。当你发现自己身体莫名异样时,还无证可查。甚 至连这么发达的现代医疗都无法拯救那些中毒的人。下毒的人还不能被发现,如果被发现,她的下场是极其悲惨的,她的手指将被钉上竹签扔到河里去自生自灭。到 了施毒者知道被毒者要死的时候,他们还会举行盛大的仪式,披头散发,涂上植物汁液,围着火堆一边念经一边跳舞,感谢毒神赐予福祉。巫术一旦被宗教化,就变 成了恐怖的信仰。
    我是不敢去的,不过不妨碍我跟随着作者的文字,去探寻那个神奇的土地。