• <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>
            xiaoguozi's Blog
            Pay it forword - 我并不覺的自豪,我所嘗試的事情都失敗了······習(xí)慣原本生活的人不容易改變,就算現(xiàn)狀很糟,他們也很難改變,在過程中,他們還是放棄了······他們一放棄,大家就都是輸家······讓愛傳出去,很困難,也無法預(yù)料,人們需要更細心的觀察別人,要隨時注意才能保護別人,因為他們未必知道自己要什么·····

            作為一個軟件開發(fā)者,你不可避免地需要用到各種工具來設(shè)計、理解、編輯任何程序,本文作者按類型總結(jié)了10類開發(fā)者須知的工具。CSDN摘譯如下:

            免責(zé)聲明:“最好”的軟件工具通常屬于主觀看法,也許你并不同意我的觀點,但是也可以從中獲取所需。

            1. 版本控制工具

            無論你是在100人的團隊,還是一個人做設(shè)計、開發(fā),版本控制工具都能讓你從中獲益。

            通過版本控制工具,你可以保留同一文件中在不同時期的版本,這對圖表和二進制文件都適用,尤其適合文本類型文件。

            主流版本控制工具可以分為兩種:集中式和分布式。集中式版本控制工具需要一個服務(wù)器存儲倉庫,你可以在合適的時候把代碼提交到服務(wù)器上。而分布式版 本控制工具(DVCS)則不需要中心服務(wù)器:每個倉庫的使用者都有自己的本地緩存,將更新從一個本地倉庫傳遞到另一個的過程非常簡單只需要從源系統(tǒng) push或者從目標(biāo)系統(tǒng)pull即可。

            目前最流行的開源版本控制工具要數(shù)Subvision(SVN)、Git以及Mercurial(hg)了,其中SVN是集中式版本控制工具,Git和Mercurial則是分布式的。

            值得注意的是,有很多知名網(wǎng)站提供倉庫托管服務(wù),比如bitbucket.org、SourceForge、GoogleCode以及Github等等,這些網(wǎng)站都提供免費托管服務(wù),但在具體服務(wù)支持與收費上各不相同。

            2. 文件比較工具

            無論你是想要與版本控制系統(tǒng)合并代碼,還是僅僅想要比較兩個文件的不同,文件比較工具都是非常有用的。其中diff是一個非常有名的命令行比較工具,我也喜歡Beyond Compare這款圖形界面比較工具——可惜它并非免費,但是并不貴而且簡單、強大。除此之外,常見文件比較工具還有SourceGearDiffMerge(免費、跨平臺=Windows/OS X/Linux),Compare It!(收費、僅支持Windows),DeltaWalker(較貴、僅支持OSX)以及UltraCompare(較貴、跨平臺)。

            3. 編輯器

            處理文本文件的難以取決于你使用的軟件。重量級的編輯器,如Eclipse、NetBeans、Visual Studio都屬于是IDE(integrateddevelopment environment,集成開發(fā)環(huán)境),如果你需要做特定的工作,他們都非常強大。但有時候你僅僅想要簡單、快速地編輯文件,系統(tǒng)自帶的編輯器 (Windows下的Notepad和Machine下的TextEdit)雖然輕量但是不夠強大。這里介紹幾個中量級的編輯器:Windows平臺的Notepad++、Mac平臺的TextWrangler都是不錯的免費編輯器,還有GNUemacs、Vim這樣強大、可擴展的自由軟件。

            4. 構(gòu)建工具

            如果你使用IDE進行開發(fā),僅僅單擊“Build”即可以為你編譯程序的源代碼。但是注意:編譯軟件時常常有很多細節(jié)的編譯選項,而使用IDE時常常被深藏在復(fù)雜的菜單中。我認為,專業(yè)的程序員應(yīng)該使用可定義的構(gòu)建工具,選擇正確的編譯選項達到最優(yōu)效果。

            5. 腳本工具

            有時候你需要快速整合多個軟件以達到某個目的,這時很難選擇C或者C++這樣需要編譯的編程語言,因為它們在執(zhí)行前需要先編譯成可執(zhí)行的文件。此時,更好的解決方案是腳本語言,它們通常集成在操作系統(tǒng)中,編寫一個腳本甚至可以在多臺計算機中運行。

            常見現(xiàn)代腳本語言有Python、Ruby、Groovy、awk、Perl等等。不論你更喜歡那種,我建議你選擇其中一款。我很喜歡Python,不僅因為它簡單、鼓勵好的編程規(guī)范,而且擁有強大的調(diào)試工具——基于Eclipse的PyDev。借助PyDev,你可以設(shè)置斷點、并端部執(zhí)行你的腳本。

            6. 數(shù)值分析工具

            除非你打算做一些及其簡單的項目,或者為嵌入式系統(tǒng)進行邏輯編程,你常常會需要對數(shù)據(jù)有一個直觀地了解——圖表、或者曲線圖,又或者僅僅想要解一個方程,這時候你會需要數(shù)據(jù)分析工具,比如MATLABMathematicaMathCAD,它們都非免費,甚至價格昂貴,但是價格強大。

            如果你的需求簡單,SciLabOctavePyLab這些MATLAB的免費“克隆”版本也提供了某些MATLAB的基本功能,語法也與MATLAB相近或相同。其中PyLab用Python實現(xiàn),如果你懂Python,或許可以將其利用到科學(xué)計算領(lǐng)域。

            7. 文檔工具

            工程環(huán)境中,你常常需要和他人分享想法,很多軟件都可以做到這點,比如使用微軟的Visio可以提供流程圖、表,Word來編輯文檔,PowerPoint來做演示。但它們都非免費,有時候你更需要免費或者更特化的文檔工具。

            • 圖形可視化工具——我常用的是基于命令行的graphviz,以及擁有交互界面的yEd。    
            • 流程圖——使用圖形表達思路。Quick Sequence Diagram Editor很基本,但是足以幫助你達到繪制這些圖形的目的。    
            • 排版工具——你可以使用WYSIWYG工具,也可以選擇非WYSIWYG軟件,又或者TeX、LaTeX,隨個人喜好。    
            • 代碼自文檔工具——Doxygen很常見,可以將代碼中的注釋轉(zhuǎn)化成文檔,JavaDoc則是轉(zhuǎn)為Java設(shè)計的文檔工具。    

            8. 終端以及通信工具

            有時候你會需要通過串口進行通信,這時你就需要終端工具了,在Web瀏覽器出現(xiàn)之前,這更為常見。曾經(jīng)與Windows綁定的HyperTerminal不夠強大,不建議使用,而且微軟在Vista之后也不再集成它。我個人更喜歡PuTTYtelTeraTermPro。其它通信工具如FTP及其安全變種SFTP、SCP方面我最喜歡Cyberduck,現(xiàn)在支持Mac和Windows。

            9. 軟件QA(質(zhì)量保障)工具

            對于開發(fā)者來說,為避免bug你肯定需要QA工具。我不是很清楚這方面,但是知道大概可以分以下幾類:

            • 靜態(tài)分析工具。它是一種分析軟件的工具,既可以分析軟件源代碼,也可以分析編譯后的文件。最出名的莫過于面向C語言的lint,lint會像老是一樣在你代碼的錯誤之處標(biāo)出紅線,標(biāo)出你的錯誤。Java語言有FindBugs對應(yīng),能夠幫助衡量代碼復(fù)雜度——通常好的程序設(shè)計函數(shù)比較小,如果某個函數(shù)超過20-30行代碼,你可以考慮將其分解了,這樣也更便于設(shè)計和調(diào)試。    
            • 單元測試和代碼覆蓋率。大 型軟件測試通常極難,這是公認的;但是使用“單元測試”測試更小的軟件模塊卻簡單得多。但是單元測試同樣也有不擅長的領(lǐng)域,比如嵌入式系統(tǒng),雖然可以通過 交叉編譯在PC上尋找bug,但并不能保證在嵌入式機器上效果一致。單元測試也有一定的技巧,比如可以編寫可重復(fù)利用的測試腳本。代碼覆蓋工具我僅見過同 事使用Cantata++,但并不便宜。    
            • 代碼“美化器”。如果你和同事使用相同的編碼風(fēng)格,更容易尋找出簡單的語法錯誤。通常我們都有各自的編程習(xí)慣,但是可以通過軟件達到統(tǒng)一編程風(fēng)格的效果——比如自動縮進、tab空格轉(zhuǎn)換等等。我使用過Uncrustify,以及其GUI工具UniversalIndentGU。    

            10. 基本命令行工具

            雖然GUI對于計算機交互是革命性的改進,但還有很多事用命令行做起來更加簡單,比如使用腳本能夠輕易組合多個程序。如果你使用OS X或者Linux,那計算機上一般已經(jīng)預(yù)裝了UNIX命令行工具,Windows用戶可以下載相應(yīng)的二進制文件

            其它,諸如7zipCPU-ZSystem Explorer之類的軟件雖然沒有放在這個列表中,但也都是非常實用的工具。

            原文鏈接:EmbeddedRelated.com

            posted @ 2013-05-10 09:17 小果子 閱讀(440) | 評論 (0)編輯 收藏

            Meteor是一個新鮮出爐的現(xiàn)代網(wǎng)站開發(fā)平臺,目前發(fā)布的是開發(fā)預(yù)覽版0.5.8,代碼以GPL協(xié)議開源。大家可以去 GitHub上關(guān)注它。Meteor本質(zhì)上是Node.JS應(yīng)用的開發(fā),繼承了Ruby on Rails、Node.JS、MongoDB API等框架的基礎(chǔ)特性,模糊了服務(wù)器端和客戶端,弱化網(wǎng)絡(luò)連接質(zhì)量造成的影響。

            如果簡單定義“現(xiàn)代網(wǎng)站”是一個實時交互、超高性能、具備非凡體驗的網(wǎng)站,那么 Meteor就是一個可為開發(fā)者以簡單高效而且充滿樂趣的方式進行現(xiàn)代網(wǎng)站開發(fā)的平臺,以往開發(fā)周期需要幾周到幾個月的項目,現(xiàn)在可能只需要幾個小時或者 一個周末的時間就可以完成。Meteor構(gòu)建的應(yīng)用體驗,會讓人覺得瀏覽器的刷新按鈕和地址欄是多余的。

            Meteor在2012年4月首次發(fā)布,該消息一經(jīng)發(fā)布,便迅速占據(jù)了Haceker News頭條寶座,并且成為Hacker News上最熱門的文章之一。本文是作者Sacha Greif使用Meteor開發(fā)的心得體會,他認為Meteor會讓實時Web App在未來成為主流。

            下面是對原文的翻譯:

            在過去6個月里,我使用Meteor做了點東西( Telescope,Meteor開源的主要應(yīng)用程序之一),我覺得有必要分享一下我的感受。


            首先聲明:在和Meteor代碼打交道的每一天里,我的大部分時間都在使Telescope變更加可用,而不是去深入挖掘Meteor,所以我不敢 自稱是Meteor方面的專家,而之所以能很快上手,很大一部分原因是因為它是一個非常好用且高效的框架,即使在你不精通的情況下也能開發(fā)出非常出色的應(yīng) 用。

            簡單 智能

            Meteor的一大特色就是可以輕松構(gòu)建高品質(zhì)的實時Web應(yīng)用程序,相信很多程序員都是因為這一特性而熟知Meteor的。當(dāng)開始使用Meteor時,會讓你的生活變得很簡單。

            安裝Meteor也非常簡單,只需一行命令即可。隨即便創(chuàng)建第一個應(yīng)用程序,就連部署也都非常簡單,由于Meteor提供免費的托管,因此你可以在線部署,供世界各地的人來瀏覽。


            此外,使用Meteor編寫的應(yīng)用程序運行速度也非常快。例如,當(dāng)你的項目引用JS或CSS文件時,這些文件將會被自動加載,而Meteor也提供了內(nèi)置的用戶管理,自動完成UI部件的加載。

            Meteor九大特性

            1. 純JavaScript
            2. 實時頁面更新
            3. 干凈、強大的數(shù)據(jù)同步
            4.  延遲補償
            5. 代碼熱推送
            6. 敏感代碼運行于受限環(huán)境中
            7.  完全獨立的應(yīng)用包
            8. 互操作
            9. 智能的包

            實時的未來

            說實話,實時框架是Meteor的最大賣點,實時Web應(yīng)用程序會讓人聯(lián)想到多人游戲和實時在線文檔編輯,但在使用Meteor時,我快速發(fā)現(xiàn)實時也可以編寫出更加實用且非常好的應(yīng)用程序,而這種實時很有可能會成為未來幾年內(nèi)Web應(yīng)用程序的默認編寫方式。

            在桌面應(yīng)用系統(tǒng)中,如果一個目錄被兩個窗口同時打開,那么當(dāng)你在其中一個窗口刪除一個文件后,你必須刷新另一個窗口,那個文件才會“消失”。因此,這就缺乏了實時性,而Meteor框架就可彌補這方面的不足。

            此外,實時也影響到我們的編碼風(fēng)格。你無需刷新頁面或使用特定的回調(diào)邏輯來使應(yīng)用程序做出響應(yīng):每一個塊數(shù)據(jù)都會自動監(jiān)測、任何與UI元素有關(guān)的數(shù)據(jù)也會自動更新。

            下面提供一個案例,一旦有人投票,就響應(yīng)upvote按鈕的“disable”類,模板代碼(Meteor使用 Handlebars):

            1
            2
            3
            4
            <div class="post">
              <a href="#" class="upvote btn {{upvotedClass}}">?<a />
              <h3><a href="{{url}}">{{title}}</a></h3>
            </div>

            下面是與之匹配的控制器代碼:

            1
            2
            3
            4
            5
            6
            7
            8
            9
            10
            11
            12
            Template.post.helpers({
              upvotedClass: function() {
                // test if user is logged in, and if their userId
                // is included in the 'upvoters' array
                var userId = Meteor.userId();
                if (userId && !_.include(this.upvoters, userId)) {
                  return 'upvoteable';
                } else {
                  return 'disabled'
                }
              }
            });

            這段代碼妙在何處呢?如果用戶的userid從upvoters數(shù)組中刪除(例如,實現(xiàn)一個“cancel upvote”操作),這會自動在UI上反應(yīng)出來,無需編寫額外的代碼。

            一切就緒了嗎?

            現(xiàn)在,你可能會隨著這一行行代碼思考些東西:“好,它看起來很棒,但是它真的就可以作為現(xiàn)實應(yīng)用( real-world apps)嗎?”

            答案肯定是依情況而定。Meteor當(dāng)然可以作為現(xiàn)實應(yīng)用使用。Telescope和Sidebar(基于Telescope)就是非常完美的例子。

            但并不是說Meteor就可以完全作為現(xiàn)實應(yīng)用使用。Meteor沒有服務(wù)端渲染功能,有些網(wǎng)站對加載速度要求特別高,比如電子商務(wù)網(wǎng)站,而有些則需要在舊的/老的設(shè)備上運行,比如過時的手機。

            Meteor Book

            目前,我和 Tom Coleman(Meteor開源生態(tài)系統(tǒng)的主要貢獻者之一,創(chuàng)建Meteor包管理器 Meteorite)正在專注于 The Meteor Book,教你如何使用Meteor編寫基本的應(yīng)用程序。

            更多精彩內(nèi)容,大家可以來到Hacker News上和我一起 探討。(編譯/張紅月 責(zé)編/付江)


            學(xué)習(xí)資料:

            官方提供的3個示例:

            GitHub項目頁:

            Meteor@StackOverflow

            文檔:

            FAQ:

            posted @ 2013-03-22 09:41 小果子 閱讀(705) | 評論 (0)編輯 收藏
            前一段時間,在看異常處理一章內(nèi)容的時候,發(fā)現(xiàn)這一部分還真的挺有尿水:)所以上網(wǎng)搜了一下有關(guān)內(nèi)容,呦嗬,還挺豐富的。當(dāng)然有些自己還是看不懂,現(xiàn)在就將這些寶貝拿出來跟大家共享一下。
            首先我們看一下使用異常處理的幾種情況:
            A. 用來處理非致命的錯誤
            B. 對API函數(shù)的參數(shù)合法性的檢驗(假設(shè)參數(shù)都是合法的,只有遇到異常的時候進行合法性檢驗)
            C. 處理致命錯誤(退出時最好的選擇,但是有的時候可以用異常處理函數(shù)在程序退出前釋放資源,刪除臨時文件等,甚至可以詳細記錄產(chǎn)生異常的指令位置和環(huán)境)
            D. 處理“計劃內(nèi)”的異常(我們可能更關(guān)心這種情況,因為可以做很多的手腳,哈哈)
            接著我們看看Windows下異常處理的兩種方式:1使用篩選器2 SEH異常處理
            一、 使用篩選器
            因為這里我要重點關(guān)注的是SEH的處理方式,所以還是簡單的提一下篩選器處理方式。篩選器異常處理是通過異常回調(diào)函數(shù)來指定程序處理異常。這種方式的回調(diào)函數(shù)必須是唯一的,設(shè)置新的回調(diào)函數(shù)后以前的將失效。適用于進程范圍。看一下這個函數(shù)的定義
            Invoke SetUnhandledExecpionFilter,offset_Handler
            Mov lpPrevHandler,eax
            (先到這里吧有些難受,明天接著來)
            ######題外話:想起“司令”的一句話,覺得挺有道理:明天不一定美好,但是更美好的明天一定會到來!祝福所有的朋友。######

            上午有會,什么也沒有做,下午?還有會,我tm暈了,中午不睡覺了,不把事情做不完心里不踏實。
            回調(diào)函數(shù)的格式:
            _Handlerproc pExecptionInfo
            看看pExecptionInfo這個指針參數(shù)指向的一個數(shù)據(jù)結(jié)構(gòu)
            EXCEPTION_POINTERS STRUCT 
                          pExceptionRecord  DWORD      ?              
                          ContextRecord    DWORD      ? 
                        EXCEPTION_POINTERS ENDS
            下面介紹 EXCEPTION_RECORD和CONTEXT結(jié)構(gòu)的定義: 
              
            ;//===================== 以下是兩個成員的詳細結(jié)構(gòu)=========================

                    EXCEPTION_RECORD STRUCT 
                      ExceptionCode        DWORD      ?      ;//異常碼 
                      ExceptionFlags        DWORD      ?      ;//異常標(biāo)志 
                      pExceptionRecord      DWORD      ?      ;//指向另外一個EXCEPTION_RECORD的指針 
                      ExceptionAddress      DWORD      ?      ;//異常發(fā)生的地址 
                      NumberParameters      DWORD      ?      ;//下面ExceptionInformation所含有的dword數(shù)目 
                      ExceptionInformation  DWORD EXCEPTION_MAXIMUM_PARAMETERS dup(?) 
               EXCEPTION_RECORDENDS            ;//EXCEPTION_MAXIMUM_PARAMETERS ==15 

            ;//=============================具體解釋================================

            ExceptionCode 異常類型,SDK里面有很多類型,你可以在windows.inc里查找STATUS_來找到更多的異常類型,下面只給出hex值,具體標(biāo)識定義請查閱windows.inc,你最可能遇到的幾種類型如下: 

                          C0000005h----讀寫內(nèi)存沖突 
                          C0000094h----非法除0 
                          C00000FDh----堆棧溢出或者說越界 
                          80000001h----由Virtual Alloc建立起來的屬性頁沖突 
                          C0000025h----不可持續(xù)異常,程序無法恢復(fù)執(zhí)行,異常處理例程不應(yīng)處理這個異     常 
                          C0000026h----在異常處理過程中系統(tǒng)使用的代碼,如果系統(tǒng)從某個例程莫名奇妙的返回,則出現(xiàn)此代碼, 如果RtlUnwind時沒有Exception Record參數(shù)也同樣會填入這個代碼 
                          80000003h----調(diào)試時因代碼中int3中斷 
                          80000004h----處于被單步調(diào)試狀態(tài) 

                          注:也可以自己定義異常代碼,遵循如下規(guī)則: 
                          ____________________________________________________________________

                          位:      31~30            29~28          27~16          15~0 
                          ____________________________________________________________________
                          含義:    嚴重程度          29位            功能代碼        異常代碼 
                                    0==成功        0==Mcrosoft    MICROSOFT定義  用戶定義 
                                    1==通知        1==客戶 
                                    2==警告          28位 
                                    3==錯誤        被保留必須為0 
            ExceptionFlags 異常標(biāo)志 
                          0----可修復(fù)異常 
                          1----不可修復(fù)異常 
                          2----正在展開,不要試圖修復(fù)什么,需要的話,釋放必要的資源 
            pExceptionRecord 如果程序本身導(dǎo)致異常,指向那個異常結(jié)構(gòu) 
            ExceptionAddress 發(fā)生異常的eip地址 
            ExceptionInformation 附加消息,在調(diào)用RaiseException可指定或者在異常號為C0000005h即內(nèi)存異常時含義如下 
                          第一個dword 0==讀沖突 1==寫沖突 
                          第二個dword 讀寫沖突地址 
            ;//================================解釋結(jié)束============================
                                                                      off. 
                    CONTEXT STRUCT                   ; _ 
                      ContextFlags  DWORD      ?     ;  |            +0 
                      iDr0          DWORD      ?       ;  |            +4 
                      iDr1          DWORD      ?      ;  |            +8 
                      iDr2          DWORD      ?      ;  >調(diào)試寄存器  +C 
                      iDr3          DWORD      ?      ;  |            +10 
                      iDr6          DWORD      ?      ;  |            +14 
                      iDr7          DWORD      ?      ; _|            +18 
                      FloatSave    FLOATING_SAVE_AREA <>  ;浮點寄存器區(qū) +1C~~~88h 
                      regGs        DWORD      ?      ;--|            +8C 
                      regFs        DWORD      ?      ;  |/段寄存器    +90  
                      regEs        DWORD      ?      ;  |/            +94            
                      regDs        DWORD      ?      ;--|            +98 
                      regEdi        DWORD      ?      ;____________    +9C 
                      regEsi        DWORD      ?      ;      |  通用  +A0 
                      regEbx        DWORD      ?      ;      |  寄    +A4 
                      regEdx        DWORD      ?      ;      |  存    +A8 
                      regEcx        DWORD      ?      ;      |  器    +AC 
                      regEax        DWORD      ?      ;_______|___組_  +B0      
                      regEbp        DWORD      ?      ;++++++++++++++++ +B4 
                      regEip        DWORD      ?      ;    |控制        +B8 
                      regCs        DWORD      ?      ;    |寄存        +BC 
                      regFlag      DWORD      ?      ;    |器組        +C0 
                      regEsp        DWORD      ?      ;    |            +C4 
                      regSs        DWORD      ?      ;++++++++++++++++ +C8 
                      ExtendedRegisters db MAXIMUM_SUPPORTED_EXTENSION dup(?) 
                    CONTEXT ENDS 
            ;//============================以上是兩個成員的詳細結(jié)構(gòu)============        
            程序使用篩選器異常處理時可以通過查看上面結(jié)構(gòu)中的regEip來找到產(chǎn)生異常的地址!調(diào)試的時候可以改變EIP的值以達到越過異常程序,轉(zhuǎn)到“安全”的地方。
            最后看一下篩選器異常處理回調(diào)函數(shù)的返回值
            EXECPTION_EXECUTE_HANDLER           1;進程被終止,終止前不會出現(xiàn)提示錯誤的對話框
            EXECPTION_CONTINUE_SEARCH 0;同樣終止程序,顯示錯誤對話框
            EXECPTION_CONTINUE_EXECUTION -1;系統(tǒng)將CONTECT設(shè)置回去,繼續(xù)執(zhí)行程序

            使用篩選器程序是最簡單的處理異常方法,不足:1 不便于封裝。2 處理是全局性的也就是無法對每個線程或子程序設(shè)置一個私有的異常處理程序進行異常處理。
            進入正題:SEH異常處理
            首先解釋一下什么是SEH異常處理:SEH("Structured Exception Handling",即結(jié)構(gòu)化異常處理.是操作系統(tǒng)提供給程序設(shè)計者的強有力的處理程序錯誤或異常的武器。
            下面結(jié)合冷雨飄心的一個SEH異常處理程序來說明具體的用法:
            ;//====================================================================
            ;// ex. 2,by Hume,2001  線程相關(guān)的異常處理 
            ;//====================================================================
            .386 
            .model flat, stdcall 
            option casemap :none  ; case sensitive 
            include hd.h          ;//相關(guān)的頭文件,你自己維護一個吧 
            ;//============================ 
            .data 
            szCap    db "By Hume[AfO],2001...",0 
            szMsgOK db "It's now in the Per_Thread handler!",0 
            szMsgERR1 db "It would never Get here!",0 
            buff    db 200 dup(0) 

            .code 
            _start: 
            ;//========prog begin==================== 
              ASSUME FS:NOTHING 
                    push    offset perThread_Handler 
                   push    fs:[0]      
                    mov    fs:[0],esp          ;//建立SEH的基本ERR結(jié)構(gòu),如果不明白,就仔細研究一下吧 
                    xor    ecx,ecx                          
                    mov    eax,200     
                    cdq                ;//雙字擴展到四個字節(jié),因為是除法
                   div    ecx 
                                                              ;//以下永遠不會被執(zhí)行 
             invoke  MessageBox,NULL,addr szMsgERR1,addr szCap,MB_OK+MB_ICONINFORMATION 
                    pop    fs:[0] 
                    add    esp,4 
                    invoke    ExitProcess,NULL        

            ;//============================ 
            perThread_Handler: 
             invoke    MessageBox,NULL,addr szMsgOK,addr szCap,MB_OK+MB_ICONINFORMATION 
                    mov    eax,1          ;//ExceptionContinueSearch,不處理,由其他例程或系統(tǒng)處理 
                    ;mov    eax,0          ;//ExceptionContinueExecution,表示已經(jīng)修復(fù)CONTEXT,可從異常發(fā)生處繼續(xù)執(zhí)行 
                ret                        ;//這里如果返回0,你會陷入死循環(huán),不斷跳出對話框.... 

            ;//=============================Prog Ends============== 
            end _start
            程序本身很簡單,注釋也很詳細。我們來看看是如何注冊回調(diào)函數(shù)的
            push    offset perThread_Handler 
                   push    fs:[0]      
                    mov    fs:[0],esp 
            僅僅三個語句就解決了~那么為什么要用fs這個段寄存器呢?這里又涉及一個重要的內(nèi)容:TIB(Thread Information Block線程信息塊)。我們來看看這個重要的數(shù)據(jù)結(jié)構(gòu)(引用了《羅聰淺談利用SEB實現(xiàn)反跟蹤》的部分內(nèi)容)
            TEB(Thread Environment Block) 在 Windows 9x 系 列中被稱為 TIB(Thread Information Block),它記錄了線程的重要信息,而且每一個線程都會對應(yīng)一個 TEB 結(jié) 構(gòu)。 Matt Pietrek 大牛已經(jīng)給我們列出了它的結(jié)構(gòu),我就不多說啦,見下:(摘 自 Matt Pietrek 的 Under The Hood - MSJ 1996) 

            //=========================================================== 
            // file: TIB.H 
            // Author: Matt Pietrek 
            // From: Microsoft Systems Journal "Under the Hood", May 1996 
            //=========================================================== 
            #pragma pack(1) 

            typedef struct _EXCEPTION_REGISTRATION_RECORD 

              struct _EXCEPTION_REGISTRATION_RECORD * pNext; 
              FARPROC                                pfnHandler; 
            } EXCEPTION_REGISTRATION_RECORD, *PEXCEPTION_REGISTRATION_RECORD; 

            typedef struct _TIB 

            PEXCEPTION_REGISTRATION_RECORD pvExcept; // 00h Head of exception record list 
            PVOID  pvStackUserTop;        // 04h Top of user stack 
            PVOID  pvStackUserBase;        // 08h Base of user stack 

            union                          // 0Ch (NT/Win95 differences) 

              struct  // Win95 fields 
              { 
                  WORD    pvTDB;          // 0Ch TDB 
                  WORD    pvThunkSS;      // 0Eh SS selector used for thunking to 16 bits 
                  DWORD  unknown1;      // 10h 
              } WIN95; 

              struct  // WinNT fields 
              { 
                  PVOID SubSystemTib;    // 0Ch 
                  ULONG FiberData;        // 10h 
              } WINNT; 
            } TIB_UNION1; 

            PVOID  pvArbitrary;            // 14h Available for application use 
            struct _tib *ptibSelf;          // 18h Linear address of TIB structure 

            union                          // 1Ch (NT/Win95 differences) 

              struct  // Win95 fields 
              { 
                  WORD    TIBFlags;          // 1Ch 
                  WORD    Win16MutexCount;    // 1Eh 
                  DWORD  DebugContext;      // 20h 
                  DWORD  pCurrentPriority;  // 24h 
                  DWORD  pvQueue;            // 28h Message Queue selector 
              } WIN95; 

              struct  // WinNT fields 
              { 
                  DWORD unknown1;            // 1Ch 
                  DWORD processID;            // 20h 
                  DWORD threadID;            // 24h 
                  DWORD unknown2;            // 28h 
              } WINNT; 
            } TIB_UNION2; 

            PVOID*  pvTLSArray;            // 2Ch Thread Local Storage array 

            union                          // 30h (NT/Win95 differences) 

              struct  // Win95 fields 
              { 
                  PVOID*  pProcess;      // 30h Pointer to owning process database 
              } WIN95; 
            } TIB_UNION3; 

            } TIB, *PTIB; 
            #pragma pack()
            讓我們抬頭看看上面的 Matt Pietrek 的代碼,其中有這么一行: 

            PEXCEPTION_REGISTRATION_RECORD pvExcept; // 00h Head of exception record list 

            注 意到 PEXCEPTION_REGISTRATION_RECORD 這個定義,它表示 pvExcept 這個變量正 是 exception record list 的入口,這個入口位于整個結(jié)構(gòu)的 0 偏移處。同時, 在 M 的 Intel i386 Windows NT/2K/XP 內(nèi)核中,每當(dāng)創(chuàng)建一個線程,OS 均會為每個線程分配 TEB ,而 且 TEB 永遠放在 fs 段選擇器指定的數(shù)據(jù)段的 0 偏移處。 
            這樣一來,你就明白了 SEH 注冊的偏移為什么是在 fs:[0] 了吧? 
            事實上 Windows 系統(tǒng)都是通過這種方法來為應(yīng)用程序提供信息的,比如有這樣的例子: 
            struct _tib *ptibSelf;          // 18h Linear address of TIB structure 
            DWORD threadID;                // 24h 

            Windows 提供了一個 API :GetCurrentThreadID(),它的內(nèi)部工作原理其實是這樣的:(利用了上面的這兩個地址) 

            mov eax, fs:[18h]    ;因為 18h 偏移處是 TIB 結(jié)構(gòu)的線性偏移地址 
            mov eax, [eax + 24h] ;因為 24h 偏移處是 threadID 的地址 
            ret                  ;把 eax 中儲存的 threadID 地址返回
            注:為什么要聲明assume fs:nothing?因為masm編譯器默認將fs段寄存器定義為error,所以程序在使用fs前必須將它啟動!
            接下來看看SEH的回調(diào)函數(shù)
            _Handler proc _lpExecptionRecord, _lpSEH,lp_context,lp_DispatcherContext
             
            _lpExecptionRecord指向一個EXECPTION_RECORD結(jié)構(gòu)。
            lp_context 指向一個CONTEXT結(jié)構(gòu)。
            _lpSEH  指向注冊回調(diào)函數(shù)時使用的EXXCEPTION_REGISTRATION結(jié)構(gòu)的地址。
            返回值有四種取值:
            ExecptionContinueExecution ( 0 :系統(tǒng)將線程環(huán)境設(shè)置為_lpContext指向的CONTEXT結(jié)構(gòu)并繼續(xù)執(zhí)行。
            ExceptionContinueSearch(1):回調(diào)函數(shù)拒絕處理這個異常,系統(tǒng)通過EXECPTION_REGISTRATION結(jié)構(gòu)的prev字段得到前一個回調(diào)函數(shù)的地址并調(diào)用它。
            ExecptionNestedExecption (2):發(fā)生異常嵌套。
            ExecptionCollidedUnwind  (3):異常展開操作。這一個部分不做多講,有興趣的可以看看羅云彬的書,其實是很重要的一部分。
            如果一個程序既有篩選器異常處理又有SEH異常處理,而且系統(tǒng)還有默認的異常處理機制,那么他們被調(diào)用的先后次序是怎么樣的呢?
            發(fā)生異常時系統(tǒng)的處理順序(by Jeremy Gordon): 
                1.系統(tǒng)首先判斷異常是否應(yīng)發(fā)送給目標(biāo)程序的異常處理例程,如果決定應(yīng)該發(fā)送,并且目標(biāo)程序正在被調(diào)試,則系統(tǒng)掛起程序并向調(diào)試器發(fā)送EXCEPTION_DEBUG_EVENT消息.呵呵,這不是正好可以用來探測調(diào)試器的存在嗎? 
                2.如果你的程序沒有被調(diào)試或者調(diào)試器未能處理異常,系統(tǒng)就會繼續(xù)查找你是否安裝了線程相關(guān)的異常處理例程,如果你安裝了線程相關(guān)的異常處理例程,系統(tǒng)就把異常發(fā)送給你的程序seh處理例程,交由其處理.
                3.每個線程相關(guān)的異常處理例程可以處理或者不處理這個異常,如果他不處理并且安裝了多個線程相關(guān)的異常處理例程,可交由鏈起來的其他例程處理. 
                4.如果這些例程均選擇不處理異常,如果程序處于被調(diào)試狀態(tài),操作系統(tǒng)仍會再次掛起程序通知debugger. 
                5.如果程序未處于被調(diào)試狀態(tài)或者debugger沒有能夠處理,并且你調(diào)用SetUnhandledExceptionFilter安裝了最后異 常處理例程的話,系統(tǒng)轉(zhuǎn)向?qū)λ恼{(diào)用. 
            6.如果你沒有安裝最后異常處理例程或者他沒有處理這個異常,系統(tǒng)會調(diào)用默認的系統(tǒng)處理程序,通常顯示一個對話框, 你可以選擇關(guān)閉或者最后將其附加到調(diào)試器上的調(diào)試按鈕.如果沒有調(diào)試器能被附加于其上或者調(diào)試器也處理不了,系統(tǒng)就調(diào)用ExitProcess終結(jié)程序. 
                7.不過在終結(jié)之前,系統(tǒng)仍然對發(fā)生異常的線程異常處理句柄來一次展開,這是線程異常處理例程最后清理的機會.

            說了這么多你也許會問SEH異常處理到底有什么用處呢?呵呵,且聽小生慢慢道來~~~
            第一道菜:病毒程序巧用SEH
            這里簡單的說一下如何利用SEH異常處理程序來躲避下毒軟件的反病毒引擎。一個反病毒引擎在一個程序運行的時候會模擬程序的代碼,當(dāng)發(fā)現(xiàn)程序代碼的疑點比較多的時候會報告成病毒。看看下面這段程序:
            start:call Set_SEH;這句其實就是 push offset CONTINUE
            ;      JMP Set_SEH
            CONTINUE:mov esp, [esp+8]; [ESP+8]存儲的是舊的堆棧地址。
            push offset Start_Virus ;----_ 把Start_Virus 的地址壓棧,當(dāng)作返回地址
            ret;----跳到Start_Virus去,是不是很magic? 

            Set_SEH:sub edx, edx            ;Edx =0 
            Assume fs:nothing 
            push dword ptr fs:[edx];把指去 _EXCEPTIONAL_REGISTRATION_RECORD 結(jié)構(gòu)的指針入棧
            mov fs:[edx], esp;安裝一個seh
            mov [edx],edx;引起一個內(nèi)存讀寫沖突,發(fā)生異常因為edx=0 
            ;如果反病毒引擎不處理異常,不進入seh 處理程序(即 CONTINUE: ,繼續(xù)模 
            ;擬下個指令,也就是jmp start,那么就進入一個死循環(huán),可能會引起死機。               
            jmp start       
            Start_Virus:    .....
            是不是很簡單呢?就是讓反病毒引擎不處理這個人為的異常時進入死循環(huán)~!!
            第二道菜:TEB反跟蹤初探
            如果你的記性夠好的話一定記得上面介紹過的TEB(TIB)線程信息塊結(jié)構(gòu)中有這么一句:
            PVOID*  pProcess;      // 30h Pointer to owning process database 
            這 個偏移地址處的內(nèi)容非常有用,它指向本線程的擁有者的 PDB(Process Database) 的線性地址。當(dāng)你用動態(tài)調(diào)試器,例 如 OllyDbg 的時候,調(diào)試器是把調(diào)試的對象作為一個子線程進行跟蹤的,在這種情況下,被調(diào)試的對象的“擁有者”就是調(diào)試器本身,也就是說,它 的 TEB 的 30h 處的偏移指向的內(nèi)容肯定不為 0 ,這樣,我們就可以利用這一點,判斷 30h 偏移指向的內(nèi)容,來判斷是否有調(diào)試器跟蹤。 
            最后給出一個 Anti-Debug 的例子程序,用 MASM 編譯完成后,請用 OllyDbg 來加載調(diào)試一下,看看與正常的運行結(jié)果有什么不同。 
            ;********************************************************* 
            ;程序名稱:演示利用 TEB 結(jié)構(gòu)進行 Anti-Debug 
            ;          請用 OllyDbg 進行調(diào)試 
            ;適用OS:Windows NT/2K/XP 
            ;作者:羅聰 
            ;日期:2003-2-9 
            ;出處:::URL::http://www.LuoCong.com(老羅的繽紛天地)  
            ;注意事項:如欲轉(zhuǎn)載,請保持本程序的完整,并注明: 
            ;轉(zhuǎn)載自“老羅的繽紛天地”(::URL::http://www.LuoCong.com)  
            ;********************************************************* 

            .386 
            .model flat, stdcall 
            option casemap:none 

            include /masm32/include/windows.inc 
            include /masm32/include/kernel32.inc 
            include /masm32/include/user32.inc 
            includelib /masm32/lib/kernel32.lib 
            includelib /masm32/lib/user32.lib 

            .data 
            szCaption  db  "Anti-Debug Demo by LC, 2003-2-9", 0 
            szDebugged  db  "Hah, let me guess... U r dEBUGGINg me! ", 0 
            szFine      db  "Good boy, no dEBUGGEr detected!", 0 

            .code 
            main: 
              assume  fs:nothing
              mov    eax, fs:[30h]              ;指向 PDB(Process Database)
              movzx  eax, byte ptr [eax + 2h];無符號數(shù)帶零擴展
              or      al, al
              jz      _Fine
            _Debugged:
              push    MB_OK or MB_ICONHAND
              push    offset szCaption
              push    offset szDebugged
              jmp    _Output
            _Fine:
              push    MB_OK or MB_ICONINformATION
              push    offset szCaption
              push    offset szFine
            _Output: 
              push    NULL
              call    MessageBoxA
              invoke  ExitProcess, 0
             end main
            第三道菜:利用SEH執(zhí)行shellcode
            假設(shè)異常處理例程入口00401053,程序剛開始執(zhí)行時esp是0012ffc4,以前的fs:[0]是0012ffe0
            建立了TIB結(jié)構(gòu)的第一個成員后堆棧的情況如下:

              內(nèi)存低地址
              
            | E0 |12ffbc(esp)
            | FF |
            | 12 |  --ERR結(jié)構(gòu)的第一個成員
            |_00_|
            | 53 |12ffc0
            | 10 |
            | 40 |  --ERR結(jié)構(gòu)的第二個成員
            | 00 |

              內(nèi)存高地址

              好了然后程序CALL一個函數(shù),函數(shù)里面有一個局部變量并且在往其分配的空間中寫入的數(shù)據(jù)時產(chǎn)生溢出.這時堆棧如下

            ____
            |    |12f000 局部變量分配的空間,并且向12ffc0方向溢出了.
            |    |
            ....
            ....
            |_EBP|12ffb4 函數(shù)中保存老的EBP
            | xx |
            | xx |
            | xx |
            |_EIP|12ffb8 call函數(shù)時EIP進棧
            | xx |
            | xx |
            |_xx_|
            | E0 |12ffbc(esp)   {當(dāng)SEH起作用的時候EBX剛好指向這個地址(也可說總是指向當(dāng)前ERR結(jié)構(gòu))}
            | FF |
            | 12 |  --ERR結(jié)構(gòu)的第一個成員
            |_00_|
            | 53 |12ffc0
            | 10 |
            | 40 |  --ERR結(jié)構(gòu)的第二個成員
            |_00_|
            |    |12ffc4
               繼 續(xù)看,假設(shè)溢出代碼一直到了12ffc4,然后call的函數(shù)該返回了,因為保存的EIP被溢出代碼代替所以程序出錯(不會不出錯吧?),這樣ESH開始 起作用了(注:在這期間系統(tǒng)要執(zhí)行一些操作,所以EBX才會指向當(dāng)前ERR).這樣一來程序就會跳到12ffc0里的地址去執(zhí)行!而12ffc0里的東東 早已不是原來的00401053了.這樣我們不就改變了程序的流向了么.12ffc0中該寫入什么內(nèi)容呢?應(yīng)是內(nèi)存中JMP EBX的代碼的地址.這樣跳 了3下后最終就會跳到12ffbc去執(zhí)行.這個四字節(jié)可是寶貴的啊現(xiàn)在假設(shè)JMP EBX這個指令在內(nèi)存中的地址是0x77e33f4d
            那下具體看一下現(xiàn)在堆棧的情況:

            | EB |12ffbc(esp)   {當(dāng)ESH起作用的時候EBX剛好指向這個地址(也可說總是指向當(dāng)前ERR結(jié)構(gòu))}
            | 06 |
            | 90 |  --ERR結(jié)構(gòu)的第一個成員,執(zhí)行JMP EBX后就到這兒來執(zhí)行了(EB 06是短跳轉(zhuǎn)JMP 12FFC4的機器碼)
            |_90_|  后面的90是nop空指令的機器碼.
            | 4D |12ffc0
            | 3F |
            | E3 |  --ERR結(jié)構(gòu)的第二個成員,出錯處理函數(shù)的入口地址(現(xiàn)在成了JMP EBX的地址)
            |_77_|
            |    |12ffc4
            ....

              好現(xiàn)在來看看12ffc4里面有些什么代碼.(簡單的說這段代碼的作用是計算真正的shellcode的起始地址,然后跳過去執(zhí)行.

            低地址

            |    |12f000(shellcode開始地址)
            ....
            ....
            | 81 |12ffc4
            | C3 |  add ebx,FFFFF03Ch(ebx=12ffc4,指令長度6,作用計算計算shellcode地址)
            | 3C |
            | F0 |
            | FF |
            | FF |
            | FF |12ffca jmp ebx
            | D3 |  

            高地址

             
            測試程序

            -------------------------SEH.ASM------------------
            .386
            .model flat,stdcall
            option casemap:none

            include        ../include/user32.inc
            includelib    ../lib/user32.lib
            include        ../include/kernel32.inc
            includelib    ../lib/kernel32.lib



            .data
            hello        db '利用一個讀INI文件的API來演示W(wǎng)IN2000本地溢出',0
            lpFileName    db './seh.ini',0            
            lpAppName    db 'iam',0
            lpKeyName    db 'czy',0            
            lpDefault    db 'ddd',0
            szCap     db "SEH TEST",0
            szMsgOK db "OK,the exceptoin was handled by final handler!",0
            szMsgERR1 db "It would never Get here!",0

            .code

            testov    proc
                local   lpReturnedString[2224] : byte    ;返回的字串搞成本地變量這樣就和C語言一樣了,它是在棧中    
                invoke    GetPrivateProfileString,offset    lpAppName,offset,lpKeyName,offset lpDefault,ADDR lpReturnedString,2249,offset lpFileName    
                invoke    MessageBox,0,addr lpReturnedString,addr lpReturnedString,1
                ret 
            testov    endp
                
            start:
                ASSUME fs:NOTHING
                invoke  MessageBox,0,addr szMsgERR1,addr szCap,30h+1000h ;下斷點    
                push    offset Final_Handler    ;壓入正常的出錯處理程序入口地址
                push    FS:[0]                  ;把前一個TIB的地址壓入
                mov    fs:[0],esp
                call    testov    
                pop     fs:[0]                     ;還原FS:[0]     
                
            Final_Handler:   ;由于溢出了下面的代碼不會被執(zhí)行.
                   invoke       MessageBox,0,addr szMsgOK,addr szCap,30h
                   invoke       ExitProcess,0
                   mov       eax,1
                   ret
            end start

            -----------------end-------------

            1如何更好的在內(nèi)存中找JMP EBX的代碼:
                 在softice中執(zhí)行S 10:0 L FFFFFFFF FF D3就可以了,但實際上這樣找到的
            地址可能不能執(zhí)行代碼.所以用下面的方法:
               map32 kernel32(在當(dāng)前進程中查找映射的kernel32 DLL的信息)   
            一般有如下顯示:
              Owner        Obj Name    Obj#    Address        Size     TYPE
            kernel32    .text        0001    001b:77b61000    0005d1ae code RO
            ......
              然后
            S 77b61000 L 5d1ae FF D3
            如果顯示如下說明找到了:
              Pattern Found at 0023:77e61674 ....

            2)關(guān)于緩沖區(qū)的大小的問題:
              利用SEH的辦法就起碼要設(shè)成1000個字節(jié)多,你的shellcode才不會被不知哪來的數(shù)據(jù)覆蓋!
            這道菜czy做的不好吃:(我感覺理解起來有些困難~!因為關(guān)于緩沖區(qū)溢出自己接觸的太少,不過好東西要保留的,以后回過頭看!
            第四道菜:用 SEH 技術(shù)實現(xiàn) API Hook
            這一部分不想展開了,給大家一個鏈接吧。

            ::URL::http://www.luocong.com/articles/show_article.asp?Article_ID=25

            最后作為結(jié)束語說說的缺點吧:)一個人只有正視自己的缺點才能不斷地進步!呵呵
            在 SEH異常處理鏈中最后一個被裝載的SEH異常處理程序總是被第一個調(diào)用,想想如果自己花了一個星期才寫出來一個異常處理程序,能夠完美處理所有異常,并 希望異常全部由你來處理,但很不幸,比如你調(diào)用了一個外部模塊,而這個模塊自己安裝了一個ugly的seh處理例程,他的動作是只要有異常發(fā)生就簡單地終 止程序,哈哈,那就死悄悄了。又比如你想在你的加殼程序里面加密目標(biāo)程序代碼段,然后發(fā)生無效指令異常的時候用你自己安裝的處理句柄來解密代碼段繼續(xù)執(zhí) 行,聽起來這的確是一個好主意,但遺憾的是大多數(shù)C/C++代碼都用_try{}_except{}塊來保證其正確運行,而這些異常處理例程是在你殼注冊 的例程之后安裝的,因而也就在鏈的前面,無效指令一執(zhí)行,首先是C/C++編譯器本身提供的處理例程或者程序其他的異常處理例程來處理,可能簡單結(jié)束程序 或者....
            好累!~~~~~~
            寫了兩天,錯了,應(yīng)該是剪接+消化了兩天,有很多的程序和文字是從hume,老羅,還有czy那里“剽竊”的:)希望高手們不要生氣~~天下書籍一大抄。你們的必將是我的,當(dāng)然我的也會共享給你們的。呵呵,現(xiàn)在還不行,級別不夠啊。
            轉(zhuǎn)自:
            http://blog.csdn.net/toberooter/article/details/308365
            posted @ 2013-03-21 15:43 小果子 閱讀(7333) | 評論 (0)編輯 收藏

            越來越多的公司開始聚焦于大數(shù)據(jù)技術(shù)領(lǐng)域,而開源恰恰是大數(shù)據(jù)技術(shù)的靈魂。以下將為您介紹九大引人注目的開源大數(shù)據(jù)技術(shù),請拭目以待:

            1.Apache Hadoop

             

            Apache hadoop是 一個開源的分布式計算框架,最初由Doug為支持其開源Web搜索引擎Nutch所創(chuàng)立。通過集成MapReduce技術(shù),Hadoop將大數(shù)據(jù)分布到多 個數(shù)據(jù)節(jié)點上進行處理。Hadoop遵循Apache 2.0許可證,可以輕松處理結(jié)構(gòu)化、半結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù),一舉成為現(xiàn)在非常流行的大數(shù)據(jù)解決方案,

            2.R語言 

            R語言是一種開源編程語言,專門為數(shù)據(jù)統(tǒng)計和數(shù)據(jù)可視化而設(shè)計。R語言最初由Ross Ihaka和Robert Gentleman在奧克蘭大學(xué)設(shè)計出來,之后迅速成為大數(shù)據(jù)領(lǐng)域的重要工具。R語言遵循GPL許可證。

            3.Cascading

            Cascading是 一個針對Java開發(fā)人員的應(yīng)用框架,可以快速、輕松地基于Apache Hadoop開發(fā)數(shù)據(jù)分析和數(shù)據(jù)管理應(yīng)用。Cascading是Hadoop的抽象層,可以屏蔽MapReduce的復(fù)雜性,支持任何基于JVM的編程語 言在Hadoop集群上執(zhí)行數(shù)據(jù)處理任務(wù)。Cascading最初由Chris Wensel開發(fā),用于作為MapReduce的替代API。Cascading遵循GNU許可證,一般用于廣告定位、日志分析、Web數(shù)據(jù)挖掘和ETL 應(yīng)用。

            4.Scribe

            Scribe于2008年發(fā)布,是一個由Facebook開發(fā)的日志聚合服務(wù)器軟件,用于實時從大量服務(wù)器匯集日志數(shù)據(jù)。Scribe遵循Apache 2許可證,擴展性極佳,每天可應(yīng)對數(shù)百億日志記錄的挑戰(zhàn)。

            5.ElasticSearch

            ElasticSearch是一款由Shay Banon開發(fā),遵循Apache許可證的開源搜索服務(wù)器。ElasticSearch基于分布式計算,對于實時搜索可以提供很好的可擴展性解決方案。許多公司已經(jīng)對ElasticSearch表示認可,比如StumbleUpon和Mozilla。

            6.Apache HBase

            Apache HBase是一個使用Java語言編寫的、以谷歌BigTable技術(shù)為基礎(chǔ)的開源非關(guān)系型列式分布數(shù)據(jù)庫,可運行在HDFS文件系統(tǒng)之上。HBase提供了很好的存儲容錯能力和快速訪問大量稀疏文件的能力。HBase遵循Apache 2許可證。

            7.Apache Cassandra

            Cassandra是由Facebook開發(fā)的另一個開源NoSQL數(shù)據(jù)庫,遵循Apache 2許可證。由于對HBase的喜愛,F(xiàn)acebook開始逐漸放棄使用Cassandra,但許多公司,如Netflix依然使用Cassandra數(shù)據(jù)庫為其后端流媒體服務(wù)提供動力。

            8.MongoDB

            MongoDB是 一個基于分布式文件存儲的數(shù)據(jù)庫,由C++語言編寫。旨在為Web應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案。MongoDB是非常流行的JSON文檔式 NoSQL數(shù)據(jù)庫,許多公司都非常認同MongoDB。MTV Networks、craigslist和迪斯尼互動傳媒集團,紐約時報以及Etsy都是MongoDB的客戶。MongoDB遵循GNU Affero通用許可證,語言驅(qū)動遵循Apache許可證,10gen公司提供商業(yè)化的MongoDB許可證。

            9.Apache CouchDB

            CouchDB也 是一個流行的開源NoSQL數(shù)據(jù)庫,它以文檔方式(JSON)存儲數(shù)據(jù)。CouchDB使用JavaScript語言作為查詢語言,集成 MapReduce技術(shù)。IBM Lotus Notes的開發(fā)人員Damien Katz在2005年構(gòu)建了CouchDB,用于大規(guī)模對象的數(shù)據(jù)存儲系統(tǒng)。CouchDB遵循Apache 2許可證,英國廣播公司(BBC)使用CouchDB存儲動態(tài)內(nèi)容,瑞士瑞信銀行(Credit Suisse)的商品部也采用了它。

            posted @ 2013-03-19 09:59 小果子 閱讀(614) | 評論 (0)編輯 收藏

            SSH配置:

            1、修改vi /etc/ssh/sshd_config,根據(jù)模板將要修改的參數(shù)注釋去掉并修改參數(shù)值:

            Port 22 指定SSH連接的端口號,安全方面不建議使用默認22端口

            Protocol 2,1 允許SSH1和SSH2連接,建議設(shè)置成 Protocal 2

            其他參數(shù)根據(jù)自己的需要進行調(diào)整。配置方法詳見: man ssh_config

            2、修改hosts.deny 在最后面添加一行:

            sshd:All

            3、修改hosts.allow 在最后面添加一行:

            sshd:All

            如果為了安裝可以限制訪問的IP,設(shè)置如下:

            sshd:192.168.0.101

            sshd:192.168.0.102

            上述配置表示只允許101和102的服務(wù)器進行SSH連接

            4、啟動SSH

            /etc/init.d/sshd start


            # chkconfig --list |grep sshd
            sshd            0:off   1:off   2:on    3:on    4:on    5:on    6:off
            #chkconfig --level 2345 sshd on

            iptables
            # Generated by iptables-save v1.4.7 on Tue Feb  7 19:06:20 2012
            *filter
            :INPUT ACCEPT [100:10222]
            :FORWARD ACCEPT [0:0]
            :OUTPUT ACCEPT [75:7016]
            -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
            -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
            COMMIT
            # Completed on Tue Feb  7 19:06:20 2012


            (1)屏蔽所有端口 
            (2)把SSH的缺省端口設(shè)置為56565 
            (3)把56565、80、3306端口打開 
            (4)把3306端口設(shè)置為只允許本機訪問
             
            如果沒有安裝iptables的話,運行命令yum install iptables完成iptables安裝
             
            初始化安裝以后,顯示為以下信息:
             
            [root@tp ~]# iptables -L -n
             
            Chain INPUT (policy ACCEPT)
             
            target prot opt source destination
             
            Chain FORWARD (policy ACCEPT)
             
            target prot opt source destination
             
            Chain OUTPUT (policy ACCEPT)
             
            target prot opt source destination
            (1)屏蔽所有端口
             
            [root@tp ~]# iptables -F
            [root@tp ~]# iptables -X
            [root@tp ~]# iptables -P INPUT DROP
            [root@tp ~]# iptables -P OUTPUT DROP
            [root@tp ~]# iptables -P FORWARD DROP
            當(dāng)超出了IPTABLES里filter表里的兩個鏈規(guī)則 (INPUT,FORWARD)時,不在這兩個規(guī)則里的數(shù)據(jù)包怎么處理呢,那就是DROP(放棄),有同學(xué)喜歡配置OUTPUT為accpet,因為如果 被入侵,對方可以使用服務(wù)器做為中轉(zhuǎn),發(fā)起攻擊,也會產(chǎn)生大量的數(shù)據(jù)包,所以這里配置為DROP
             
            (2)把SSH的缺省端口設(shè)置為56565
             
            在修改ssh端口時,應(yīng)先把要修改的端口號56565加入白名單
             
            [root@tp ~]# iptables -A INPUT -p tcp --dport 56565 -j ACCEPT
            [root@tp ~]# iptables -A OUTPUT -p tcp --sport 56565 -j ACCEPT
            [root@tp ~]# /etc/rc.d/init.d/iptables save
            [root@tp ~]# service iptables restart
            再修改端口號
             
            [root@linux ~]# vi /etc/ssh/sshd_config
            將"#Port 22"修改為"Port 56565"
             
            重啟ssh服務(wù)
             
            [root@linux ~]# /etc/init.d/sshd restart
            Stopping sshd: [ OK ]
            Starting sshd: [ OK ]
            如果想看看sshd端口號是否修改成功的話,可以使用 netstat -an 命令查看一下或退出ssh使用新端口號登陸嘗試。
             
            (3)把80端口打開
             
            [root@tp ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
            [root@tp ~]# iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
            [root@tp ~]# /etc/rc.d/init.d/iptables save
            [root@tp ~]# service iptables restart
            (4)把3306端口設(shè)置為只允許本機訪問
             
            [root@tp ~]#/sbin/iptables -A INPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT
            [root@tp ~]#/sbin/iptables -A OUTPUT -p tcp -s 127.0.0.1 --dport 3306 -j ACCEPT

            http://gzjhj88.blog.51cto.com/1049760/629563
            http://www.redicecn.com/html/qita/20110331/243.html
            http://wenku.baidu.com/view/94fadf1252d380eb62946d95.html

            http://www.bugbeta.cn/?p=495
            http://gzjhj88.blog.51cto.com/1049760/629563
            http://gzjhj88.blog.51cto.com/1049760/315021
            posted @ 2013-02-28 11:15 小果子 閱讀(445) | 評論 (0)編輯 收藏
            僅列出標(biāo)題
            共58頁: 1 2 3 4 5 6 7 8 9 Last 
            亚洲伊人久久精品影院| 婷婷久久综合九色综合98| 久久99热这里只有精品国产| 亚洲色欲久久久综合网| 亚洲狠狠综合久久| 久久无码AV中文出轨人妻| 精品久久久久中文字幕日本| 国产成人精品久久综合| 亚洲精品无码久久久久去q| 91久久香蕉国产熟女线看| 久久亚洲精品无码VA大香大香| 久久99国产精品二区不卡| 久久精品成人欧美大片| 久久亚洲国产精品123区| 狠狠色丁香久久综合婷婷| 一本一本久久aa综合精品 | 国产午夜免费高清久久影院| 久久婷婷人人澡人人| 久久精品国产一区二区三区日韩| 日本五月天婷久久网站| 久久精品国产亚洲AV不卡| www.久久热.com| 亚洲国产欧美国产综合久久| 国产欧美久久久精品影院| 久久电影网| 国产巨作麻豆欧美亚洲综合久久| 精品永久久福利一区二区 | 久久成人18免费网站| 久久国产精品99精品国产987| 欧美牲交A欧牲交aⅴ久久| 77777亚洲午夜久久多人| 97久久婷婷五月综合色d啪蜜芽 | 久久精品国产亚洲AV电影| 亚洲精品午夜国产VA久久成人| 欧洲性大片xxxxx久久久| 日韩AV毛片精品久久久| 午夜精品久久久久久影视777| 久久有码中文字幕| 亚州日韩精品专区久久久| 伊色综合久久之综合久久| 一本久久a久久精品综合香蕉|