• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            tqsheng

            go.....
            隨筆 - 366, 文章 - 18, 評論 - 101, 引用 - 0
            數據加載中……

            wikidpad


            項目MyBaseWikidPad備注
            費用收費,可破解開源,免費 
            中文支持OKOK 
            全文搜索OKOK 
            所見即所得OKNO 
            鏈接及圖片OKOK 
            自動ToDoNOOK 
            Tag及各種視圖TagTag+視圖 
            分支&頁面加密OKNO保密內容用附件加密
            數學公式NOOK(Mimetex,插件) 
            代碼著色NOOK(Prettycode,插件) 
            導出無法連附件導出,導出為一組文件可導出附件,且導出后仍為一個閱讀系統 
            文件格式私有TXT多文件可選為文件系統
            附件管理數據庫+鏈接鏈接 
            文本格式豐富一般,可滿足需求 
            表格不好用滿足需求 
            節點管理節點方式子頁面 
            向量圖NOOK(GraphVic,插件) 
            函數圖NOOK(GNUplot,插件) 

            必備插件

            http://trac.wikidpad2.webfactional.com/wiki/ListOfUserScripts
            • Prettycode: Syntax highlighting for many languages using Pygments.
            • Edit Extensions: Add some edit functionality to Wikidpad
            • TodoExtension: Collect todo item in a page. http://www.ziemski.net/wikidpad/todo_extension.html
            • Colorizer: Colorize text selection via font tags in different colors
            • InsertSymbols2: Pop-up window to insert user-defined symbols in Wikidpad editor 

            外部程序

            WikidPad的強大之處在于可以使用集成使用一些強大的工具,以豐富其功能。
            • 如何使用MimeTex:數學公式
            • 如何使用GrapViz:向量圖和非向量圖
            • 如何使用GNUplot:函數圖

            TIP

            如何使用ToDo

            <<
            todo開始時,記錄條目.
                * todo.項目名:[發起日期][預計完成日期][推遲次數]todo項目內容. 
             todo完成時,記錄條目.
                * done.項目名:[發起日期][預計完成日期][實際完成日期][推遲次數]todo項目內容.
                * 完成過程與內容描述.
                * 相關鏈接.
            >>

            posted @ 2012-07-29 13:33 tqsheng 閱讀(328) | 評論 (0)編輯 收藏

            效率

            http://blog.macro2.org/?p=644 

            posted @ 2012-07-23 09:33 tqsheng 閱讀(108) | 評論 (0)編輯 收藏

            抓視頻的圖



            要抓視頻的圖只需要把windows的顯示設置硬件加速設無就可以了

            posted @ 2012-07-22 20:28 tqsheng 閱讀(124) | 評論 (0)編輯 收藏

            一些軟件

            NoteExpress和Endnote文獻管理軟件Magic Notes 3.5 Build 10281
            桌面提醒 Desktop-Reminder 2.54
            ToDoList
            GoodSync - 真正實用的本地雙向文件同步工具 (自動備份利器,支持U盤/移動硬盤/FTP)
            pnotes
            Rainlendar
            rednotebook
            wikidpad

            posted @ 2012-07-19 22:40 tqsheng 閱讀(155) | 評論 (0)編輯 收藏

            SE的按需顯示----強啊,贊一個

            SE的按需顯示----強啊,贊一個

            2006-06-02

            版權聲明:轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明
            http://birdnest.blogbus.com/logs/2626856.html

            今天心情好,再加多一篇:
            讀過復雜代碼的人都有這種體會:如果能夠把一個函數或者一個文件里面已經看過的,或者不重要的部分隱藏起來,這樣整個函數(文件)的結構就會看得更清晰,讀起來也就更加容易。

            SourceInsight號稱代碼查看之王,卻沒有這個功能,UE也是從11版以后才提供的。不過SE不僅有這個功能而且非常之強大,UE的那些在它面前只能算小兒科了。

            1. 隱藏某個大括號內的內容
            這個UE是有的,SE中的操作為:將光標放到所需隱藏的大括號內的任意位置,然后選擇菜單View-> Hide Code Block即可。

            2. 隱藏選中的某個區域
            這個UE也是有的,SE中的操作為:先選取一塊區域,然后選擇菜單View-> Hide Selection

            3. 隱藏注釋內容
            良好的注釋雖然好,不過有時候太多的注釋也會影響查看,讓我們把它藏起來先。
            UE也有這個,不過它的這個功能和它隱藏大括號是很類似的,那就是只能隱藏/*….*/的多行注釋,對于連續的//單行注釋就不成了,呵呵
            SE就可以Handle這個啦,對于不論哪種方式的注釋,都可以采用隱藏大括號的方法來隱藏,而且更加強悍的是,它可以一次性隱藏所有注釋而不影響其他的查看,這個UE就只能流口水啦,呵呵
            隱藏所有注釋的方法:選擇菜單View-> Hide All Comment

            4. 函數頭顯示
            如何輕松快速的在文件里面找到所需要的函數呢,當然是把所有的函數頭列在那里讓你挑啦。UE里面只能用“全部折疊”來勉強實現,但是還有很有多#define,全局變量,//的注釋等等殘留在那里,實在是。。。。。。
            SE的函數頭顯示功能這時可就大派用場了,選擇菜單View-> Function Heading,看看,
            除了函數頭以外,什么都沒有了,干干凈凈,所有的函數實在是一目了然啊。

            5. 有選擇的顯示
            最后再來說說SE獨一無二的也是最強大的功能Selective Display,定制顯示內容。呵呵,看名字是不是就覺得很強呢?
            選擇菜單View-> Selective Display出現如下界面


            這里列出了6種可選擇的顯示方式,我們一種種來:
            Ⅰ. Search Text
            只顯示(或者隱藏)符合搜索內容的行。這個強啊,可以讓我們用最快的速度找到我們所需要的東西所在的行。
            下面的輸入框可以輸入要搜索的內容,下面還有幾個復選框,左邊3個是一般搜索常見的大小寫吻合,整個詞吻合,使用正則表達式。
            右邊第一個”Reset selective display”則是在這次搜索前先清除以前所隱藏的東西,恢復到完全顯示狀態再執行搜索操作。否則可以在上次的基礎上再次隱藏新的內容。
            第二個則是決定隱藏搜索到的行,抑或只顯示搜索到的行。

            Ⅱ. Function definitions

            只顯示所有的函數頭(定義),這里和我們前面說的Function Heading類似,不過在這里可以追加顯示每個函數上面的注釋內容。使用了這個,我們的.c文件也可以變成.h文件了,^_^
            下面有2個復選框,
            “Show comments” 顯示完整的函數頭注釋
            “Collapse comments” 注釋只顯示第一行,想看完整的可自行點擊展開

            Ⅲ. Preproessor directives

            這個超贊啊!!!!!!
            根據你的預定義,只顯示編譯器能看到的部分。也就是說當你有很多功能模塊分別都用#ifdef FEATURE_XXXX框起來的話,如果其中某個FEATURE沒有被預定義的話,它將不會被顯示出來!!!!!
            用這個看那種預定義功能超多的操作系統代碼,或者多模塊的復雜代碼實在是太方便了,我以前看代碼就最煩里面N多多#ifdef XXXX的了,也不知道哪段代碼才是真正有用了,有了這個,終于可以解放了啊,hoho。
            在下面的輸入框中,可以輸入你要隱藏的預定義的內容,可以包含多個,如果你不記得定義的名字了,還可以用”Scan for Defines” 按鈕來幫你搜索(作者實在太體貼啦)。
            如果不指定的話,所有在#ifdef …#endif 中的內容都將被隱藏。

            Ⅳ. Multi-level

            這個則是按照嵌套層次進行隱藏,有2種選擇Brace(大括號)和Indentation(縮進)。
            選擇大括號則是關閉所有的大括號,就跟UE的全部關閉類似,
            縮進則是關閉所有的縮進,呵呵,這次連單行的if..else..語句的內容也可以隱藏了。
            Limit levels可以指定關閉深度,當你的嵌套很深時,你如果要打開就得點很多次了,這里就可以指定一個深度,超過這個深度的就作為一個整體不會再被關閉了。

            Ⅳ.Ⅴ 后面2個比較簡單,就不仔細介紹了
            Pragraphs:只顯示所有段落的第一行
            Hide Selection:和剛才最前面講過的隱藏選區是一樣的。

            最后,下面3個單選框是用來指定你進行展開一個多重嵌套時的操作的
            Expand:展開時自動展開所有的子項
            Collapse:只展開下層中的第一層
            Remember:恢復到關閉前的狀態

            看到這里,你對SE的強大是否又有了新的了解了呢,是否激起你更換編輯器的沖動了呢,呵呵,不要猶豫,趕快也去整一個來試用試用吧,你一定會愛上它的。

            posted @ 2012-07-17 12:21 tqsheng 閱讀(336) | 評論 (0)編輯 收藏

            Doxygen + Graphviz + Htmlhelp, 成為文檔好手

            1 doxygen是大名鼎鼎代碼文檔工具。

            下載地址:www.doxygen.org

            安裝它。http://www.stack.nl/~dimitri/doxygen/download.html 可下載.

             

            2 Graphviz

            這個工具配合doxygen使用,可以提取函數,模塊之間的調用關,非常清晰。

            下載地址:http://www.graphviz.org/Download..php 

            下面是Graphviz提取出來的一些關系圖:

                

             
              

             


            3 htmlhelp

            這個工具把doxygen生成的html文件,轉化為一個CHM文件,看起來方便些。

             下載地址:

            http://www.microsoft.com/downloads/details.aspx?FamilyID=00535334-c8a6-452f-9aa0-d597d16580cc&displaylang=en

            安裝它。

             

            全部安裝后就可以開始使用了。

            運行doxygen wizard.exe

                 運行doxywizard.exe,這時按照doxygen根目錄下的文檔(doxygen_manual-1.5.2.chm)中 Doxywizard usage一節的說明設置即可。主要包括,源碼路徑、工作路徑、輸出路徑等。

            點開始,即可生成文檔

             

            最后對文檔生成過程中遇到的一些問題進行說明:

             

            1 中文問題:中文注釋在文檔中是亂碼。
            解決:在expert中的INPUT選項頁的
            INPUT_ENCODEING中填入“GB2312”,這樣基于GB的文本編輯器生成的代碼就可以正常使用了。

             

            2 圖形問題:無法繪制類圖協作圖等圖形。
            首先確保安裝了graphviz,注意不是wingraphviz,后者是一個graphviz的com封裝,但是doxygen并不是基于它開發的,所以裝了也沒用。然后在 expert的Dot頁
            DOT_PATH中填入graphviz的安裝路徑。接著在wizard的diagram中選擇需要生成的圖形類別就可以了。

            如果出現無法包含.map文件的錯誤,可以將工作目錄設置成html,并將html中所有文件都清除再試。這個問題的原因還不太確定。

             

            3 輸出chm的問題:如何輸出.chm文件
            1. 你必須安裝微軟或其相兼容的chm編譯系統。通常為HTML Help Workshop。

            2. 首先在[Wizard]的Output頁面中,選擇HTML,然后選擇到prepare for compressed HTML(.chm)。

            3. 其次在[Expert]的HTML頁面中,將HHC_LOCATION指向微軟的hhc工具。通常為C:/Program Files/HTML Help Workshop/hhc.exe。然后點擊OK,保存,編譯即可。

             

            HHC_LOCATION中輸入hhc.exe文件的路徑。hhc.exe可以通過安裝HTML Help Workshop獲得。

             

            4 如何像MSDN那樣在左邊的樹中顯示函數列表?
            打開[Expert]的HTML頁面,然后選中
            TOC_EXPAND即可。

             

            5 如何去掉CHM附帶的CHI文件?
            注 意在默認情況下,CHM會有一個CHI文件,似乎是用來加速索引的。我本人也遇到過很多用戶僅僅上傳了CHM,而沒有上傳CHI文件,導致無法正常顯示的 情況。我不知道是否可以通過工具重建CHI文件,但是我覺得關閉這個功能即可。打開[Expert]的HTML頁面,取消
            GENERATE_CHI 即可。

             

            6 如何像MSDN那樣右邊每頁顯示一個函數?

            這 個問題其實比較棘手,在[Expert]中的 Project頁面,下面有一個選項叫做SEPARATE_MEMBER_PAGES,把這個選項選中,這樣每個函數就是一個頁。但是會有一個問題,那就 是右邊頁面的旁邊多了所有函數的列表。很遺憾,經過研究,這個確實無法去掉。我的解決方法就是自己編譯一下doxygen,在 memberlist.cpp的writeDocumentationPage函數中將 container->writeQuickMemberLinks(ol,md);連同附近幾行屏蔽掉即可。

             

            7 如何在CHM中去掉當選擇SUBGROUPING后去掉分組的組信息?

            這 個功能就是在chm的左邊樹中直接列出函數列表,而不用點擊看右邊頁面了。這個功能需要修改源代碼。在index.cpp中,屏蔽 writeGroupIndexItem函數的 Doxygen::indexList.addContentsItem,Doxygen::indexList.incContentsDepth和 Doxygen::indexList.decContentsDepth();即可。

             

            8 如何修改或者去掉右下腳Generated at ...的文字?

            打 開[Expert...]的HTML頁面,然后在HTML_FOOTER中指定相應的HTML文件即可。注意HTML_FOOTER中至少包含BODY和 HTML結束標記。即一個最小的尾部HTML至少是這樣</BODY></HTML>。同理,如果你要指定了 HTML_HEADER,他至少包含<HTML><HEAD></HEAD><BODY>

             

            9 如何生成組?

            組 就是可以把同類的函數放到一個根下的顯示方式。doxygen支持grouping,即你可以把相關的代碼通過標志,放到同一個組中,便于查看。這主要是 通過幾個內置語法命令。首先通過@defgroup定義一個組,然后要把分組的函數或者類等,通過標志@ingroup加入相應的組。這樣,相應的函數就 被放置在同一個組中。

             

            10 如何生成中文幫助?

            點擊[Expert],在頁Project 的OUTPUT_LANGUAGE,選擇Chinese,這樣輸出的幫助提示信息就是中文。具體中文提示信息的文字在源代碼中。

             

            11 如何徹底解決DoxyGen的輸出中文chm的亂碼問題?
            DoxyGen的實現中大概有三處編碼的設置。首先是,doxyfile,也就是配置文件。其次,INPUT_ENCODING,也就是DoxyGen需要解析的輸入文件的編碼。最后,就是輸出的編碼。譬如CHM左邊的索引編碼。

            首先是chm的標題亂碼,這個比較好解決,因為DoxyWizard使用QT做的界面,它內部做了轉換,所以在DoxyWizard中輸入中文,在保存的時 候,他自己做了轉碼,導致doxyfile中的最終的保存信息不正確。這個時候只需要用記事本打開doxyfile配置文件,輸入相應中文即可。注意保存 的時候保存成ANSI編碼即可。保存成其他格式的話可能需要去掉BOM,比較麻煩,沒研究了。這個相應的編碼設置在[Expert...]中,頁 Project 的 DOXYFILE_ENCODING,不輸入或者默認為UTF-8都行。

            其次是右邊內容亂碼,這個多半是因為你沒有配置好輸入的文件編碼類型造成的。在[Expert...]的Input頁面中,有一個 INPUT_ENCODING,這個選項表示輸入文件的編碼方式,這要和你處理的源文件格式一致。對于我們來說(使用vs的人),一般設置為 GB2312。當然,再次聲明,編碼方式取決于源文件的編碼方式。如果文件編碼已經是UTF-8了,然而你還將其設置成GB2312,那么DoxyGen 會將UTF-8當成ANSI再進行一次UTF-8轉換,自然會出錯了。

            最后也是經常遇到的問題就是DoxyGen生成的CHM文件的左邊樹目錄的中文變成了亂碼。這個只需要將chm索引的編碼類型修改為GB2312即可。在 HTML的CHM_INDEX_ENCODING中輸入GB2312即可。然而這種方法下,還有一個瑕疵之處,就是chm的搜索頁的搜索結果中顯示的中文 文字卻變成亂碼了。這是因為DoxyGen默認開啟了HTML Help Workshop的Full-text search全文搜索選項,他在進行全文搜索的時候,應該是打開文件然后按照ANSI進行搜索的,(資料表示HHW不支持UTF-8,僅支持ISO- 8859-1或者windows-1252編碼。)而Doxygen生成的右邊界面統一是UTF-8,這自然出現了問題。而在這種情況下做全文搜索,理論 上只能搜索英文。

                    我們的解決方案只能是重新編譯DoxyGen代碼,為了滿足搜索,只要保證右邊的頁面文件不是UTF-8即可。我們首先修改 writeDefaultHeaderFile這個函數的代碼,將其charset=GB2312。然后在 TranslatorDecoder的構造函數中修改m_toUtf8 = (void*)-1;即屏蔽文本寫入時最終的轉換函數。最后刪除INPUT_ENCODING的設置或者輸入UTF-8。這樣會使DoxyGen認為我們 的文本是UTF-8的,從而不用進行轉換。生成替換原始的DoxyGen即可。

            另外需要補充的是,還有一種方案是不用修改作者的源代碼,但是需要將DoxyGen生成的右邊的HTML文件使用工具(如iconv)手工轉換成GB2312,然后再使用HTML Help Workshop生成,網上有篇文章介紹過,我測試一下,也是沒有問題的。

                 

              最后,doxygen是一個開源項目,并且支持vs2005項目,這樣一來,如果你覺得哪里不順手,完全可以把代碼下載后自行編譯。

                    這樣,基本上就能夠用doxygen生成漂亮的文檔了。代碼方面,doxygen支持多種格式的注釋風格,根據manual選擇自己喜歡的就好。

            1 doxygen是大名鼎鼎代碼文檔工具。

            下載地址:www.doxygen.org

            安裝它。http://www.stack.nl/~dimitri/doxygen/download.html 可下載.

             

            2 Graphviz

            這個工具配合doxygen使用,可以提取函數,模塊之間的調用關,非常清晰。

            下載地址:http://www.graphviz.org/Download..php 

            下面是Graphviz提取出來的一些關系圖:

                

             
              

             


            3 htmlhelp

            這個工具把doxygen生成的html文件,轉化為一個CHM文件,看起來方便些。

             下載地址:

            http://www.microsoft.com/downloads/details.aspx?FamilyID=00535334-c8a6-452f-9aa0-d597d16580cc&displaylang=en

            安裝它。

             

            全部安裝后就可以開始使用了。

            運行doxygen wizard.exe

                 運行doxywizard.exe,這時按照doxygen根目錄下的文檔(doxygen_manual-1.5.2.chm)中 Doxywizard usage一節的說明設置即可。主要包括,源碼路徑、工作路徑、輸出路徑等。

            點開始,即可生成文檔

             

            最后對文檔生成過程中遇到的一些問題進行說明:

             

            1 中文問題:中文注釋在文檔中是亂碼。
            解決:在expert中的INPUT選項頁的
            INPUT_ENCODEING中填入“GB2312”,這樣基于GB的文本編輯器生成的代碼就可以正常使用了。

             

            2 圖形問題:無法繪制類圖協作圖等圖形。
            首先確保安裝了graphviz,注意不是wingraphviz,后者是一個graphviz的com封裝,但是doxygen并不是基于它開發的,所以裝了也沒用。然后在 expert的Dot頁
            DOT_PATH中填入graphviz的安裝路徑。接著在wizard的diagram中選擇需要生成的圖形類別就可以了。

            如果出現無法包含.map文件的錯誤,可以將工作目錄設置成html,并將html中所有文件都清除再試。這個問題的原因還不太確定。

             

            3 輸出chm的問題:如何輸出.chm文件
            1. 你必須安裝微軟或其相兼容的chm編譯系統。通常為HTML Help Workshop。

            2. 首先在[Wizard]的Output頁面中,選擇HTML,然后選擇到prepare for compressed HTML(.chm)。

            3. 其次在[Expert]的HTML頁面中,將HHC_LOCATION指向微軟的hhc工具。通常為C:/Program Files/HTML Help Workshop/hhc.exe。然后點擊OK,保存,編譯即可。

             

            HHC_LOCATION中輸入hhc.exe文件的路徑。hhc.exe可以通過安裝HTML Help Workshop獲得。

             

            4 如何像MSDN那樣在左邊的樹中顯示函數列表?
            打開[Expert]的HTML頁面,然后選中
            TOC_EXPAND即可。

             

            5 如何去掉CHM附帶的CHI文件?
            注 意在默認情況下,CHM會有一個CHI文件,似乎是用來加速索引的。我本人也遇到過很多用戶僅僅上傳了CHM,而沒有上傳CHI文件,導致無法正常顯示的 情況。我不知道是否可以通過工具重建CHI文件,但是我覺得關閉這個功能即可。打開[Expert]的HTML頁面,取消
            GENERATE_CHI 即可。

             

            6 如何像MSDN那樣右邊每頁顯示一個函數?

            這 個問題其實比較棘手,在[Expert]中的 Project頁面,下面有一個選項叫做SEPARATE_MEMBER_PAGES,把這個選項選中,這樣每個函數就是一個頁。但是會有一個問題,那就 是右邊頁面的旁邊多了所有函數的列表。很遺憾,經過研究,這個確實無法去掉。我的解決方法就是自己編譯一下doxygen,在 memberlist.cpp的writeDocumentationPage函數中將 container->writeQuickMemberLinks(ol,md);連同附近幾行屏蔽掉即可。

             

            7 如何在CHM中去掉當選擇SUBGROUPING后去掉分組的組信息?

            這 個功能就是在chm的左邊樹中直接列出函數列表,而不用點擊看右邊頁面了。這個功能需要修改源代碼。在index.cpp中,屏蔽 writeGroupIndexItem函數的 Doxygen::indexList.addContentsItem,Doxygen::indexList.incContentsDepth和 Doxygen::indexList.decContentsDepth();即可。

             

            8 如何修改或者去掉右下腳Generated at ...的文字?

            打 開[Expert...]的HTML頁面,然后在HTML_FOOTER中指定相應的HTML文件即可。注意HTML_FOOTER中至少包含BODY和 HTML結束標記。即一個最小的尾部HTML至少是這樣</BODY></HTML>。同理,如果你要指定了 HTML_HEADER,他至少包含<HTML><HEAD></HEAD><BODY>

             

            9 如何生成組?

            組 就是可以把同類的函數放到一個根下的顯示方式。doxygen支持grouping,即你可以把相關的代碼通過標志,放到同一個組中,便于查看。這主要是 通過幾個內置語法命令。首先通過@defgroup定義一個組,然后要把分組的函數或者類等,通過標志@ingroup加入相應的組。這樣,相應的函數就 被放置在同一個組中。

             

            10 如何生成中文幫助?

            點擊[Expert],在頁Project 的OUTPUT_LANGUAGE,選擇Chinese,這樣輸出的幫助提示信息就是中文。具體中文提示信息的文字在源代碼中。

             

            11 如何徹底解決DoxyGen的輸出中文chm的亂碼問題?
            DoxyGen的實現中大概有三處編碼的設置。首先是,doxyfile,也就是配置文件。其次,INPUT_ENCODING,也就是DoxyGen需要解析的輸入文件的編碼。最后,就是輸出的編碼。譬如CHM左邊的索引編碼。

            首先是chm的標題亂碼,這個比較好解決,因為DoxyWizard使用QT做的界面,它內部做了轉換,所以在DoxyWizard中輸入中文,在保存的時 候,他自己做了轉碼,導致doxyfile中的最終的保存信息不正確。這個時候只需要用記事本打開doxyfile配置文件,輸入相應中文即可。注意保存 的時候保存成ANSI編碼即可。保存成其他格式的話可能需要去掉BOM,比較麻煩,沒研究了。這個相應的編碼設置在[Expert...]中,頁 Project 的 DOXYFILE_ENCODING,不輸入或者默認為UTF-8都行。

            其次是右邊內容亂碼,這個多半是因為你沒有配置好輸入的文件編碼類型造成的。在[Expert...]的Input頁面中,有一個 INPUT_ENCODING,這個選項表示輸入文件的編碼方式,這要和你處理的源文件格式一致。對于我們來說(使用vs的人),一般設置為 GB2312。當然,再次聲明,編碼方式取決于源文件的編碼方式。如果文件編碼已經是UTF-8了,然而你還將其設置成GB2312,那么DoxyGen 會將UTF-8當成ANSI再進行一次UTF-8轉換,自然會出錯了。

            最后也是經常遇到的問題就是DoxyGen生成的CHM文件的左邊樹目錄的中文變成了亂碼。這個只需要將chm索引的編碼類型修改為GB2312即可。在 HTML的CHM_INDEX_ENCODING中輸入GB2312即可。然而這種方法下,還有一個瑕疵之處,就是chm的搜索頁的搜索結果中顯示的中文 文字卻變成亂碼了。這是因為DoxyGen默認開啟了HTML Help Workshop的Full-text search全文搜索選項,他在進行全文搜索的時候,應該是打開文件然后按照ANSI進行搜索的,(資料表示HHW不支持UTF-8,僅支持ISO- 8859-1或者windows-1252編碼。)而Doxygen生成的右邊界面統一是UTF-8,這自然出現了問題。而在這種情況下做全文搜索,理論 上只能搜索英文。

                    我們的解決方案只能是重新編譯DoxyGen代碼,為了滿足搜索,只要保證右邊的頁面文件不是UTF-8即可。我們首先修改 writeDefaultHeaderFile這個函數的代碼,將其charset=GB2312。然后在 TranslatorDecoder的構造函數中修改m_toUtf8 = (void*)-1;即屏蔽文本寫入時最終的轉換函數。最后刪除INPUT_ENCODING的設置或者輸入UTF-8。這樣會使DoxyGen認為我們 的文本是UTF-8的,從而不用進行轉換。生成替換原始的DoxyGen即可。

            另外需要補充的是,還有一種方案是不用修改作者的源代碼,但是需要將DoxyGen生成的右邊的HTML文件使用工具(如iconv)手工轉換成GB2312,然后再使用HTML Help Workshop生成,網上有篇文章介紹過,我測試一下,也是沒有問題的。

                 

              最后,doxygen是一個開源項目,并且支持vs2005項目,這樣一來,如果你覺得哪里不順手,完全可以把代碼下載后自行編譯。

                    這樣,基本上就能夠用doxygen生成漂亮的文檔了。代碼方面,doxygen支持多種格式的注釋風格,根據manual選擇自己喜歡的就好。

            posted @ 2012-07-15 15:58 tqsheng 閱讀(560) | 評論 (0)編輯 收藏

            用 Graphviz 可視化函數調用

            用 Graphviz 可視化函數調用

            使用開源軟件來簡化復雜調用結構

            M. Tim Jones, 資深軟件工程師, Emulex

            簡介: 花一些時間遍歷一下源代碼,可以向您展現所有的函數調用過程;但是如果函數指針非常復雜,或者代碼太長且晦澀難懂,那么這個過程就可能更加困難了。本文將向您介紹如何使用開源軟件和一些定制的代碼來構建一個動態的圖形函數調用生成器。

            本文的標簽:  代碼庫圖形化開放源碼調試

            發布日期: 2005 年 7 月 11 日 
            級別: 初級 
            訪問情況 : 12381 次瀏覽 
            評論: 1 (查看 | 添加評論 - 登錄)

            平均分 5 星 共 19 個評分 平均分 (19個評分)
            為本文評分

            可以將以圖形形式查看應用程序的調用過程看作是一個學習經歷。這樣做可以幫助您理解應用程序的內部行為,并獲得有關程序優化方面的信息。例如,通過對那些經常調用的函數進行優化,您就可以用最少的努力來獲得最佳的性能。另外,調用跟蹤還可以判斷用戶函數的最大調用深度,這可以用來對調用棧使用的內存進行有效限制(在嵌入式系統中,這是非常重要的一個考慮因素)。

            為了捕獲并顯示調用圖,您需要 4 個元素:GNU 編譯器工具鏈、Addr2line 工具、定制的中間代碼和一個名為 Graphviz 的代碼。Addr2line 工具可以識別函數、給定地址的源代碼行數和可執行映像。定制的中間代碼是一個非常簡單的工具,它可以減少對圖形規范的地址跟蹤。Graphviz 工具可以生成圖形映像。整個過程如圖 1 所示。


            圖 1. 搜集、簡化和可視化跟蹤路徑的過程
            跟蹤過程 

            數據搜集:捕獲函數調用路徑

            要收集一個函數調用的蹤跡,您需要確定每個函數在應用程序中調用的時間。在過去,都是通過在函數的入口處和退出處插入一個惟一的符號來手工檢測每個函數的。這個過程非常繁瑣,而且很容易出錯,通常需要對源代碼進行大量的修改。

            幸運的是,GNU 編譯器工具鏈(也稱為 gcc)提供了一種自動檢測應用程序中的各個函數的方法。在執行應用程序時,就可以收集相關的分析數據。您只需要提供兩個特殊的分析函數即可。其中一個函數在每次執行想要跟蹤的函數時都會調用;而另外一個函數則在每次退出想要跟蹤的函數時調用(參見清單 1)。這兩個函數都是特別指定的,因此,編譯器可以識別它們。


            清單 1. GNU 的入口和出口配置函數
            				 void __cyg_profile_func_enter( void *func_address, void *call_site )                                 __attribute__ ((no_instrument_function)); void __cyg_profile_func_exit ( void *func_address, void *call_site )                                 __attribute__ ((no_instrument_function)); 

            避免使用特殊的檢測函數

            您或許會產生疑惑,如果 gcc 就是我們需要的檢測函數,那么為什么它不檢測__cyg_* 分析函數呢?gcc 的開發者曾思考過這個問題,他們提供了一個名為no_instrument_function 的函數屬性,這個函數屬性可以應用于函數原型,禁止對它們進行檢測。不要將這個函數屬性應用到分析函數上,這樣會導致無限遞歸分析循環和大量的無用數據。

            在調用一個檢測函數時,__cyg_profile_func_enter 同時也會被調用,并以 func_address 形式傳遞調用的函數地址,以及從中調用該函數的 call_site 形式的地址。反之,當一個函數退出時,也會調用__cyg_profile_func_exit 函數,并傳遞 func_address 形式的函數地址,以及函數從中退出的真實地址,該地址的表示形式為 call_site

            在這些分析函數中,您可以記錄下地址對,以供以后再進行分析使用。要請求 gcc 所有的檢測函數,每個文件都必須使用 -finstrument-functions 和 -g選項進行編譯,這樣可以保留調試符號。

            因此,現在您就可以為 gcc 提供一些分析函數了,這些函數可以透明地插入應用程序中的函數入口點和函數退出點。但在調用分析函數時,又應該怎樣處理所提供的地址呢?您有很多選擇,但是為了簡便起見,可以將這個地址簡單地寫入一個文件,要注意哪個地址是函數的入口地址,哪個地址是函數的出口地址(參見清單 2)。

            注意:在清單 2 中并沒有使用調用 Callsite 信息,因為這些信息對于分析程序來說是不必要的。


            清單 2. 分析函數
            				 void __cyg_profile_func_enter( void *this, void *callsite ) {   /* Function Entry Address */   fprintf(fp, "E%p\n", (int *)this); } void __cyg_profile_func_exit( void *this, void *callsite ) {   /* Function Exit Address */   fprintf(fp, "X%p\n", (int *)this); } 

            現在您可以搜集分析數據了,但是您應該在什么地方打開或關閉您的跟蹤輸出文件呢?到現在為止,還不需要為了進行分析而對源程序進行任何修改。因此,您該如何檢測整個應用程序(包括 main 函數)而不用對分析數據的輸出結果進行初始化呢?gcc 的開發者也考慮過這個問題,它們為 main 函數的 constructor 函數和 destructor 函數提供了一些碰巧能夠滿足這個要求一些方法。constructor 函數是在調用 main 函數之前調用的,而 destructor 函數則是在應用程序退出時調用的。

            要創建 constructor 和 destructor 函數,則需要聲明兩個函數,然后對這兩個函數應用constructor 和 destructor 函數屬性。在 constructor 函數中,會打開一個新的跟蹤文件,分析數據的地址跟蹤就是寫入這個文件的;在 destructor 函數中,會關閉這個跟蹤文件(參見清單 3)。


            清單 3. 分析 constructor 和 destructor 函數
            				 /* Constructor and Destructor Prototypes */ void main_constructor( void ) 	__attribute__ ((no_instrument_function, constructor)); void main_destructor( void ) 	__attribute__ ((no_instrument_function, destructor)); /* Output trace file pointer */ static FILE *fp; void main_constructor( void ) {   fp = fopen( "trace.txt", "w" );   if (fp == NULL) exit(-1); } void main_deconstructor( void ) {   fclose( fp ); } 

            如果編譯分析函數(在 instrument.c)并將它們與目標應用程序鏈接在一起,然后再執行目標應用程序,結果會生成一個應用程序的調用追蹤,追蹤記錄被寫入 trace.txt 文件。跟蹤文件與調用的應用程序處于相同的目錄中。最終結果是,您可能會得到一個其中滿是地址的非常大的文件。為了能夠讓這些數據更有意義,您可以使用一個不太出名的叫做 Addr2line 的 GNU 工具。

            回頁首

            使用 Addr2line 將函數地址解析為函數名

            Addr2line 工具(它是標準的 GNU Binutils 中的一部分)是一個可以將指令的地址和可執行映像轉換成文件名、函數名和源代碼行數的工具。這種功能對于將跟蹤地址轉換成更有意義的內容來說簡直是太棒了。

            要了解這個過程是怎樣工作的,我們可以試驗一個簡單的交互式的例子。(我直接從 shell 中進行操作,因為這是最簡單地展示這個過程的方法,如清單 4 所示。)這個示例 C 文件(test.c)是通過 cat 一個簡單的應用程序實現的(也就是說,將標準輸出的文本重定向到一個文件中)。然后使用 gcc 來編譯這個文件,它會傳遞一些特殊的選項。首先,要(使用 -Wl選項)通知鏈接器生成一個映像文件,并(使用 -g 選項)通知編譯器生成調試符號。最終生成可執行文件 test。得到新的可執行應用程序之后,您就可以使用 grep 工具在映像文件中查找 main 來尋找它的地址了。使用這個地址和 Addr2line 工具,就可以判斷出函數名(main)、源文件(/home/mtj/test/test.c)以及它在源文件中的行號(4)。

            在調用 Addr2line 工具時,要使用 -e 選項來指定可執行映像是 test。通過使用 -f 選項,可以告訴工具輸出函數名。


            清單 4. addr2line 的一個交互式例子
            				 $ cat >> test.c #include <stdio.h> int main() {   printf("Hello World\n");   return 0; } <ctld-d> $ gcc -Wl,-Map=test.map -g -o test test.c $ grep main test.map 	0x08048258		__libc_start_main@@GLIBC_2.0 	0x08048258		main $ addr2line 0x08048258 -e test -f main /home/mtj/test/test.c:4 $ 

            Addr2line 和調試器

            Addr2line 工具提供了基本的符號調試信息,不過 GNU Debugger (GDB)使用的是其他一些內部方法。

            回頁首

            精簡函數跟蹤數據

            現在您有了一個可以搜集函數函數地址的追蹤數據的方法,還可以使用 Addr2line 工具將地址轉換為函數名。然而,從應用程序中產生大量的跟蹤數據之后,如何對這些數據進行精簡,從而使其更有意義呢?這就是使用一些定制的中間代碼在開源工具之間建立聯系的地方。本文提供了這個工具(Pvtrace)的帶有注釋的完整代碼,包括如何編譯和使用該工具的一些說明。(有關的更多信息,請參閱 下載 一節。)

            回想一下圖 1 中的內容,在執行設置了檢測函數的應用程序時,會創建一個名為 trace.txt 的文本文件。這個人們可以讀取的文件中包含了一系列地址信息 —— 每行一個地址,每行都有一個前綴字符。如果前綴是 E,那么這個地址就是一個函數的入口地址(也就是說,您正在調用這個函數)。如果前綴是一個 X 字符,那么這個地址就是一個出口地址(也就是說,您正在從這個函數中退出)。

            因此,如果在跟蹤文件中有一個入口地址(A)緊跟著另外一個入口地址(B),那么您就可以推斷是 A 調用了 B。如果一個入口地址(A)后面跟著一個出口地址(A),那么就說明這個函數(A)被調用后就直接返回了。當涉及大量的調用鏈時,就很難分析究竟是誰調用了誰,因此,一種簡單的解決方案是維護一個整個地址的堆棧。每次在跟蹤文件中碰到一個入口地址時,就將其壓入堆棧。棧頂的地址就代表最后一次被調用的函數(也就是當前的活動函數)。如果后面緊接著是另外一個入口地址,這說明堆棧中的地址調用了這個剛從跟蹤文件處讀出的地址。在碰到退出函數時,當前的活動函數就會返回,并釋放棧頂元素。這會將上下文返到回前一個函數,由此,就可以產生正確的調用鏈過程。

            圖 2 介紹了這個概念,以及精簡數據的方法。在分析跟蹤文件中的調用鏈時,會構建一個連通矩陣,用來表示哪個函數調用了其他哪些函數。這個矩陣的行表示調用函數的地址,列表示被調用的地址。對于每個調用對來說,行與列的交叉點不斷進行累加(調用次數)。當處理完整個跟蹤文件時,其結果是該應用程序的整個調用歷史的一個非常簡單的表示,其中包含了調用的次數。


            圖 2. 對跟蹤數據進行處理和精簡,并生成矩陣格式
            精簡過程 

            編譯并安裝工具

            在下載并解壓 Pvtrace 工具之后,只需在子目錄中輸入 make 命令,就可以編譯 Pvtrace 工具了。也可以使用下面的代碼將這個工具安裝到 /usr/local/bin 目錄中:

            $ unzip pvtrace.zip -d pvtrace

            $ cd pvtrace

            $ make

            $ make install

            現在我們已經構建了簡化的函數連通性矩陣,接下來應該構建圖形的表示了。讓我們深入研究 Graphviz,了便理解如何從連通矩陣生成一個調用圖。

            回頁首

            使用 Graphviz

            Graphviz 或 Graph Visualization 是由 AT&T 開發的一個開源的圖形可視化工具。它提供了多種畫圖能力,但是我們重點關注的是它使用 Dot 語言直連圖的能力。在本文中,我們將簡單介紹如何使用 Dot 來創建一個圖形,并展示如何將分析數據轉換成 Graphviz 可以使用的規范。(請參閱 參考資料 一節,以獲得有關下載這個開源軟件的信息。)

            Dot 使用的圖形規范

            使用 Dot 語言,您可以指定三種對象:圖、節點和邊。為了讓您理解這些對象的含義,我們將構建一個例子來展示這些元素的用法。

            清單 5 給出了一個簡單的定向圖(directed graph),其中包含 3 個節點。第一行聲明這個圖為 G,并且聲明了該圖的類型(digraph)。接下來的三行代碼用于創建該圖的節點,這些節點分別名為 node1node2 和 node3。節點是在它們的名字出現在圖規范中時創建的。邊是在在兩個節點使用邊操作(->)連接在一起時創建的,如第 6 行到第 8 行所示。我還對邊使用了一個可選的屬性 label,用它來表示邊在圖中的名稱。最后,在第 9 行完成對該圖規范的定義。


            清單 5. 使用 Dot 符號表示的示例圖(test.dot)
            				 1:  digraph G { 2:    node1; 3:    node2; 4:    node3; 5: 6:    node1 -> node2 [label="edge_1_2"]; 7:    node1 -> node3 [label="edge_1_3"]; 8:    node2 -> node3 [label="edge_2_3"]; 9:  } 

            要將這個 .dot 文件轉換成一個圖形映像,則需要使用 Dot 工具,這個工具是在 Graphviz 包中提供的。清單 6 介紹了這種轉換。


            清單 6. 使用 Dot 來創建 JPG 映像
            				 $ dot -Tjpg test.dot -o test.jpg $ 

            在這段代碼中,我告訴 Dot 使用 test.dot 圖形規范,并生成一個 JPG 圖像,將其保存在文件 test.jpg 中。所生成的圖像如圖 3 所示。在此處,我使用了 JPG 格式,但是 Dot 工具也可以支持其他格式,其中包括 GIF、PNG 和 postscript。


            圖 3. Dot 創建的示例圖
            Dot 創建的示例圖 

            Dot 語言還可以支持其他一些選項,包括外形、顏色和很多屬性。但是就我們想要實現的功能而言,這個選項就足夠了。

            回頁首

            綜合

            現在我們已經看到了整個過程的各個階段了,下面可以采用一個例子來展示如何將這些階段合并在一起了。現在,您應該已經展開并安裝了 Pvtrace 工具,然后還需要將 instrument.c 文件復制到工作源代碼目錄中。

            在這個例子中,我使用了一個源文件 test.c 進行檢測。清單 7 給出了整個過程。在第 3 行中,我使用檢測源(instrument.c)來構建(編譯并連接)應用程序。然后在第 4 行執行test,再使用 ls 命令驗證已經生成了 trace.txt 文件。在第 8 行,我調用了 Pvtrace 工具,并提供這個映像文件作為它惟一的參數。映像名是必需的,這樣 Addr2line(在 Pvtrace 中調用)就可以訪問這個映像中的調試信息。在第 9 行中,我又執行了一次 ls 命令,以確保 Pvtrace 生成了 graph.dot 文件。最后,在第 12 行,使用 Dot 將這個圖形規范轉換成一個 JPG 圖形映像。


            清單 7. 創建調用跟蹤圖的整個過程
            				  1:  $ ls  2:  instrument.c    test.c  3:  $ $ gcc -g -finstrument-functions test.c instrument.c -o test  4:  $ ./test  5:  $ ls  6:  instrument.c     test.c  7:  test             trace.txt  8:  $ pvtrace test  9:  $ ls 10:  graph.dot        test           trace.txt 11:  instrument.c     test.c 12:  $ dot -Tjpg graph.dot -o graph.jpg 13:  $ ls 14:  graph.dot        instrument.c   test.c 15:  graph.jpg        test           trace.txt 16:  $ 

            這個過程的示例輸出如圖 4 所示。這個示例圖是從使用 Q 學習的一個簡單增強式學習應用程序中得到的。


            圖 4. 示例應用程序的跟蹤結果
            示例應用程序的跟蹤結果 

            您也可以使用這種方法對更大的應用程序進行分析。我要展示的最后一個例子是 Gzip 工具。我簡單地將 instrument.c 加入 Gzip 的 Makefile 中,作為其依賴的一個源文件,然后編譯 Gzip,并使用它生成一個跟蹤文件。這個圖形太大了,不太容易進行更詳細的分析,但是下圖表示了 Gzip 對一個小文件進行壓縮時的處理過程。


            圖 5. Gzip 跟蹤結果
            Gzip 跟蹤結果 

            回頁首

            結束語

            使用開源軟件和少量的中間代碼,只需要花很少的時間就可以開發出非常有用的項目。通過使用對應用程序進行分析的幾個 GNU 編譯器擴展,可以使用 Addr2line 工具進行地址轉換,并對 Graphviz 應用程序進行圖形可視化,然后您就可以得到一個程序,該程序可以對應用程序進行分析,并展示一個說明調用鏈的定向圖。通過圖形來查看一個應用程序的調用鏈對于理解應用程序的內部行為來說非常重要。在正確了解調用鏈及其各自的頻率之后,這些知識可能對調試和優化應用程序非常有用。


            回頁首

            下載

            描述名字大小下載方法
            Instrumentation source and Pvtrace sourcepvtrace.zip4 KBHTTP

            posted @ 2012-07-15 14:58 tqsheng 閱讀(886) | 評論 (0)編輯 收藏

            關于「Proxy Switchy Plus 漢化版」和「豆瓣助手 for Chrome」這兩個擴展你應該知道的事情


            關于「Proxy Switchy Plus 漢化版」和「豆瓣助手 for Chrome」這兩個擴展你應該知道的事情

            1、根據微博網友 @老王2012A 的爆料(via @月光博客),Chrome Web Store 中的「Proxy Switchy Plus 漢化版」擴展存在流氓行為。該擴展會自動修改淘寶購物鏈接,并在淘寶購物鏈接中加入了一個淘寶客廣告推廣ID,從而獲得利益。而用戶對此并不知情!

            2、關于「豆瓣助手 for Chrome」這個擴展也有類似的行為,這個擴展小編一直在使用,每當點擊淘寶中的鏈接,會發現瀏覽器中的地址會經過一個 data:text/html 開頭的 DATA URL 進行跳轉,然后才會打開目標鏈接。而正是有了這一跳轉,原作者就能你購買的商品中獲利。雖然作者曾經有在豆瓣發帖說明此事(文末),并在被網友質疑之后加入了一個可以取消該功能的選項,但說老實話,我用了很長時間這個擴展,到今天晚上才知道該插件還有設置并關閉這一流氓行為的功能(因為只能進入豆瓣網才能設置,采用的并非 Chrome 擴展標準的選項接口)。

            進入「豆瓣助手 for Chrome」設置界面的方法為:打開豆瓣網,按快捷鍵 alt+Q 打開設置界面,然后切換到“其他功能”標簽,取消勾選“通過在卓越、淘寶商城上買書支持豆瓣助手”

            其實早在今年2月份的時候就有網友曝光該擴展,鏈接在此:http://www.douban.com/group/topic/17667748/

            從我個人角度來講,對開發者從擴展中謀取一定收入沒有任何意見,但前提是你必須清楚的告知用戶(因為這還涉及到隱私方面的問題,同時淘寶賣家也會因此遭受損失)。既然作者不愿意告知用戶,那么我就來告訴大家,希望大家注意。

            關于「Proxy Switchy Plus 漢化版」和「豆瓣助手 for Chrome」這兩個擴展你應該知道的事情

            1、根據微博網友 @老王2012A 的爆料(via @月光博客),Chrome Web Store 中的「Proxy Switchy Plus 漢化版」擴展存在流氓行為。該擴展會自動修改淘寶購物鏈接,并在淘寶購物鏈接中加入了一個淘寶客廣告推廣ID,從而獲得利益。而用戶對此并不知情!

            2、關于「豆瓣助手 for Chrome」這個擴展也有類似的行為,這個擴展小編一直在使用,每當點擊淘寶中的鏈接,會發現瀏覽器中的地址會經過一個 data:text/html 開頭的 DATA URL 進行跳轉,然后才會打開目標鏈接。而正是有了這一跳轉,原作者就能你購買的商品中獲利。雖然作者曾經有在豆瓣發帖說明此事(文末),并在被網友質疑之后加入了一個可以取消該功能的選項,但說老實話,我用了很長時間這個擴展,到今天晚上才知道該插件還有設置并關閉這一流氓行為的功能(因為只能進入豆瓣網才能設置,采用的并非 Chrome 擴展標準的選項接口)。

            進入「豆瓣助手 for Chrome」設置界面的方法為:打開豆瓣網,按快捷鍵 alt+Q 打開設置界面,然后切換到“其他功能”標簽,取消勾選“通過在卓越、淘寶商城上買書支持豆瓣助手”

            其實早在今年2月份的時候就有網友曝光該擴展,鏈接在此:http://www.douban.com/group/topic/17667748/

            從我個人角度來講,對開發者從擴展中謀取一定收入沒有任何意見,但前提是你必須清楚的告知用戶(因為這還涉及到隱私方面的問題,同時淘寶賣家也會因此遭受損失)。既然作者不愿意告知用戶,那么我就來告訴大家,希望大家注意。

            posted @ 2012-07-15 09:24 tqsheng 閱讀(258) | 評論 (0)編輯 收藏

            記事本

            c在保存一篇新建的文檔時,如果沒有指定編碼類型,會使用缺省的ANSI類型(對于中文版來說,對應的就是GB碼)。
            而在打開一篇已創建的文檔時,它會分析文檔的編碼類型,它首先判斷文檔頭部有無BOM(Byte Order Mark,字節序標記,長
            度為(2-3字節),如有則根據其內容判斷編碼類型,FF、FE(Unicode),FE、FF(Unicode big endian),EF、BB、BF(UTF-8) 
            因為事實上有很多非ANSI編碼的文檔是沒有任何BOM的“純文本”,所以對這些文檔不能簡單的判斷為ANSI編碼。
            而需要使用一系列的統計學算法根據文檔內容來猜測文檔編碼。記事本使用了 IsTextUnicode 函數來判斷是否為 
            Unicode/Unicode big endian 編碼,使用 IsTextUTF8 判斷是否為 UTF8 編碼。但既然是統計學算法,就難免存在誤判
            ,尤其在文檔內容過短時,由于樣本的容量太小,這種誤判的概率會顯著增大。比如那個有名的微軟與聯通有仇的笑話,
            就是記事本在打開只有"聯通"二字的ANSI編碼文檔時,IsTextUTF8 函數將其誤判為UTF8編碼[2];同樣的誤判也發生在 
            IsTextUnicode 函數上,比如具有 “this app can break”這種具有4335結構的文檔,會被誤判為 Unicode 編碼[3][4]。
            需要說明的是,這種誤判的可能性是建立在文本較短且其字節位特征不被干擾的前提上的。如果將上述的文本做稍許修改(即使只是增加一個回車),則誤判很難再發生。
            而這種方法的特殊性在于,它的字節串不但具有Unicode特征,而且很長達到了1288字節,也就是說它的Unicode特征性很強,所以可以抵抗一 些較短的不具有Unicode特征串的干擾,這是由統計學的規律所決定的。但是在干擾串稍長時,Unicode的特征將會受到顯著干擾,直至被 IsTextUnicode 函數認定為非 Unicode。所以,有些朋友總是無法測試成功,應該是與附加的批處理代碼長度和內容相關。
            因為其他的編輯器(比如 Word / Wordpad / EditPlus / UltraEdit)使用了更新的編碼類型判斷算法,所以在 Unicode 判斷上改進了不少,而 UTF8 的判斷仍然不盡如人意。但因為理論上來說完全準確地算法并不存在,所以我們只能依靠避免使用無BOM的非ANSI文檔,或者打開文檔時手動指定編碼類型。
               另外,如果使用記事本保存了這些誤判了編碼類型的文件,則將難以恢復。如果使用誤判編碼保存,則將給原文檔加上BOM標記,則使用其他編輯器也再無法 觀察到原文檔。如果使用 ANSI 編碼保存,則原文檔將會被當作 Unicode 文檔而被轉換,還原的可能性接近于零

            posted @ 2012-07-13 20:59 tqsheng 閱讀(148) | 評論 (0)編輯 收藏

            build 中文亂碼

            SE貌似有自己的shell,可以通過Build窗口訪問,是一個很方便的功能,在工程中點擊Compile或是Build,編譯的輸出信息都會顯示在Build窗口中,如果編譯出現錯誤,雙擊Error或是Warning就可以在源文件中定位,是一個十分方便的功能,不過我一直被亂碼所困擾,原因大概是shell默認是用的語言是zh_CN-UTF8,和SE的默認編碼方式不同,所以我們需要在SE初始化的時候修改環境變量,方法如下:

            1. gedit ~/.slickedit/14.0.2/vslick.ini
            2. 添加以下內容:
              [Enviroment]
              LANG = en_US.UTF-8
            3. Ctrl + S
            4. 重啟SE

            我們還可以在這里添加其它環境變量,SE下Ctrl + Space切換輸入法的設置貌似也可以在這設置,不過還沒成功過。

            posted @ 2012-07-13 20:09 tqsheng 閱讀(323) | 評論 (0)編輯 收藏

            BABYBJORN

            BABYBJORN 

            posted @ 2012-07-13 12:47 tqsheng 閱讀(106) | 評論 (0)編輯 收藏

            makefile下$(wildcard $^),$^,$@,$?,$<,$(@D),$(@F)

            makefile下$(wildcard $^),$^,$@,$?,$<,$(@D),$(@F)代表的不同含義


            $(filter-out $(PHONY) $(wildcard $^),$^)
            常用用法為$(wildcard *.c)
            表示列舉當前目錄下的所有.c文件
            這里$^因為會包含依賴的文件名,如果包含的該文件存在,那么將返回其含路徑的文件名
            所以$(wildcard $^)就是用來過濾$^包含的所有文件并且該文件確實在本地存在.

            自動化變量$?代表依賴文件列表中被改變過的所有文件。
            自動化變量$^代表所有通過目錄搜索得到的依賴文件的完整路徑名(目錄 + 一般文件名)列表。
            自動化變量$@代表規則的目標。
            自動化變量$<代表規則中通過目錄搜索得到的依賴文件列表的第一個依賴文件。
            自動化變量$(@D) 
            The directory part of the file name of the target, 
            with the trailing slash removed. If the value of ‘$@’ is dir/foo.o 
            then ‘$(@D)’ is dir. This value is . if ‘$@’ does not contain a slash.
            http://www.gnu.org/software/make/manual/make.html
            自動化變量$(@F)
            The file-within-directory part of the file name of 
            the target. If the value of ‘$@’ is dir/foo.o then ‘$(@F)’ is foo.o. 
            ‘$(@F)’ is equivalent to ‘$(notdir $@)’. 

            4.12 靜態模式
            靜態模式規則是這樣一個規則:
            規則存在多個目標,
            并且不同的目標可以根據目標
            文件的名字來自動構造出依賴文件。
            靜態模式規則比多目標規則更通用,
            它不需要多個
            目標具有相同的依賴。
            但是靜態模式規則中的依賴文件必須是相類似的而不是完全相同
            的。
            4.12.1
            靜態模式規則的語法
            首先,我們來看一下靜態模式規則的基本語法:
            TARGETS ...: TARGET-PATTERN: PREREQ-PATTERNS ...
            COMMANDS
            ...
            “TAGETS”
            列出了此規則的一系列目標文件。
            像普通規則的目標一樣可以包含通
            配符。關于通配符的使用可參考 4.4 文件名使用通配符 一節
            “TAGET-PATTERN”和“PREREQ-PATTERNS”說明了如何為每一個目標文件
            生成依賴文件。從目標模式(TAGET-PATTERN)的目標名字中抽取一部分字符串(稱
            為“莖”。使用“莖”替代依賴模式(PREREQ-PATTERNS)中的相應部分來產生對
            )
            應目標的依賴文件。下邊詳細介紹這一替代的過程。
            首 先 在目標模式和依賴模式中 ,一般需要包含模式字符“% ”
            。在目標模式
            (TAGET-PATTERN)中“%”可以匹配目標文件的任何部分,模式字符“%”匹配的
            部分就是“莖”
            。目標文件和目標模式的其余部分必須精確的匹配。看一個例子:目標
            “foo.o”符合模式“%.o”
            ,其“莖”為“foo”
            。而目標“foo.c”和“foo.out”就不符
            合此目標模式。
            每一個目標的依賴文件是使用此目標的“莖”代替依賴模式
            (PREREQ-PATTERNS)中的模式字符“%”而得到。例如:上邊的例子中依賴模式
            (PREREQ-PATTERNS)為“%.c”
            ,那么使用“莖”
            “foo”替代依賴模式中的“%”
            得到的依賴文件就是“foo.c”
            。需要明確的一點是:在模式規則的依賴列表中使用不包
            含模式字符“%”也是合法的。代表這個文件是所有目標的依賴文件。
            在模式規則中字符‘%’可以用前面加反斜杠“\”方法引用。引用“%”的反斜杠
            也可以由更多的反斜杠引用。引用“%”“\”的反斜杠在和文件名比較或由“莖”代

            替它之前會從模式中被刪除。反斜杠不會因為引用“%”而混亂。如,模式
            “the\%weird\\%pattern\\”是“the%weird\”+“%”+“pattern\\”構成。最后的兩個
            反斜杠由于沒有任何轉義引用“%”所以保持不變。
            我們來看一個例子,它根據相應的.c 文件來編譯生成“foo.o”和“bar.o”文件:
            objects = foo.o bar.o
            all: $(objects)
            $(objects): %.o: %.c
            $(CC) -c $(CFLAGS) $< -o $@
            例子中,規則描述了所有的.o文件的依賴文件為對應的.c文件,對于目標“foo.o”
            ,取
            其莖“foo”替代對應的依賴模式“%.c”中的模式字符“%”之后可得到目標的依賴文
            件“foo.c”
            。這就是目標“foo.o”的依賴關系“foo.o: foo.c”
            ,規則的命令行描述了如
            何完成由“foo.c”編譯生成目標“foo.o”
            。命令行中“$<”和“$@”是自動化變量,
            “$<”
            表示規則中的第一個依賴文件,
            “$@”
            表示規則中的目標文件
            (可參考 10.5.3 自
            動化變量 一小節)
            。上邊的這個規則描述了以下兩個具體的規則:
            foo.o : foo.c
            $(CC) -c $(CFLAGS) foo.c -o foo.o
            bar.o : bar.c
            $(CC) -c $(CFLAGS) bar.c -o bar.o
            在使用靜態模式規則時,指定的目標必須和目標模式相匹配,否則執行make時將
            會得到一個錯誤提示。
            如果存在一個文件列表,
            其中一部分符合某一種模式而另外一部
            分符合另外一種模式,這種情況下我們可以使用“filter”函數(可參考 第八章 make
            的內嵌函數)來對這個文件列表進行分類,在分類之后對確定的某一類使用模式規則。
            例如:
            files = foo.elc bar.o lose.o
            $(filter %.o,$(files)): %.o: %.c
            $(CC) -c $(CFLAGS) $< -o $@
            $(filter %.elc,$(files)): %.elc: %.el
            emacs -f batch-byte-compile $<
            其中;$(filter %.o,$(files))的結果為“bar.o lose.o”“filter”函數過濾不符合“%.o”

            模式的文件名而返回所有符合此模式的文件列表。
            第一條靜態模式規則描述了這些目標
            文件是通過編譯對應的.c 源文件來重建的。同樣第二條規則也是使用這種方式。
            我們通過另外一個例子來看一下自動環變量“$*”在靜態模式規則中的使用方法:
            bigoutput littleoutput : %output : text.g
            generate text.g -$* > $@
            當執行此規則的命令時,
            自動環變量
            “$*”
            被展開為
            “莖” 在這里就是

            “big” “little”


            靜態模式規則對一個較大工程的管理非常有用。
            它可以對整個工程的同一類文件的
            重建規則進行一次定義,而實現對整個工程中此類文件指定相同的重建規則。比如,可
            以用來描述整個工程中所有的.o 文件的依賴規則和編譯命令。通常的做法是將生成同
            一類目標的模式定義在一個 make.rules 的文件中。在工程各個模塊的 Makefile 中包含
            此文件。

            1. 靜態模式makefile中$(cobjs): $(obj)/%.o: $(src)/%.c

            2. http://www.gnu.org/software/make/manual/make.html
            3. 4.12.1 Syntax of Static Pattern Rules

            4. Here is the syntax of a static pattern rule:

            5.      targets ...: target-pattern: prereq-patterns ...
            6.              recipe
            7.              ...

            8. The targets list specifies the targets that the rule applies to. The targets can contain wildcard characters, just like the targets of ordinary rules (see Using Wildcard Characters in File Names).

            9. The target-pattern and prereq-patterns say how to compute the prerequisites of each target. Each target is matched against the target-pattern to extract a part of the target name, called the stem. This stem is substituted into each of the prereq-patterns to make the prerequisite names (one from each prereq-pattern).

            10. Each pattern normally contains the character ‘%’ just once. When the target-pattern matches a target, the ‘%’ can match any part of the target name; this part is called the stem. The rest of the pattern must match exactly. For example, the target foo.o matches the pattern ‘%.o’, with ‘foo’ as the stem. The targets foo.and foo.out do not match that pattern.

            11. The prerequisite names for each target are made by substituting the stem for the ‘%’ in eachprerequisite pattern. For example, if one prerequisite pattern is %.c, then substitution of the stem ‘foo’ gives the prerequisite name foo.c. It is legitimate to write a prerequisite pattern that does not contain ‘%; then this prerequisite is the same for all targets.

            12. %’ characters in pattern rules can be quoted with preceding backslashes (\). Backslashes that would otherwise quote ‘%’ characters can be quoted with more backslashes. Backslashes that quote ‘%’ characters or other backslashes are removed from the pattern before it is compared to file names or has a stem substituted into it. Backslashes that are not in danger of quoting ‘%’ characters go unmolested. For example, the pattern the\%weird\\%pattern\\ has ‘the%weird\’ preceding the operative ‘%’ character, and ‘pattern\\’ following it. The final two backslashes are left alone because they cannot affect any ‘%’ character.

            13. Here is an example, which compiles each of foo.and bar.o from the corresponding .c file:

            14.      objects = foo.o bar.o
            15.      
            16.      all: $(objects)
            17.      
            18.      $(objects): %.o: %.c
            19.              $(CC) -c $(CFLAGS) $< -o $@

            20. Here ‘$<’ is the automatic variable that holds the name of the prerequisite and ‘$@’ is the automatic variable that holds the name of the target; see Automatic Variables.

            21. Each target specified must match the target pattern; a warning is issued for each target that does not. If you have a list of files, only some of which will match the pattern, you can use the filter function to remove nonmatching file names (see Functions for String Substitution and Analysis):

            22.      files = foo.elc bar.o lose.o
            23.      
            24.      $(filter %.o,$(files)): %.o: %.c
            25.              $(CC) -c $(CFLAGS) $< -o $@
            26.      $(filter %.elc,$(files)): %.elc: %.el
            27.              emacs -f batch-byte-compile $<

            28. In this example the result of ‘$(filter %.o,$(files))’ is bar.o lose.o, and the first static pattern rule causes each of these object files to be updated by compiling the corresponding C source file. The result of ‘$(filter %.elc,$(files))’ is foo.elc, so that file is made from foo.el.

            29. Another example shows how to use $* in static pattern rules:

            30.      bigoutput littleoutput : %output : text.g
            31.              generate text.-$* > $@

            32. When the generate command is run, $* will expand to the stem, either ‘big’ or ‘little’.

            posted @ 2012-07-13 10:30 tqsheng 閱讀(694) | 評論 (0)編輯 收藏

            Unix網絡API

                 摘要: 索引: 1.字節序函數2.字節操作函數3.地址轉換函數4.readn、writen和readline5.測試描述符類型6.socket函數7.connect函數8.bind函數9.listen函數10.accept函數11.close函數12.getsockname和getpeername13.select函數14.shutdown函數15.pselect函數16.poll函數17.ge...  閱讀全文

            posted @ 2012-07-13 10:28 tqsheng 閱讀(319) | 評論 (0)編輯 收藏

            Code Navigation Tools

            Code Navigation Tools

            副標題: Ctags, Doxygen, Class Browser, Slickedit, Cscope, Source Insight, Understand
            出版社: Books LLC
            出版年: 2010-9-15
            頁數: 34
            定價: USD 14.14
            裝幀: Paperback
            ISBN: 9781157307280

            posted @ 2012-07-12 16:11 tqsheng 閱讀(178) | 評論 (0)編輯 收藏

            推薦一個不錯的flex ajax javascript資源網站http://ntt.cc/

            推薦一個不錯的flex ajax javascript資源網站http://ntt.cc/ 

            posted @ 2012-07-12 12:42 tqsheng 閱讀(168) | 評論 (0)編輯 收藏

            僅列出標題
            共25頁: First 6 7 8 9 10 11 12 13 14 Last 
            韩国无遮挡三级久久| 7777精品久久久大香线蕉| 久久人人爽爽爽人久久久| 久久青青草原精品国产不卡| 久久久久国产精品熟女影院 | 久久国产精品久久国产精品| 伊人久久精品无码二区麻豆| 久久久久波多野结衣高潮| 日日狠狠久久偷偷色综合96蜜桃| 久久国产精品无码网站| 国产AⅤ精品一区二区三区久久| 久久久精品免费国产四虎| 99国产欧美久久久精品蜜芽| 久久久久久国产精品无码超碰| 久久精品人成免费| 72种姿势欧美久久久久大黄蕉| 7777久久亚洲中文字幕| 色综合久久最新中文字幕| 国产99久久九九精品无码| 99久久精品无码一区二区毛片 | 人妻精品久久无码区| 久久人人爽人人爽人人片AV不| 久久久无码精品亚洲日韩蜜臀浪潮 | 久久精品国产免费观看三人同眠| 亚洲中文字幕无码久久2020| 色偷偷88888欧美精品久久久| 久久国产亚洲高清观看| 99久久精品国产麻豆| 久久久久久亚洲精品不卡| 国产精品久久久久久久久软件| 日韩人妻无码精品久久久不卡| 久久99国产精品久久99| 久久久久人妻一区精品果冻| 精品久久人人爽天天玩人人妻| 99999久久久久久亚洲| 精品久久久久久国产牛牛app| 漂亮人妻被中出中文字幕久久| 久久国产色AV免费看| 亚洲另类欧美综合久久图片区| 欧美亚洲色综久久精品国产| 久久99久久99小草精品免视看|