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

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

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

                (注:我以為Everything是史上最快的文件查找工具,強烈推薦?。?/p>

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

              ^[0-9]*\.txt

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

            image

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

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

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

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

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

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

                    本例學習QDialog。預期目的:1. 組織多個窗體。2. 學習Dialog的相關屬性。3. 學習一些widget。

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

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

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

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

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

                    6. 定義QListWidgetItem的父類為QListWidget,設置QListWidget的項?;蛘呤褂胊ddWidget()之類的方法。

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

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

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

            2008.2.27 by RonLiu

            方法一:使用tr()函數

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

            在Widget的構造函數中加入:

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

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

            this->setFont(font1);

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

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

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

            方法二:使用translate()轉換

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

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

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

            如果使用QDesigner生成的ui文件,后創建的界面類,一般都有一個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用于在不同的編碼方案之間進行轉換。

            方法三:使用Linguist

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

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

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

            (本部分內容參考QT手冊Internationalization一節)

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

            準備一個.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程序中抽取可轉換的文本,生成一個ts文件。

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

            3. 運行lrelease,生成輕量級的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 閱讀(839) | 評論 (0)編輯 收藏
              2009年2月20日

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

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

            2. 安裝和設置Eclipse/CDT的環境。

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

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

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

            3. toolchain設置

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

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

                  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運行庫,它完全實現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 平臺只是用于開發者工具的一個框架,它不直接支持 C/C++;它使用外部插件來提供支持。CDT 是完全用 Java 實現的開放源碼項目(根據 Common Public License 特許的),它作為 Eclipse SDK 平臺的一組插件。這些插件將 C/C++ 透視圖添加到 Eclipse 工作臺(Workbench)中,現在后者可以用許多視圖和向導以及高級編輯和調試支持來支持 C/C++ 開發。

            下面是 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、視圖、編輯器和向導。
            • CDT 啟動(CDT Launch)為諸如編譯器和調試器之類的外部工具提供了啟動機制。
            • CDT 調試核心(CDT Debug Core)提供了調試功能。
            • CDT 調試 UI(CDT Debug UI)為 CDT 調試編輯器、視圖和向導提供了用戶界面。
            • CDT 調試 MI(CDT Debug MI)是用于與 MI 兼容的調試器的應用程序連接器。
            posted @ 2009-02-20 14:15 ronliu 閱讀(7633) | 評論 (0)編輯 收藏
              2009年2月16日

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

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

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

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

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

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

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

                  7. QGridLayout有setColumnStretch(int, int)方法,用于設置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框,提供數值選擇。

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

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

                  先看cppblog的一個接口:

            metaWeblog.getCategories()的參數

            image

            返回結構體

            image

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

                  代碼如下:

            import xmlrpclib

            user = 'ronliu'

            pass = '123'

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

            server = xmlrpclib.Server(url)

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

            for e in cata:

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

            操作結果:

            image 

             

                  使用xmlrpclib的Server()方法,可以創建一個rpc服務器的代理,然后通過這個代理訪問遠程的方法??梢允褂肞ython提供的調試功能查看rpc的執行過程:

            import httplib

            httplib.HTTPConnection.debuglevel = 1

            image

            image

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

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

                  下面的代碼,將會創建一個簡單的地圖網頁。如:

            <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類有一個參數,是該地圖所在div的name
                        maps.cityNameAndZoom( "beijing" , 5 );
                        var c = new LTSmallMapControl();   //簡單的放大縮小條
                        maps.addControl(c);
                        var point = new LTPoint( 11640969 , 3989945 );//北京
                        var marker = new LTMarker( point );  //一個標記
                        maps.addOverLay( marker );  //將標記覆蓋到地圖涂層上
                        var text = new LTMapText( marker );
                        text.setLabel( "我的位置" );
                        maps.addOverLay( text );
                    </script>
                </form>
            </body>
            </html>

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

            51API架構

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

            setsockopt的函數原型為:
                   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為選項的開關標志符,例如我使用rc=1開啟SO_REUSEADDR。

            fcntl 文件控制,file control,譬如控制socket為非阻塞IO,信號驅動IO等。類似的有ioctl
            posted @ 2009-01-06 11:52 ronliu 閱讀(1419) | 評論 (0)編輯 收藏
              2009年1月4日
                 (一)感冒了,渾身發抖,頭疼,胸口疼,胃疼。不注意保暖,以及嚴重的不規律飲食帶來的?,F在只想早些跑回去鉆被窩加衣服。網絡小說是不能看了,不規律的飲食很大程度與此有關,且影響學習狀態??梢远嘧x一些歷史,政治,經濟方面的書,比如世界通史之類。關注養生,病殃殃的狀況實在難受,學會調養自己的身體。有條件的話,可以多鍛煉一些。
                 (二)找工作期間,最遺憾的是,沒有拿得出手的技能,以及拿得出手的成果。在找完工作之后,就開始急于求成,一心想作一個東西出來,但經常是想了卻不做,做時半途而廢,然后又開始新的想法。很浮躁,急于求成。在今后的三個月,可以多作技能方面的鍛煉。比如編程語言,能否作到精通?需要鍛煉的技能包括:
                  甲。語言是表達思想的工具,語言說不好,不精通,再好的思想也表達不出來。反過來,語言學得好了,會促進思維的成長。然后,掌握一門專精的語言,也是將來安身立命,向更深層次的架構師成長的根本。但就目前,有什么語言是真正拿的出手的?C++是最熟悉的,卻仍然談不上精通。在今后的三個月,對C++的深入鍛煉,是重點。
                  乙。在平常的編程中,算法用的似乎并不多,但對培養計算機的思維,培養設計能力,很有好處。更高層的,如設計模式之類。可以將語言的學習和算法,設計模式的學習結合起來。
                 (三)新的一年,增大一歲。不知不覺,二十好幾。回頭看時,什么也沒有做成。感情上,學業上,以及和家人的關系,都不如意。這是浮躁的根本原因。但這些問題,卻不是一蹴而就的,需要時間的積累,需要精力的積累,不是隨想就有的。就像Scott信中的那位技術總監,沒有5年甚至5年以上的技術沉淀,能夠將技術玩到如指臂使?淡然,做好自己該做的。清風撫山崗,明月照大江。高三畢業那年,能夠坐在河邊,對廣場上人來人往充耳不聞,和尚念經般默誦這兩句話,心中淡然。年齡增大,考慮增多,卻越來越浮躁了。在浮躁和淡然之間,需要有一個平衡。
                 (四)做好接下來的三個月!
            posted @ 2009-01-04 11:13 ronliu 閱讀(339) | 評論 (0)編輯 收藏
            僅列出標題  下一頁
            精品久久久一二三区| 伊人久久精品无码二区麻豆| 伊人久久大香线蕉亚洲| 亚州日韩精品专区久久久| 青青草国产成人久久91网| jizzjizz国产精品久久| 久久亚洲私人国产精品| 久久午夜羞羞影院免费观看| 亚洲∧v久久久无码精品| 国内精品久久久久影院薰衣草 | 久久综合亚洲欧美成人| 欧美亚洲国产精品久久高清| 久久夜色精品国产亚洲| 性做久久久久久久| 久久香蕉超碰97国产精品 | 亚洲国产成人久久综合碰| 久久99精品国产麻豆婷婷| 精品久久国产一区二区三区香蕉 | 久久毛片一区二区| 久久精品国产99国产精品亚洲| 人妻无码αv中文字幕久久琪琪布| 欧美黑人激情性久久| 日韩精品久久久久久免费| 久久国产一区二区| 精品久久久久久国产免费了| 国产香蕉久久精品综合网| 色综合久久久久久久久五月| 亚洲国产精久久久久久久| 日本久久中文字幕| 久久久久高潮毛片免费全部播放 | 国产精品久久久久久福利漫画 | 国产成人精品久久| 热99RE久久精品这里都是精品免费| 久久久噜噜噜久久中文福利| 久久精品国产一区二区| 天天躁日日躁狠狠久久| 国産精品久久久久久久| 亚洲AV无一区二区三区久久| 精品欧美一区二区三区久久久 | 久久久免费观成人影院| 色欲久久久天天天综合网 |