• <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>
            隨筆-18  評論-11  文章-12  trackbacks-0
              2009年6月21日
                  2009年6月的一天,我在甲方辦公室加班調(diào)試程序,筆記本的屏幕只有12英寸,我得不停地在調(diào)試器和編輯器之間切換,觀察斷點的執(zhí)行情況,發(fā)現(xiàn)代碼中的問題。在那一刻,我突然覺得所做的完全是低水平重復(fù)工作
                    1. 對業(yè)務(wù)流程不熟悉,對自己的代碼不熟悉,編譯運行后不能預(yù)測結(jié)果。
                    2. 做管理軟件,重復(fù)性工作太多。
                    3. 技術(shù)視野有限,不能從一個更廣的角度去看待問題。
                    對于第一個問題,首要要求在寫完代碼后做review,把代碼詳細(xì)讀一遍想一遍,確認(rèn)無誤后才編譯。review要隨時地做,寫完一個函數(shù)完成一個功能塊,都要檢查,想一想這段代碼在整個業(yè)務(wù)流程中的位置。對代碼做到心中有數(shù),而不至于不停的開調(diào)試器(調(diào)試器是一個效率低下的緣由之一)。
                   重復(fù)性工作多,這個是管理軟件固有屬性,能否將重復(fù)性的工作抽離出來?在之前的項目中,做了很多這方面的嘗試。有一定成效。但另一方面,由于經(jīng)驗不足,強扭地將一些個性化的東西抽離出來,最后代碼組織結(jié)構(gòu)混亂。要達到重用,有很多條路可以達到,但由于技術(shù)的積累不夠,看到一條路就以為這條路是最好的,一往無前地闖過去。其實還有很多更好的選擇,只是因為技術(shù)積累不夠,而工期緊張,沒得選了。
                   視野有限,所看到僅僅是所寫的,而不能引發(fā)更加廣度的聯(lián)想。比如說在asp.net中的master頁面,自定義控件,管理軟件三層架構(gòu)的優(yōu)勢,mvc等等。沒有深刻地了解和實際的體驗,在項目中自然無法聯(lián)想到。所以只能做一些簡單的重復(fù)工作。
            posted @ 2009-06-21 20:18 ronliu 閱讀(334) | 評論 (0)編輯 收藏
              2009年3月11日

                在日常生活中,經(jīng)常有大量的文本需要處理,正則表達式正是基于此提出的。本文將結(jié)合一些具體的實例來解釋它。雖然在不同的語言環(huán)境中,正則表達式有不同的語法規(guī)則,但其基本語義卻是一致的。http://en.wikipedia.org/wiki/Regular_expression。這將是一個系列教程。本節(jié)只是一個開胃菜:)

                某一次同學(xué)很無聊,然后問我電腦上有無小說。這是顯然的,我是網(wǎng)絡(luò)小說迷嘛!從起點down下無數(shù)小說存在電腦上,名字都懶得改,都是以數(shù)字打頭,然后以“.txt”結(jié)尾,比如23432.txt之類的。當(dāng)然,文件查找還是得用Everything,要不然電腦上的上百萬個文件,手會抽筋的。

                (注:我以為Everything是史上最快的文件查找工具,強烈推薦!)

               先用"*.txt"嘗試一下,:(,給出一大堆文本文件呀。范圍太廣。還是得用正則表達式來。

              ^[0-9]*\.txt

                Yes!給出了我電腦上存儲的所有小說了。

            image

                解釋一下:
                ^[0-9]表示文件名以0-9之間的數(shù)字開頭,^是開頭的意思($結(jié)尾)
                *表示它前面的字符(這里是數(shù)字)要重復(fù)若干次(>=0)
                \.匹配139869.txt中的那個小數(shù)點。因為正則表達式中,‘.’被占用了,表示任意字符,所以要轉(zhuǎn)義一下
                txt,這就不說了,緊接著小數(shù)點的是‘txt’三個字符。

                Everything只支持部分正則表達式, | () ? * + . [] [^] ^ $ {m,n} 不過已經(jīng)完全夠用了。
            http://xbeta.info/everything/faq.htm#How_do_I_use_regex

                考慮這樣一個問題:項目組在驗收的時候,被指出代碼的注釋量不夠,需要達到至少30%才行,也就是至少需要添加6500行注釋。此時老師提出,要將所有的函數(shù)加上注釋,函數(shù)的名稱、功能、參數(shù)、返回值。這個時候,考慮能不能用正則表達式,提取源代碼中的函數(shù)信息,然后自動生成注釋模板?比如:

            int foo(int x, int y);
            替換為:
            /**
            * @method foo
            * @para x
            * @para y
            * @return
            */
            int foo(int x, int y);

                注意到,這個函數(shù)參數(shù)的個數(shù)和類型可以是變動的,返回值限定符的個數(shù)和類型也是變動的,比如static類型函數(shù),有兩個限定符,而構(gòu)造函數(shù),則沒有限定符,還有部分virtual類型函數(shù)。

            posted @ 2009-03-11 20:01 ronliu 閱讀(650) | 評論 (1)編輯 收藏
              2009年3月8日

                    本例學(xué)習(xí)QDialog。預(yù)期目的:1. 組織多個窗體。2. 學(xué)習(xí)Dialog的相關(guān)屬性。3. 學(xué)習(xí)一些widget。

                    1. 本例中,定義了3個不同的PageWidget,都是從QWidget中派生。用戶在左側(cè)list更換后,切換到不同的配置頁。

                    2. QStackedWidget提供一組widget,但一次只能有一個顯示。將這個widget添加到layout中。

                    3. 在layout設(shè)置中,一般為MainWindow設(shè)置一個layout,然后向這個layout中添加不同的widget,layout。

                    4. 一個窗體是Window或者Dialog,向這個窗體中添加其他的Widget,這些Widget可以使系統(tǒng)提供的,也可以是用戶自己定義的。

                    5. 本例中使用兩次QListWidget。一次為圖文,一次為文字。setViewMode(),設(shè)置ListWidget為圖標(biāo)模式。通過setIcon(),設(shè)置Item的圖標(biāo)。configButton->setIcon(QIcon(":/images/config.png"));

                    6. 定義QListWidgetItem的父類為QListWidget,設(shè)置QListWidget的項。或者使用addWidget()之類的方法。

                    7. 左側(cè)select切換時,if(!current)  current = previous;防止current為0的意外情況。

                    8. 自定義了一個slot,用來處理contentList被選中項切換時,相應(yīng)的處理方法。也就是設(shè)置stackedWidget的被選中項。通過contentlist的row()確定index,然后設(shè)置第index項為當(dāng)前item。

            posted @ 2009-03-08 22:20 ronliu 閱讀(781) | 評論 (0)編輯 收藏
              2009年2月26日

            2008.2.27 by RonLiu

            方法一:使用tr()函數(shù)

            QT中,用QString存儲所有可見得文本/字符串,使用tr()將各種字符編碼的文本轉(zhuǎn)化為QString,然后既可以將他們設(shè)置為控件的顯示文本。

            在Widget的構(gòu)造函數(shù)中加入:

            QTextCodec::setCodecForTr(QTextCodec::codecForName("gbk"));

            QFont font1("Times", 12, QFont::Normal, FALSE);

            this->setFont(font1);

            這樣在該窗體的其他位置,可以使用tr()設(shè)置控件的內(nèi)容,他們均可以顯示為中文了。

            setWindowTitle(tr("消息嗅探器"));

            注意:這種方式設(shè)置的中文顯示對于整個控件,以及它們的子控件都生效。如果在子控件中另外設(shè)置了setFont(),那么全局的字體方案將會失效。

            方法二:使用translate()轉(zhuǎn)換

            先將需要顯示的中文轉(zhuǎn)化為gbk編碼的unicode,然后將unicode轉(zhuǎn)化為QByteArray,在將只轉(zhuǎn)化為char指針,并傳遞給translate()函數(shù)。

            注意:這種方法顯示中文時,會出現(xiàn)失效的情況。譬如在菜單欄中可以顯示中文,但是在Label或者Button中卻無法顯示中文。

            另外,這種方法僅僅建議只有少數(shù)按鈕顯示中文時選用,否則,代碼寫得也麻煩呀。

            如果使用QDesigner生成的ui文件,后創(chuàng)建的界面類,一般都有一個retranslateUI,就是做這個用的。

            const char * stringToUnicode(const char *str)

            {

            static QTextCodec *codec = QTextCodec::codecForName("gbk");

            QByteArray qba = (codec->toUnicode(str)).toLocal8Bit();

            const char * c_str = qba.data();

            return c_str;

            }

            menuFile->setTitle(QApplication::translate("MainWindow", stringToUnicode("文件"), 0, QApplication::CodecForTr));

            QTextCodeC用于在不同的編碼方案之間進行轉(zhuǎn)換。

            方法三:使用Linguist

            這是QT自帶的用于軟件本地化的軟件的工具。沒仔細(xì)研究過。

            這種方式可以用于外文軟件的本地化,那么相比于前兩者方式,處于更高的層次。

            延生一:編寫多語言版本的QT程序

            (本部分內(nèi)容參考QT手冊Internationalization一節(jié))

            在方法一和方法二種,仍然是一個程序?qū)?yīng)一個語言。如果希望QT程序針對不同的語言,有不同的版本,該如何操作?

            準(zhǔn)備一個.pro文件,如:

            HEADERS         = funnydialog.h \

                               wackywidget.h

            SOURCES         = funnydialog.cpp \

                               main.cpp \

                               wackywidget.cpp

            FORMS           = fancybox.ui

            TRANSLATIONS    = superapp_dk.ts \

                               superapp_fi.ts \

                               superapp_no.ts \

                               superapp_se.ts

            1. 使用lupdate,從QT程序中抽取可轉(zhuǎn)換的文本,生成一個ts文件。

            2. 使用Linguist工具,在原始文本間轉(zhuǎn)換。ts文件以xml格式保存,可以手動修改。

            3. 運行l(wèi)release,生成輕量級的qm格式的消息文件。這種文件可以在程序中使用。

            4. In your application, you must QTranslator::load()  the translation files appropriate for the user's language, and install them using QCoreApplication::installTranslator().

            posted @ 2009-02-26 20:09 ronliu 閱讀(841) | 評論 (0)編輯 收藏
              2009年2月20日

            1. 為什么使用Eclipse進行C++的開發(fā)。

                  因為Eclipse的IDE支持多種語言,如Java、Python、C++,也支持不同的操作系統(tǒng)。這樣不管換到什么環(huán)境,或者換一種語言,熟悉的環(huán)境不會變化。

            2. 安裝和設(shè)置Eclipse/CDT的環(huán)境。

                  a. mingw的安裝與配置。http://m.shnenglu.com/romangol/archive/2008/04/19/47595.html。(PATH,C_INCLUDEPATH,CPLUS_INCLUDE_PATH, LIBRARY_PATH)

                  b. Java虛擬機的安裝與設(shè)置。(PATH)

                  c. Eclipse/CDT的下載與安裝。http://www.ibm.com/developerworks/cn/linux/opensource/os-ecc/index.html

            3. toolchain設(shè)置

                  新建一個自帶makefile的helloworld程序,build可以通過。但點擊運行時,提示找不到可執(zhí)行文件。原因在于,新建項目時,沒有選擇合適的toolchain。如果是下載后解壓后得到的CDT,那么toolchain已經(jīng)內(nèi)置在其中了。但如果是update的方式獲取,則需要手動下載。

                 我安裝的是mingw的編譯環(huán)境,但選擇cygwin,卻仍然可以生成可執(zhí)行的程序。奇怪的事情。獲取是因為,設(shè)置configuration時,通過檢查環(huán)境變量來獲取實際調(diào)用的編譯器?

                  image   image
                  image 

            4. 何為toolchain?

                  A toolchain is a set of tools (such as a compiler, linker, and assembler) intended to build your project. Additional tools, such as a debugger, can be associated with a toolchain. There can be several toolchains available, depending on the compilers installed on your system.

            5. 有哪些toolchain可供選擇?

                 Cygwin,通過支持GNU libc運行庫,它完全實現(xiàn)gun toolchain,使用dll向上提供Windows的兼容層。

                 mingw。windows平臺下gnu toolchain的入口,它直接使用windows c運行庫,不需要兼容層,但可移植性要差一些。

            6. Eclipse如何使用這些toolchain? TODO

                 The CDT is designed to provide an extensible architecture, that will provide support for integration of tools provided by Independent Software Vendors。

             

            附:

                   Eclipse 平臺只是用于開發(fā)者工具的一個框架,它不直接支持 C/C++;它使用外部插件來提供支持。CDT 是完全用 Java 實現(xiàn)的開放源碼項目(根據(jù) Common Public License 特許的),它作為 Eclipse SDK 平臺的一組插件。這些插件將 C/C++ 透視圖添加到 Eclipse 工作臺(Workbench)中,現(xiàn)在后者可以用許多視圖和向?qū)б约案呒壘庉嫼驼{(diào)試支持來支持 C/C++ 開發(fā)。

            下面是 CDT 插件/組件的完整列表:

            • 主 CDT 插件(Primary CDT plug-in)是“框架”CDT 插件。
            • CDT 功能 Eclipse(CDT Feature Eclipse)是 CDT 功能組件(Feature Component)。
            • CDT 核心(CDT Core)提供了核心模型(Core Model)、CDOM 和核心組件(Core Component)。
            • CDT UI是核心 UI、視圖、編輯器和向?qū)А?
            • CDT 啟動(CDT Launch)為諸如編譯器和調(diào)試器之類的外部工具提供了啟動機制。
            • CDT 調(diào)試核心(CDT Debug Core)提供了調(diào)試功能。
            • CDT 調(diào)試 UI(CDT Debug UI)為 CDT 調(diào)試編輯器、視圖和向?qū)峁┝擞脩艚缑妗?
            • CDT 調(diào)試 MI(CDT Debug MI)是用于與 MI 兼容的調(diào)試器的應(yīng)用程序連接器。
            posted @ 2009-02-20 14:15 ronliu 閱讀(7642) | 評論 (0)編輯 收藏
              2009年2月16日

                  對于QT的學(xué)習(xí),一直處于半懂不懂的狀態(tài),看文檔也只處于“貌似”的境界,導(dǎo)致真正碰到問題時就個屁掉。這次閱讀basiclayout的demo說明,甚感慚愧,之前學(xué)得太膚淺。

                  1. 設(shè)計一個窗體,安排好它的函數(shù)和屬性。

                  2. 基本的layout包括四類,QHBoxLayout,QVBoxLayout,QGridLayout,QFormLayout。前兩個將widget水平或豎直防止,grid將widget以格子的形式放置,formlayout將widget以row的形式放置。

                  3. layout的使用方法是,先定一個layout,再向這個layout中添加widget,然后使用父類中的setlayout(),設(shè)置這個widget的layout。

                  4. layout有一個setMenubar,可以使得Dialog也可以設(shè)置菜單欄。

                  5. 在定義類時,定義一個enum,之后就可以直接使用這個enum中的元素。

                  6. QT賦參數(shù)的方法為tr("Button %1").arg(i + 1)。

                  7. QGridLayout有setColumnStretch(int, int)方法,用于設(shè)置grid中格子的伸長因子,也就是能夠占用多大的空間。

                  8. QDialogButtonBox指用于確定/退出的button組。它是這兩類常用button的一個box組合。

                  9. 本例中涉及到的其它widget包括:

                         a.  QTextEdit,文本編輯框,支持plain text和html text

                         b.  QPushButton,按鈕

                         c.  QGroupBox,將widget以box的形式組織在一起

                         d. QLineEdit,行編輯框

                         e. QComboBox,下拉框

                         f. QSpinBox,spin框,提供數(shù)值選擇。

            posted @ 2009-02-16 22:28 ronliu 閱讀(9634) | 評論 (3)編輯 收藏
              2009年2月11日

                  cppblog提供了metablog接口,供用戶使用一些桌面工具操作blog。MetaBlogAPI是一個XML-RPC Service。它可以讓用戶遠(yuǎn)程調(diào)用Blog程序提供的接口來完成一些功能,比如發(fā)布新的文章,查看最新文章的列表等。http://dudu.cnblogs.com/articles/411388.html

                  先看cppblog的一個接口:

            metaWeblog.getCategories()的參數(shù)

            image

            返回結(jié)構(gòu)體

            image

                  下面介紹使用Python來操作metablog接口。既然metablog是一個xml-rpc接口,那么就使用Python的xmlrpc庫吧,好消息是這個庫Python已經(jīng)提供了,就是xmlrpclib。

                  代碼如下:

            import xmlrpclib

            user = 'ronliu'

            pass = '123'

            url = 'http://m.shnenglu.com/ronliu/services/metaweblog.aspx'

            server = xmlrpclib.Server(url)

            cata = server.metaWeblog.getCategories('', user, pass)    #典型的rpc調(diào)用

            for e in cata:

                 print e['categoryid'], e['title']

            操作結(jié)果:

            image 

             

                  使用xmlrpclib的Server()方法,可以創(chuàng)建一個rpc服務(wù)器的代理,然后通過這個代理訪問遠(yuǎn)程的方法。可以使用Python提供的調(diào)試功能查看rpc的執(zhí)行過程:

            import httplib

            httplib.HTTPConnection.debuglevel = 1

            image

            image

            posted @ 2009-02-11 22:36 ronliu 閱讀(477) | 評論 (0)編輯 收藏

                   使用這些api,即使一個門外漢也可以為自己的網(wǎng)站添加地圖。

                  下面的代碼,將會創(chuàng)建一個簡單的地圖網(wǎng)頁。如:

            <html xmlns=" >
            <head runat="server">
                <title>地圖測試</title>
                <script language="javascript" src="
            </head>

            <body>
                <form id="form1" runat="server">
                    <div id="myMap" style="position:relative; width:400px; height:300px;"></div>
                    <script language="javascript">
                        var maps = new LTMaps( "myMap" );   //LTMaps類有一個參數(shù),是該地圖所在div的name
                        maps.cityNameAndZoom( "beijing" , 5 );
                        var c = new LTSmallMapControl();   //簡單的放大縮小條
                        maps.addControl(c);
                        var point = new LTPoint( 11640969 , 3989945 );//北京
                        var marker = new LTMarker( point );  //一個標(biāo)記
                        maps.addOverLay( marker );  //將標(biāo)記覆蓋到地圖涂層上
                        var text = new LTMapText( marker );
                        text.setLabel( "我的位置" );
                        maps.addOverLay( text );
                    </script>
                </form>
            </body>
            </html>

            詳細(xì)的API說明在http://api.51ditu.com/docs/index.html可以查詢。

            51API架構(gòu)

            posted @ 2009-02-11 20:25 ronliu 閱讀(376) | 評論 (0)編輯 收藏
              2009年1月6日
            現(xiàn)象:服務(wù)器端意外退出后馬上重啟,提示端口綁定錯誤,端口正在使用中。稍等一會后再次重啟,可以正常運行。
            可以設(shè)置socket的選項為SO_REUSEADDR,使其允許完全重復(fù)的綁定。
                int rc = 1;
                setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&rc, sizeof(rc));
                bind(fd, (struct sockaddr *) &addr, sizeof(addr));

            setsockopt的函數(shù)原型為:
                   int getsockopt(int s, int level, int optname, void *optval, socklen_t *optlen);
                   int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
                   其中optval為選項的開關(guān)標(biāo)志符,例如我使用rc=1開啟SO_REUSEADDR。

            fcntl 文件控制,file control,譬如控制socket為非阻塞IO,信號驅(qū)動IO等。類似的有ioctl
            posted @ 2009-01-06 11:52 ronliu 閱讀(1427) | 評論 (0)編輯 收藏
              2009年1月4日
                 (一)感冒了,渾身發(fā)抖,頭疼,胸口疼,胃疼。不注意保暖,以及嚴(yán)重的不規(guī)律飲食帶來的。現(xiàn)在只想早些跑回去鉆被窩加衣服。網(wǎng)絡(luò)小說是不能看了,不規(guī)律的飲食很大程度與此有關(guān),且影響學(xué)習(xí)狀態(tài)。可以多讀一些歷史,政治,經(jīng)濟方面的書,比如世界通史之類。關(guān)注養(yǎng)生,病殃殃的狀況實在難受,學(xué)會調(diào)養(yǎng)自己的身體。有條件的話,可以多鍛煉一些。
                 (二)找工作期間,最遺憾的是,沒有拿得出手的技能,以及拿得出手的成果。在找完工作之后,就開始急于求成,一心想作一個東西出來,但經(jīng)常是想了卻不做,做時半途而廢,然后又開始新的想法。很浮躁,急于求成。在今后的三個月,可以多作技能方面的鍛煉。比如編程語言,能否作到精通?需要鍛煉的技能包括:
                  甲。語言是表達思想的工具,語言說不好,不精通,再好的思想也表達不出來。反過來,語言學(xué)得好了,會促進思維的成長。然后,掌握一門專精的語言,也是將來安身立命,向更深層次的架構(gòu)師成長的根本。但就目前,有什么語言是真正拿的出手的?C++是最熟悉的,卻仍然談不上精通。在今后的三個月,對C++的深入鍛煉,是重點。
                  乙。在平常的編程中,算法用的似乎并不多,但對培養(yǎng)計算機的思維,培養(yǎng)設(shè)計能力,很有好處。更高層的,如設(shè)計模式之類。可以將語言的學(xué)習(xí)和算法,設(shè)計模式的學(xué)習(xí)結(jié)合起來。
                 (三)新的一年,增大一歲。不知不覺,二十好幾。回頭看時,什么也沒有做成。感情上,學(xué)業(yè)上,以及和家人的關(guān)系,都不如意。這是浮躁的根本原因。但這些問題,卻不是一蹴而就的,需要時間的積累,需要精力的積累,不是隨想就有的。就像Scott信中的那位技術(shù)總監(jiān),沒有5年甚至5年以上的技術(shù)沉淀,能夠?qū)⒓夹g(shù)玩到如指臂使?淡然,做好自己該做的。清風(fēng)撫山崗,明月照大江。高三畢業(yè)那年,能夠坐在河邊,對廣場上人來人往充耳不聞,和尚念經(jīng)般默誦這兩句話,心中淡然。年齡增大,考慮增多,卻越來越浮躁了。在浮躁和淡然之間,需要有一個平衡。
                 (四)做好接下來的三個月!
            posted @ 2009-01-04 11:13 ronliu 閱讀(339) | 評論 (0)編輯 收藏
            僅列出標(biāo)題  下一頁
            久久久久亚洲精品男人的天堂| 久久WWW免费人成—看片| 久久国产热这里只有精品| 久久夜色精品国产亚洲| 91精品国产综合久久精品| 伊人丁香狠狠色综合久久| 香蕉久久久久久狠狠色| 久久国产乱子精品免费女| 伊人久久大香线蕉亚洲五月天| 97久久香蕉国产线看观看| 国产激情久久久久影院老熟女免费| 久久无码专区国产精品发布| 国产三级久久久精品麻豆三级| 久久久久久久97| 亚洲精品无码专区久久同性男| …久久精品99久久香蕉国产| 久久综合九色欧美综合狠狠 | 精品乱码久久久久久夜夜嗨 | 久久精品国产秦先生| 综合久久一区二区三区| 久久99久久成人免费播放| 久久精品嫩草影院| 久久久久亚洲AV片无码下载蜜桃| 一级做a爰片久久毛片看看 | 久久久亚洲精品蜜桃臀 | 久久精品国产只有精品66| 久久精品国产一区| 国产精品久久精品| 久久久久久久99精品免费观看| 久久亚洲国产精品一区二区| 日日躁夜夜躁狠狠久久AV| 精品久久久久香蕉网| 久久妇女高潮几次MBA| 最新久久免费视频| 久久久久免费精品国产| 久久受www免费人成_看片中文| 少妇久久久久久被弄到高潮| 久久久这里有精品| 欧美亚洲国产精品久久| 久久精品国产色蜜蜜麻豆| 亚洲精品乱码久久久久久按摩|