• <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>

            戰魂小筑

            討論群:309800774 知乎關注:http://zhihu.com/people/sunicdavy 開源項目:https://github.com/davyxu

               :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
              257 隨筆 :: 0 文章 :: 506 評論 :: 0 Trackbacks

            #

            這里使用的是Ubuntu的最流行發行版Mint, 其他版本類似

            以下將虛擬機內系統叫Guest, 運行VMWare的系統叫Host

            將VMWare的網絡方式設為Bridge模式. 注意Host-Only模式只能與Host連接,局域網的機器及互聯網機器無法訪問

            image

            在Guest的網絡設置中,將IP設置為與Host在一個局域網網段的IP, 設置DNS

            image

            關閉Guest系統

            接下來將Host的可以上網的連接添加共享,并連接到VMNet1

            image

            進入Guest系統, 測試上網

            posted @ 2012-02-04 11:41 戰魂小筑 閱讀(1564) | 評論 (1)編輯 收藏

            原文鏈接: http://www.programmer.com.cn/9436/

            作者: 王越

             

            2011年12月3日,LLVM 3.0正式版發布,完整支持所有ISO C++標準和大部分C++ 0x的新特性, 這對于一個短短幾年的全新項目來說非常不易。

            開發者的驚愕

            在2011年WWDC(蘋果全球開發者大會)的一場與Objective-C相關的講座上,開發者的人生觀被顛覆了。

            作為一個開發者,管理好自己程序所使用的內存是天經地義的事,好比人們在溜狗時必須清理狗的排泄物一樣(美國隨處可見“Clean up after your dogs”的標志)。在本科階段上C語言的課程時,教授們會向學生反復強調:如果使用malloc函數申請了一塊內存,使用完后必須再使用free函數把申請的內存還給系統——如果不還,會造成“內存泄漏”的結果。這對于Hello World可能還不算嚴重,但對于龐大的程序或是長時間運行的服務器程序,泄內存是致命的。如果沒記住,自己還清理了兩次,造成的結果則嚴重得多——直接導致程序崩潰。

            Objective-C有類似malloc/free的對子,叫alloc/dealloc,這種原始的方式如同管理C內存一樣困難。所以Objective-C中的內存管理又增加了“引用計數”的方法,也就是如果一個物件被別的物件引用一次,則引用計數加一;如果不再被該物件引用,則引用計數減一;當引用計數減至零時,則系統自動清掉該物件所占的內存。具體來說,如果我們有一個字符串,當建立時,需要使用alloc方法來申請內存,引用計數則變成了一;然后被其他物件引用時,需要用retain方法去增加它的引用計數,變成二。當它和剛才引用的物件脫離關聯時,需使release方法減少引用計數,又變回了一;最后,使用完這個字符串時,再用release方法減少其引用計數,這時,運行庫發現其引用計數變為零了,則回收走它的內存。這是手動的方式

            這種方式自然很麻煩,所以又設計出一種叫做autorelease的機制(不是類似Java的自動垃圾回收)。在Objective-C中,設計了一個叫做NSAutoReleasePool的池,當開發者需要完成一個任務時(比如每開啟一個線程,或者開始一個函數),可以手動創立一個這樣的池子, 然后通過顯式申明把物件扔進自動回收池中。NSAutoReleasePool內有一個數組來保存聲明為autorelease的所有對象。如果一個對象聲明為autorelease,則會自動加到池子里。如果完成了一個任務(結束線程了,或者退出那個函數),則開發者需對這個池子發送一個drain消息。這時,NSAutoReleasePool會對池子中所有的物件發送release消息,把它們的引用計數都減一 ——這就好比游泳池關門時通知所有客人都“滾蛋”一樣。所以開發者無需顯式聲明release,所有的物件也會在池子清空時自動呼叫release函數,如果引用計數變成零了,系統才回收那塊內存。所以這是個半自動、半手動的方式。

            Objective-C的這種方式雖然比起C來進了一大步,我剛才花了幾分鐘就和讀者講明白了。只要遵守上面這兩個簡單的規則,就可以保證不犯任何錯誤。但這和后來的Java自動垃圾回收相比則是非常繁瑣的,哪怕是再熟練的開發者,一不小心就會弄錯。而且,哪怕很簡單的代碼,比如物件的getter/setter函數,都需要用戶寫上一堆的代碼來管理接收來的物件的內存。

            經典教材《Cocoa Programming for Mac OS X》用了整整一章節的篇幅,來講解Objective-C中內存管理相關的內容,但初學者們看得還是一頭霧水。所以,在2007年10.5發布時,Objective-C做出了有史以來最大的更新,最大的亮點是它的運行庫libobjc 2.0正式支持自動垃圾回收,也就是由運行庫在運行時隨時偵測哪些物件需要被釋放。聽上去很不錯,可惜使用這個技術的項目卻少之又少。原因很簡單,使用這個特性,會有很大的性能損失,使Objective-C的內存管理效率低得和Java一樣,而且一旦有一個模塊啟用了這個特性,這個進程中所有的地方都要啟用這個特性——因此如果你寫了一個使用垃圾回收的庫,那所有引用你庫的程序就都得被迫使用垃圾回收。所以Apple自己也不使用這項技術,大量的第三方庫也不使用它。

            這個問題隨Apple在移動市場的一炮走紅而變得更加嚴峻。不過這次,Apple和與會的開發者講,他們找到了一個解決問題的終極方法,這個方法把從世界各地專程趕來聆聽圣諭的開發者驚得目瞪口呆——你不用寫任何內存管理代碼,也不需要使用自動垃圾回收。因為我們的編譯器已經學會了上面所介紹的內存管理規則,會自動在編譯程序時把這些代碼插進去。

            這個編譯器,一直是Apple公開的秘密——LLVM。說它公開,是因為它自始至終都是一個開源項目;而秘密,則是因為它從來沒公開在WWDC的Keynote演講上亮相過 。

            一直關注這系列連載的讀者一定還記得,在第二篇《Linus Torvalds的短視》介紹Apple和GPL社區的不合時,提到過“自以為是但代碼又寫得差的開源項目,Apple事后也遇到不少,比如GCC編譯器項目組。雖然大把鈔票扔進去,在先期能夠解決一些問題,但時間長了這群人總和Apple過不去,并以自己在開源世界的地位恫嚇之,最終Apple由于受不了這些項目組的態度、協議、代碼質量,覺得還不如自己造輪子來得方便?!盠LVM則是Apple造的這個輪子,它的目的是完全替代掉GCC那條編譯鏈。它的主要作者,則是現在就職于Apple的Chris Lattner。

            編譯器高材生Chris Lattner

            2000年,本科畢業的Chris Lattner像中國多數大學生一樣,按部就班地考了GRE,最終前往UIUC(伊利諾伊大學厄巴納香檳分校),開始了艱苦讀計算機碩士和博士的生涯。在這階段,他不僅周游美國各大景點,更是努力學習科學文化知識,翻爛了“龍書”(《Compilers: Principles, Techniques, and Tools》),成了GPA牛人【注:最終學分積4.0滿分】,以及不斷地研究探索關于編譯器的未知領域,發表了一篇又一篇的論文,是中國傳統觀念里的“三好學生”。他的碩士畢業論文提出了一套完整的在編譯時、鏈接時、運行時甚至是在閑置時優化程序的編譯思想,直接奠定了LLVM的基礎。
            LLVM在他念博士時更加成熟,使用GCC作為前端來對用戶程序進行語義分析產生IF(Intermidiate Format),然后LLVM使用分析結果完成代碼優化和生成。這項研究讓他在2005年畢業時,成為小有名氣的編譯器專家,他也因此早早地被Apple相中,成為其編譯器項目的骨干。

            Apple相中Chris Lattner主要是看中LLVM能擺脫GCC束縛。Apple(包括中后期的NeXT) 一直使用GCC作為官方的編譯器。GCC作為開源世界的編譯器標準一直做得不錯,但Apple對編譯工具會提出更高的要求。

            一方面,是Apple對Objective-C語言(甚至后來對C語言)新增很多特性,但GCC開發者并不買Apple的帳——不給實現,因此索性后來兩者分成兩條分支分別開發,這也造成Apple的編譯器版本遠落后于GCC的官方版本。另一方面,GCC的代碼耦合度太高,不好獨立,而且越是后期的版本,代碼質量越差,但Apple想做的很多功能(比如更好的IDE支持)需要模塊化的方式來調用GCC,但GCC一直不給做。甚至最近,《GCC運行環境豁免條款 (英文版)》從根本上限制了LLVM-GCC的開發。 所以,這種不和讓Apple一直在尋找一個高效的、模塊化的、協議更放松的開源替代品,Chris Lattner的LLVM顯然是一個很棒的選擇。

            剛進入Apple,Chris Lattner就大展身手:首先在OpenGL小組做代碼優化,把LLVM運行時的編譯架在OpenGL棧上,這樣OpenGL棧能夠產出更高效率的圖形代碼。如果顯卡足夠高級,這些代碼會直接扔入GPU執行。但對于一些不支持全部OpenGL特性的顯卡(比如當時的Intel GMA卡),LLVM則能夠把這些指令優化成高效的CPU指令,使程序依然能夠正常運行。這個強大的OpenGL實現被用在了后來發布的Mac OS X 10.5上。同時,LLVM的鏈接優化被直接加入到Apple的代碼鏈接器上,而LLVM-GCC也被同步到使用GCC4代碼。

            LLVM真正的發跡,則得等到Mac OS X 10.6 Snow Leopard登上舞臺??梢哉f, Snow Leopard的新功能,完全得益于LLVM的技術。而這一個版本,也是將LLVM推向真正成熟的重大機遇。

            關于Snow Leopard的三項主推技術(64位支持、OpenCL,以及Grand Central Dispatch)的細節,我們會在下一次有整整一期篇幅仔細討論,這次只是點到為止——我們告訴讀者,這些技術,不但需要語言層面的支持(比如Grand Centrual Dispatch所用到的“代碼塊”語法, 這被很多人看作是帶lambda的C),也需要底層代碼生成和優化(比如OpenCL是在運行時編譯為GPU或CPU代碼并發執行的)。而這些需求得以實現,歸功于LLVM自身的新前端——Clang。

            優異的答卷——Clang

            前文提到,Apple吸收Chris Lattner的目的要比改進GCC代碼優化宏大得多——GCC系統龐大而笨重,而Apple大量使用的Objective-C在GCC中優先級很低。此外GCC作為一個純粹的編譯系統,與IDE配合得很差。加之許可證方面的要求,Apple無法使用LLVM 繼續改進GCC的代碼質量。于是,Apple決定從零開始寫 C、C++、Objective-C語言的前端 Clang,完全替代掉GCC。

            正像名字所寫的那樣,Clang只支持C,C++和Objective-C三種C家族語言。2007年開始開發,C編譯器最早完成,而由于Objective-C相對簡單,只是C語言的一個簡單擴展,很多情況下甚至可以等價地改寫為C語言對Objective-C運行庫的函數調用,因此在2009年時,已經完全可以用于生產環境。C++的支持也熱火朝天地進行著。

            Clang的加入代表著LLVM真正走向成熟和全能,Chris Lattner以影響他最大的“龍書”封面【注:見http://en.wikipedia.org/wiki/Dragon_Book_(computer_science)】為靈感,為項目選定了圖標——一條張牙舞爪的飛龍。

            Clang一個重要的特性是編譯快速,占內存少,而代碼質量還比GCC來得高。測試結果表明Clang編譯Objective-C代碼時速度為GCC的3倍【注:http://llvm.org/pubs/2007-07-25-LLVM-2.0-and-Beyond.pdf】,而語法樹(AST)內存占用則為被編譯源碼的1.3倍,而GCC則可以輕易地可以超過10倍。Clang不但編譯代碼快,對于用戶犯下的錯誤,也能夠更準確地給出建議。使用過GCC的讀者應該熟悉,GCC給出的錯誤提示基本都不是給人看的。

            比如最簡單的:

            struct foo { int x; }
            typedef int bar;

            如果使用GCC編譯,它將告訴你:
            t.c:3: error: two or more data types in declaration specifiers

            但是Clang給出的出錯提示則顯得人性化得多:
            t.c:1:22: error: expected ‘;’ after struct

            甚至,Clang可以根據語境,像拼寫檢查程序一樣地告訴你可能的替代方案。
            比如這個程序:

            #include <inttypes.h>
            int64 x;

            GCC一樣給出亂碼似的出錯提示:

            t.c:2: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘x’

            而優雅的Clang則用彩色的提示告訴你是不是拼錯了,并給出可能的變量名:

            t.c:2:1: error: unknown type name ‘int64′; did you mean ‘int64_t’?
            int64 x;^~~~~int64_t

            更多的例子可以參考http://blog.llvm.org/2010/04/amazing-feats-of-clang-error-recovery.html。 而同時又因為Clang是高度模塊化的一個前端,很容易實現代碼的高度重用。所以比如Xcode 4.0的集成編程環境就使用Clang的模塊來實現代碼的自動加亮、代碼出錯的提示和自動的代碼補全。開發者使用Xcode 4.0以后的版本,可以極大地提高編程效率,盡可能地降低編譯錯誤的發生率。

            支持C++也是Clang的一項重要使命。C++是一門非常復雜的語言,大多編譯器(如GCC、MSVC)用了十多年甚至二十多年來完善對C++的支持,但效果依然不很理想。Clang的C++支持卻一直如火如荼地展開著。2010年2月4日,Clang已經成熟到能自舉(即使用Clang編譯Clang,到我發稿時,LLVM 3.0發布已完整支持所有ISO C++標準,以及大部分C++ 0x的新特性。

            這對于一個短短幾年的全新項目來說是非常不易的。得益于本身健壯的架構和Apple的大力支持,Clang越來越全能,從FreeBSD【注:http://lists.freebsd.org/pipermail/freebsd-current/2009-February/003743.html】 到Linux Kernel【注:http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-October/011711.html】, 從Boost【注:http://blog.llvm.org/2010/05/clang-builds-boost.html】 到Java虛擬機, Clang支持的項目越來越多。

            Apple的Mac OS X以及iOS也成了Clang和LLVM的主要試驗場——10.6時代,很多需要高效運行的程序比如OpenSSL和Hotspot就由LLVM-GCC編譯來加速的。而10.6時代的Xcode 3.2諸多圖形界面開發程序如Xcode、Interface Builder等,皆由Clang編譯。到了Mac OS X 10.7,整個系統的的代碼都由Clang或LLVM-GCC編譯【注:http://llvm.org/Users.html】。

            LLVM周邊工具

            由于受到Clang項目的威脅,GCC也不得不軟下來,讓自己變得稍微模塊化一些,推出插件的支持,而LLVM項目則順水推舟,索性廢掉了出道時就一直作為看家本領的LLVM-GCC,改為一個GCC的插件DragonEgg。 Apple也于Xcode 4.2徹底拋棄了GCC工具鏈。

            而Clang的一個重要衍生項目,則是靜態分析工具,能夠通過自動分折程序的邏輯,在編譯時就找出程序可能的bug。在Mac OS X 10.6時,靜態分析被集成進Xcode 3.2,幫助用戶查找自己犯下的錯誤。其中一個功能,就是告訴用戶內存管理的Bug,比如alloc了一個物件卻忘記使用release回收。這已經是一項很可怕的技術,而Apple自己一定使用它來發現并改正Mac OS X整個系統各層面的問題。但許多開發者還不滿足——既然你能發現我漏寫了release,你為什么不能幫我自動加上呢?于是ARC被集成進Clang,發生了文章開頭開發者們的驚愕——從來沒有人覺得這件事是可以做成的。

            除LLVM核心和Clang以外,LLVM還包括一些重要的子項目,比如一個原生支持調試多線程程序的調試器LLDB,和一個C++的標準庫libstdc++,這些項目由于是從零重寫的,因此要比先前的很多項目站得更高,比如先前GNU、Apache、STLport等C++標準庫在設計時,C++0x標準還未公布,所以大多不支持這些新標準或者需要通過一些骯臟的改動才能支持,而libstdc++則原生支持C++0x。而且在現代架構上,這些項目能動用多核把事情處理得更好。

            不單單是Apple,諸多的項目和編程語言都從LLVM里取得了關鍵性的技術。Haskell語言編譯器GHC使用LLVM作為后端,實現了高質量的代碼編譯。很多動態語言實現也使用LLVM作為運行時的編譯工具,較著名的有Google的Unladen Swallow【注:Python實現,后夭折】、PyPy【注:Python實現】,以及MacRuby【注:Ruby實現】。例如 MacRuby 后端改為LLVM后,速度不但有了顯著的提高,更是支持Grand Central Dispatch來實現高度的并行運行。由于LLVM高度的模塊化,很方便重用其中的組件來作為一個實現的重要組成部分,因此類似的項目會越來越多。

            LLVM的成熟也給其他痛恨GCC的開發項目出了一口惡氣。其中最重要的,恐怕是以FreeBSD為代表的BSD社區。BSD社區和Apple的聯系一向很緊密,而且由于代碼相似,很多Apple的技術如Grand Central Dispatch也是最早移植到FreeBSD上。BSD社區很早就在找GCC的替代品,無奈大多都很差(如Portable C Compiler產生的代碼質量和gcc不能同日而語)。

            一方面是因為不滿意GCC的代碼品質【注:BSD代碼整體要比GNU的高一些,GNU代碼永無休止地出現各種嚴重的安全問題】,更重要的是協議問題。BSD開發者有潔癖的居多,大多都不喜歡GPL代碼,尤其是GPL協議第三版發布時,和FreeBSD的協議甚至是沖突的。這也正是為什么FreeBSD中包含的GNU的C++運行庫還是2007年以GPLv2發布的老版本,而不是支持C++0x的但依GPLv3協議發布的新版本。 因此歷時兩年的開發后,2012年初發布的FreeBSD 9.0中,Clang被加入到FreeBSD的基礎系統。 但這只是第一步,因為FreeBSD中依然使用GNU的C++ STL 庫、C++運行庫、GDB調試器、libgcc/libgcc_s編譯庫都是和編譯相關的重要底層技術,先前全被GNU壟斷,而現在LLVM子項目lldb、libstdc++、compiler-rt等項目的出現,使BSD社區有機會向GNU說“不”,因此一個把GNU組件移出FreeBSD的計劃被構想出來,并完成了很大一部分。編寫過《Cocoa Programming Developer’s Handbook》的著名Objective-C牛人David Chisnall也被吸收入FreeBSD開發組完成這個計劃的關鍵部分。 預計在FreeBSD 10發布時,將不再包含GNU代碼。

            LLVM在短短五年內取得的快速發展充分反映了Apple對于產品技術的遠見和處理爭端的決心和手腕,并一躍成為最領先的開源軟件技術。而Chris Lattner在2010年也贏得了他應有的榮譽——Programming Languages Software Award(程序設計語言軟件獎)。

             

             

            本站評:

                一直對LLVM 及Clang搞的迷迷糊糊的, 這篇文章寫的很翔實.

                微軟在產品及平臺上的開放性簡直是坑爹. 雖然開發工具上很給力, 但其致命點仍然是封閉

                蘋果簡單,高效, 用戶至上的思想在其平臺及產品中(AppleScript,LLVM,Clang)體現得淋漓精致. 垃圾回收的改進一路磕磕碰碰,但最終的方案讓我們折服.

            posted @ 2011-12-31 16:51 戰魂小筑 閱讀(3016) | 評論 (15)編輯 收藏

            在插件菜單NppExec->Execute彈出的對話框中輸入以下信息

            "protoc.exe"   --cpp_out $(CURRENT_DIRECTORY) --proto_path $(CURRENT_DIRECTORY)  $(FULL_CURRENT_PATH) 

             

            protoc.exe的路徑可以自己指定本機的絕對路徑

            編譯出的文件將自動放置到proto文件所在目錄

            posted @ 2011-12-22 11:00 戰魂小筑 閱讀(3346) | 評論 (2)編輯 收藏

            本人使用Windows為主要開發平臺, Linux為編譯,調試平臺

            Linux使用類VC的IDE CodeLite

            設置方法:

            1. Settings->Global Editor Preferences->Misc->Encoding and Locale

            2. File font encoding: 選擇 WINDOWS-936

            3. Locale to use zh_CN: Chinese(Simplified)

            重啟CodeLite, 可有效避免Linux修改了文件,導入Windows變成亂碼!

            posted @ 2011-12-15 11:02 戰魂小筑 閱讀(2043) | 評論 (4)編輯 收藏

            protobuf反射代碼借鑒自陳碩的blog一種自動反射消息類型的 Google Protobuf 網絡傳輸方案  在此表示感謝

            這里是proto文件

            message QueryAccount
            {    
                // in
                required string SQL = 1;
                
                // out
                optional int64 id = 2;
            }
             
            C++實現
               1:  void ReflectionFill( google::protobuf::Message* Msg, const google::protobuf::Descriptor* MsgDescriptor, mysqlpp::Row& RowData )
               2:  {
               3:      using namespace google::protobuf;
               4:   
               5:      // 遍歷所有消息成員
               6:      for ( size_t i = 0;i < MsgDescriptor->field_count();i++ )
               7:      {        
               8:          const FieldDescriptor* EachField = MsgDescriptor->field( i );
               9:   
              10:          // 這里假定optinal的是返回值
              11:          if ( !EachField->is_optional() )
              12:              continue;
              13:   
              14:          // sql的列
              15:          std::string FieldName = EachField->name();
              16:              
              17:          // 返回的CPP類型
              18:          switch ( EachField->cpp_type() )
              19:          {
              20:          case FieldDescriptor::CPPTYPE_STRING:
              21:              {
              22:                  std::string Result  = RowData[FieldName.c_str()];
              23:                  Msg->GetReflection()->SetString( Msg, EachField, Result );
              24:              }
              25:              break;
              26:          case FieldDescriptor::CPPTYPE_INT64:
              27:              {
              28:                  // 從列取值
              29:                  __int64 Result = RowData[FieldName.c_str()];
              30:   
              31:                  // 設置消息
              32:                  Msg->GetReflection()->SetInt64( Msg, EachField, Result );
              33:              }
              34:              break;
              35:          }
              36:   
              37:      }
              38:  }
              39:   
              40:   
              41:   
              42:  void ParseMessage( mysqlpp::Connection& SQLConnection, const char* ProtoType, void* Data, size_t Size )
              43:  {
              44:      // 轉載請注明來自 戰魂小筑http://www.shnenglu.com/sunicdavy
              45:      using namespace google::protobuf;
              46:   
              47:      Message* Msg = NULL;
              48:   
              49:      // 通過類型字符串查出消息類型信息
              50:      const Descriptor* MsgDescriptor = DescriptorPool::generated_pool()->FindMessageTypeByName(ProtoType);
              51:      if (MsgDescriptor == NULL )
              52:          return;
              53:   
              54:      // 取消息原型
              55:      const Message* MsgPrototype = MessageFactory::generated_factory()->GetPrototype(MsgDescriptor);
              56:      if (MsgPrototype == NULL )
              57:          return;
              58:   
              59:      // 不能用原型消息哦,要新的
              60:      Msg = MsgPrototype->New();
              61:   
              62:      // 解析數據
              63:      Msg->ParseFromArray( Data, Size );
              64:   
              65:      // 查找SQL指令
              66:      const FieldDescriptor* SQLField = MsgDescriptor->FindFieldByName("SQL");
              67:      if ( SQLField == NULL )
              68:          return;
              69:   
              70:      // 使用反射查出值
              71:      std::string SQLCmd = Msg->GetReflection()->GetString( *Msg, SQLField );
              72:   
              73:      // 進行SQL查詢
              74:      mysqlpp::Query query = SQLConnection.query( SQLCmd.c_str() );
              75:   
              76:      // 確認查詢有效
              77:      mysqlpp::StoreQueryResult res = query.store();
              78:   
              79:      if (!res)
              80:          return;
              81:   
              82:      // 這里只取第一個消息
              83:      mysqlpp::Row RowData = *res.begin();
              84:   
              85:      // 反射填充消息
              86:      ReflectionFill( Msg, MsgDescriptor, RowData );
              87:   
              88:      // 測試返回數據
              89:      dbsvc::QueryAccount* qamsg = dynamic_cast<dbsvc::QueryAccount*>( Msg );
              90:      __int64 i = qamsg->id();
              91:   
              92:      delete Msg;
              93:  }
              94:   
              95:   
              96:  int main(int argc, char* argv[])
              97:  {    
              98:      mysqlpp::Connection con(false);
              99:   
             100:      con.set_option(new mysqlpp::SetCharsetNameOption("gbk"));
             101:   
             102:   
             103:      if (!con.connect("testdb", "localhost", "root", "123"))
             104:      {
             105:          return -1;
             106:      }
             107:      else
             108:      {
             109:   
             110:          dbsvc::QueryAccount Msg;
             111:          Msg.set_sql("select id from account where username = 'hello'");
             112:          std::string s;
             113:          Msg.SerializeToString( &s );
             114:   
             115:          ParseMessage( con, "dbsvc.QueryAccount", (void*)s.data(), s.size() );
             116:      }
             117:   
             118:      google::protobuf::ShutdownProtobufLibrary();
             119:  }
            posted @ 2011-12-14 17:48 戰魂小筑 閱讀(4869) | 評論 (3)編輯 收藏

            今天從hg取過代碼后編譯代碼,居然出現了C1859的預編譯頭破損錯誤,查過預編譯頭設置與清空中間文件夾重試,問題依舊.

            Google后發現解決方法:打補丁

            問題說明:http://support.microsoft.com/kb/976656

            補丁地址 http://archive.msdn.microsoft.com/KB976656/Release/ProjectReleases.aspx?ReleaseId=3703

             

            考慮部署到vs2010, 但vs2012又要出來了,還是忍忍吧

            posted @ 2011-12-12 19:07 戰魂小筑 閱讀(2832) | 評論 (0)編輯 收藏

             

            在點擊google搜索結 果時,google會在結果的URL前做個跳轉,且有時這個跳轉地址會被墻,這樣極大的影響對搜索引擎的使用體驗。近期,Google的基本搜索功能又開 始間歇性的被重置,更別說那些早已被壓在大墻底下的Google應用了,現在每天搜索幾乎都是在無止盡的RESET中,找到瞬間,而且打開地址,還經常需 要復制鏈接,然后粘貼到地址欄,才能打開,否則,只要你點擊Google搜索結果中的鏈接就會被重置,而不管你是搜IT、工程、或是技術問題、醫藥等,現 在似乎關鍵詞已經不再重要,重要的是RESET誰。

            遇到地址超長的搜索結果,沒有辦法復制地址,因為復制鏈接仍然會帶Google的自跟蹤跳轉地址,盡管手動刪剪也可以提出來但很麻煩。所以只能看摘要而無法點擊。本來已經決定減少寫這類無病呻吟的文章的,但最近或許是真的病了,亦或是要大病了。


            下載以下js包

            在Chrome中進入擴展, 或者在URL/Files/sunicdavy/RemoveRedirect.zip欄中輸入chrome://settings/extensionSettings

            選擇載入正在開發的程序,選擇解壓后的目錄

            刷新Google頁面即可

            摘要轉自G F W B l o g
            http://feedproxy.google.com/~r/chinagfwblog/~3/16MzeaVflwo/google.html

            posted @ 2011-12-10 10:17 戰魂小筑 閱讀(3244) | 評論 (2)編輯 收藏

            使用boost的string庫進行跨平臺操作,包含文件

            #include <boost/algorithm/string.hpp>

             

            結果遇到編譯錯誤

            error C2632: '__int64' followed by '__int64' is illegal

            發現在config-win32.h已經定義過宏,在boost\cstdint.hpp又使用了一次typedef, 因此將包含修改為:

            #undef int64_t
                #include <boost/algorithm/string.hpp>

             

            問題解決

            posted @ 2011-12-01 16:48 戰魂小筑 閱讀(5067) | 評論 (0)編輯 收藏

               VC有個讓新手抓狂的地方, 把工程路徑作為調試模式時的進程當前目錄. 

            估計很多新手因為打不開文件而耗費大量的時間,甚至放棄

            以前使用純Windows方式解決這種問題:

               1:  #include <Shlwapi.h>
               2:  #include <shlobj.h>
               3:   
               4:  #pragma comment(lib,"shlwapi.lib")
               5:   
               6:  wchar_t exename[MAX_PATH];
               7:  ::GetModuleFileName(NULL,exename,MAX_PATH);
               8:  ::PathRemoveFileSpec( exename );
               9:  ::SetCurrentDirectory( exename );

            需要跨平臺時,可以這樣寫:

               1:  #include <direct.h>
               2:  #include <boost/filesystem.hpp>
               3:   
               4:  int main(int argc, char* argv[])
               5:  {    
               6:      _chdir( boost::filesystem::path( argv[0] ).remove_filename().string().c_str() );        
               7:  }

                 被Windows慣壞了, 到處找Linux或者boost版本的GetModuleFileName, 結果忘記了當年c語言課上教的命令行傳入參數...
            posted @ 2011-12-01 11:28 戰魂小筑 閱讀(1917) | 評論 (6)編輯 收藏

            標題:.Net兼職程序員(成都時薪制)

            地區:全國

            薪水:時薪 (面議)

            技能要求:

            1. Asp.net網站開發2年以上經驗, 工作經驗2年以上, 有獨立搭建小型網站的能力;

            2. 有良好的前臺頁面設計能力,熟悉HTML, CSS, Javascript, 會用Photoshop對圖片做簡單的處理,會切圖,能用Div+CSS的方式編寫HTML代碼;

            3. 有良好的面向對象思想,良好的代碼規范,熟悉常用設計模式,有小型網站的架構能力;

            5. 對Ajax熟悉,對jQuery非常熟悉;

            6. 熟悉XML, Webserivce, ADO.Net等技術;

            7. 有很強的責任心,對工作熱愛,能獨立完成工作,能保證項目提交質量;

            有兼職項目經驗優先考慮;

            英語能力優秀優先考慮;

            熟悉微軟Asp.net MVC架構優先考慮;

            有SEO經驗優先考慮;

            成都地區優先考慮;

            兼職要求:

            1. 能接受時薪制,按勞動時間獲得報酬;

            2. 能確保工作效率和工作質量,不能為了完成任務而偷工減料,以確保項目質量為己任;

            3. 開發過程透明,按勞動時間付費意味著我們需要了解你詳細的工作計劃和進度,需要提交工作報告;

            4. 需要與我們的管理團隊做到完全透明的代碼共享,我們的項目經理需要在項目全程檢查代碼質量,需每日提交代碼到代碼服務器;

            5. 能配合我們的項目管理,能獨立,高效地完成任務,能做到實事求是;

            6. 我們需要的是平等關系的開發服務,當我們建立信任后,將維持長期的合作關系;

            7. 我們需要查看你以往的項目案例,代碼示例;

            8. 與我公司簽訂勞務合同,保密協議,依法繳納勞務所得稅;

             

             

             

             

            標題:.Net中級工程師(成都5-8k

            工作地點:四川-成都

            工作年限:3年

            學歷要求:本科

            招聘分類:.NET程序員

            工資范圍:5000元 ~ 8000元

            福利待遇:帶薪年假,五險一金,午餐補助,英語及其他技術培訓

            職位描述

            你的主要工作是和歐洲、北美或澳洲的客戶合作,利用你的專業技能,提供讓客戶滿意的軟件和服務。

            如果你是能獨當一面的強者,我們希望你能在這里發現你事業的新目標;如果你期望成為這樣的強者,我們會定時提供非強制性的培訓,幫助你在我們團隊中成長。

            絕大部分時間你不需要加班。如果一定需要加班——當然這種情況很少很少,客戶會支付加班費,而且,你會獲得比法定額度更多的補償。

            我們實行彈性工作時間,你不需要打卡。但是,你應該具備足夠的職業素養,每天的工作效率和結果能夠匹配你每天8小時的薪水。

            我們需要這樣的你

            你會直接面對國外客戶。所以,你應該至少可以用英語和客戶流暢地進行即時書面交流。有外企工作經驗或歐美外包經驗,能進行口語交流會有加分。

            你應該熱愛編程事業,希望你能把每一次編碼工作都當作自己的藝術品來精雕細琢,我們熱烈歡迎編程狂熱分子。

            你的專業技能包括,但不限于如下方面:

            1. 具有豐富的C#編碼經驗,熟悉ASP.NET的運行機制和原理。掌握WebService和WCF可獲得加分;

            2. 具有面向對象的思維習慣,良好的代碼規范。熟悉設計模式,有一定架構能力可獲得加分;

            3. 能熟練運用html,css和javascript。熟悉ajax,使用過一種以上js框架可獲得加分;

            4. 具有足夠的代碼質量意識。做過QA可獲得加分;

            具有如下經驗者,可獲得額外加分:

            1. 簡單的圖片處理;

            2. Html5,css3;

            3. Flash, Flex, Air;

            4. SEO;

             

             

            標題:.Net高級工程師(成都8-11k)

            工作地點:四川-成都

            工作年限:4年

            學歷要求:本科

            招聘分類:.NET程序員

            工資范圍:8000元 ~ 11000元

            福利待遇:帶薪年假,五險一金,午餐補助,英語及其他技術培訓

            招聘人數:2

            職位描述

            你的主要工作是和歐洲、北美或澳洲的客戶合作,利用你的專業技能,提供讓客戶滿意的軟件和服務。

            絕大部分時間你不需要加班。如果一定需要加班——當然這種情況很少很少,客戶會支付加班費,而且,你會獲得比法定額度更多的補償。

            我們實行彈性工作時間,你不需要打卡。但是,你應該具備足夠的職業素養,每天的工作效率和結果能夠匹配你每天8小時的薪水。

            我們需要這樣的你

            你會直接面對國外客戶。所以,你應該至少可以用英語和客戶流暢地進行即時書面交流。有外企工作經驗或歐美外包經驗,能進行口語交流會有加分。

            你應該具有良好的溝通能力和溝通的意愿,希望你能想在客戶的前面,真正把自己當成客戶的合作伙伴,而不是苦工。如果你能用你的實際行動讓客戶也認識到這一點,你會有豐厚的回報。

            你應該是一個能獨當一面的強者,或者你期望變成這樣的強者。

            你應該熱愛編程事業,希望你能把每一次編碼工作都當作自己的藝術品來精雕細琢,我們熱烈歡迎編程狂熱分子。

            你的專業技能包括,但不限于如下方面:

            1. 具有豐富的C#編碼經驗,熟悉ASP.NET的運行機制和原理。掌握自定義控件可獲得加分;

            2. 具有面向對象的思維習慣,良好的代碼規范。能熟練運用至少三種設計模式,有一定架構能力可獲得加分;

            3. 精通html,css和javascript。能編寫jQuery插件或做過extjs擴展可獲得加分;

            具有如下經驗者,可獲得額外加分:

            1. Sharepoint和MOSS;

            2. Office插件開發;

            3. 簡單的圖片處理;

            4. Html5,css3;

            5. Flash, Flex, Air;

            6. SEO;

            7. Android, IOS;

             

             

            標題:.Net MVC高級工程師(成都8-11k)

            工作地點:四川-成都

            工作年限:4年

            學歷要求:本科

            招聘分類:.NET MVC程序員

            工資范圍:8000元 ~ 11000元

            福利待遇:帶薪年假,五險一金,午餐補助,英語及其他技術培訓

            招聘人數:2

            職位描述

            你的主要工作是和歐洲、北美或澳洲的客戶合作,利用你的專業技能,提供讓客戶滿意的軟件和服務。

            絕大部分時間你不需要加班。如果一定需要加班——當然這種情況很少很少,客戶會支付加班費,而且,你會獲得比法定額度更多的補償。

            我們實行彈性工作時間,你不需要打卡。但是,你應該具備足夠的職業素養,每天的工作效率和結果能夠匹配你每天8小時的薪水。

            我們需要這樣的你

            你會直接面對國外客戶。所以,你應該至少可以用英語和客戶流暢地進行即時書面交流。有外企工作經驗或歐美外包經驗,能進行口語交流會有加分。

            你應該具有良好的溝通能力和溝通的意愿,希望你能想在客戶的前面,真正把自己當成客戶的合作伙伴,而不是苦工。如果你能用你的實際行動讓客戶也認識到這一點,你會有豐厚的回報。

            你應該是一個能獨當一面的強者,或者你期望變成這樣的強者。

            你應該熱愛編程事業,希望你能把每一次編碼工作都當作自己的藝術品來精雕細琢,我們熱烈歡迎編程狂熱分子。

            你的專業技能包括,但不限于如下方面:

            1. 具有豐富的C#編碼經驗,熟悉ASP.NET MVC的運行機制和原理。掌握Code First和Razor View Engine可獲得加分;

            2. 具有面向對象的思維習慣,良好的代碼規范。能熟練運用至少三種設計模式,有一定架構能力可獲得加分;

            3. 精通html,css和javascript。能編寫jQuery插件或做過extjs擴展或使用過JSON交互數據可獲得加分;

            具有如下經驗者,可獲得額外加分:

            1. Dependency Injection;

            2. EntityFramework;

            3. NHibernate;

            4. WCF;

            5. Work Flow;

            6. Html5,CSS3;

            7. SEO;

            8. Agile Development;

            9. 簡單的圖片處理;

             

            聯系方式見博客頂欄

            posted @ 2011-11-30 15:07 戰魂小筑 閱讀(777) | 評論 (4)編輯 收藏

            僅列出標題
            共26頁: First 7 8 9 10 11 12 13 14 15 Last 
            久久亚洲AV成人无码软件 | 亚洲国产精品综合久久网络| 久久九九有精品国产23百花影院| 狠色狠色狠狠色综合久久| 精品熟女少妇aⅴ免费久久| 国产精品久久久久久五月尺| 91精品国产91久久久久福利| 久久精品国产欧美日韩| 亚洲精品无码久久久久久| 91精品国产综合久久香蕉| 2021国产精品午夜久久| 国产99久久精品一区二区| 一级做a爰片久久毛片毛片| 99久久精品国内| 久久久久久精品久久久久| 韩国三级大全久久网站| 亚洲国产精品无码久久久不卡 | 精品国产乱码久久久久久郑州公司| 99久久综合狠狠综合久久| 婷婷伊人久久大香线蕉AV| 蜜臀久久99精品久久久久久| 久久精品无码一区二区三区| 色综合久久无码五十路人妻| 一本久道久久综合狠狠躁AV| 久久精品视频91| 99久久国产热无码精品免费久久久久| 久久综合精品国产二区无码| 97精品伊人久久大香线蕉| 久久久久久久综合综合狠狠| 国产精品一区二区久久精品无码 | 亚洲va久久久噜噜噜久久男同| 久久人人爽人人精品视频| 久久99久久成人免费播放| 99久久精品无码一区二区毛片| 久久精品视频免费| 亚洲欧美日韩精品久久| 国产69精品久久久久777| 九九久久99综合一区二区| 久久99精品国产麻豆宅宅| 91精品日韩人妻无码久久不卡| 亚洲欧美日韩精品久久|