1. 程式人生 > >Common Lisp 初學者快速入門指導

Common Lisp 初學者快速入門指導

目錄

寫作本文的緣起:我也是一名 Common Lisp 的初學者,在對照著各種教程學習 Common Lisp 的過程中,發現有不少細節都需要自己去摸索,比如對開發環境的進一步配置(推薦使用開發環境--LispBox 作為一個一鍵式開發環境,大大降低了許多不熟悉 Emacs 的初學者的學習和使用門檻,不過遺憾的是它已經停止更新了,現在 LispBox 中各軟體的版本偏低,如果想要使用最新版本的 Common Lisp 實現,就需要自己去動手配置了),包括更新版本、支援中文符號名稱、自定義函式名始終高亮顯示等等,諸如此類很多細節,都需要自己摸索、嘗試和驗證,這個過程不可避免會花費一些時間。

我覺得只要有一個人經歷過這種摸索就可以了,其他人完全可以借鑑他現成的經驗,否則每個人都去做重複的摸索,是一種相當大的浪費,所以就不揣冒昧,把自己學習過程中的一些經驗和體會記錄下來,希望能為其他 Common Lisp 初學者節省一些時間。

學習任何知識,都不能僅僅把它們當做知識,更重要的是要把它們在實際程式設計實踐中應用起來,持有這樣的學習觀念才不至於讓你變成學究式的活字典,對於程式設計師來說這一點尤其重要,你學習的任何語言知識,一定要在實際的程式編寫過程中不斷練習、不停實踐,紙上得來終覺淺,絕知此事須躬行。

寫作本文的目標是希望能為 Common Lisp 初學者提供一份簡單易懂、容易上手、學習結合(學為學,習為實踐)的初學者教程。

【說明】:Lisp 家族相當龐大, Common Lisp 是其中的一個分支,具體的分類我就不在這裡贅述了,建議初學者可以到 wiki 百科去了解,當然,如果你和我一樣,也在看冰河(田春)翻譯的《實用 Common Lisp 程式設計》這本書,那麼直接閱讀書中的前面章節也可以對此有一個大致的瞭解。

我一向認為,學習任何知識體系都要遵循從易到難、從簡單到複雜的規律,就像 Lisp 的迭代式開發一樣,最初出現在程式設計師手中的版本是一個很不完善,但實現了基本核心功能的原型系統,然後再經過反覆的迭代開發來逐步完善,直到把粗糙的原型系統變成可用的工程系統。

學習一門複雜艱深、體系龐雜的程式語言--Common Lisp 同樣要遵循這個規律,這份教程也儘量遵循這個規律來編寫,也就是開始時不會涉及太深入的概念,只會提到一些基本概念,而這些基本概念也會以很直觀易懂的描述方式來表述,不會用到任何可能令初學者疑惑難解的術語,目的就是讓初學者對 Common Lisp 程式迅速建立一種感性認識跟理解,依據這些知識可以迅速讀懂其他開源作者寫的 Common Lisp 程式。

所以,本文的表述可能不是那麼嚴謹,比如本文會有這樣的表述:

“Lisp 程式由 S-表示式(符號表達式)組成,S-表示式是列表或者單個原子”
“列表是由 0 個或者更多的原子或者內部列表組成,原子或者列表之間由空格分隔開,並由括號括起來。
列表可以是空的”

初學者看到這個表述就會對 Lisp 的列表建立一種初步直觀的印象,可以據此識別程式中使用的列表,也可以合法地構造出自己使用的列表,這樣初學者就可以很迅速地入門了。

我不會在這裡說什麼

“列表本質上是由 cons(點對)構成的,點對錶示的列表是這個樣子(OR NULL CONS),點對不僅可以構成列表,還可以構成樹、集合和查詢表”

雖然說這種表述更確切,但是我覺得這種表述明顯會讓初學者感到複雜和困惑,這些內容應該放在初學者入門之後繼續深入學習的過程中逐步去了解的。

我發現之前看過的兩本教程在開始章節部分都不約而同地採用了非常直觀易懂的描述方式來講解列表,而把 點對cons 的講解放到了後續章節,看來大家都採取了同樣的講解策略。

因此,後續就不再一一詳細解釋了,本文提到的所謂的 Lisp 基本概念都是針對初學者的入門階段的,等初學者真正入了門,再進一步深入學習時,同時初學者也對 Common Lisp 的實現機制有了更深入的瞭解時,自然會發現在這裡瞭解到的基本概念會有更底層、更確切的表述,那就用那些更確切的表述來更新你腦海中這些入門階段學到的直觀易懂的基本概念吧。

當然,為了避免不必要的誤解,我也會適當加一些說明,比如 Emacs Lisp 和 Common Lisp 的讀取求值機制不太一樣,Emacs Lisp 使用 Lisp 直譯器進行讀取和求值;而 Common Lisp 則使用 R-E-P-L 機制,要分為讀取器(R)和求值器(E),讀取器處理的是 S-表示式,而求值器處理的則是經過讀取器處理輸出的一些特殊的 S-表示式:Lisp形式--form。

正如《實用 Common Lisp 程式設計》的作者所說 “難道在確定一門語言真正有用之前就要先把它所有的細節都學完嗎?”,尤其在面對 Common Lisp 這樣一門體系異常龐大的語言時,初學者在開始階段不可能也沒必要深究它所有的細節,先學一點最簡單的基礎知識---而憑藉這些基礎知識又足夠支撐你去寫一些最簡單的程式,然後讓你的簡單程式跑起來,這就是一個很好的開始了。

本文適用的讀者群體就是 Common Lisp 的初學者,他們從來沒有用 Lisp 寫過程式,對於 Lisp 的分類一無所知,也不清楚用什麼開發工具來執行 Common Lisp 程式,但是忽然對 Common Lisp 產生了興趣,想學習一下,大致來說就是那些對於 Lisp 的認知停留在:“Lisp 是一門專門用於 AI 的學術性程式語言,不適合用來做商業開發” 這個程度的讀者----這也是我在看《黑客與畫家》之前對 Lisp 的認識。

我推薦的參考書,就是建議在學習過程中備在案頭,可以隨時查閱那種:

初學者階段:

《實用 Common Lisp 程式設計》 --比較適合初學者的常備工具書,不僅有對 Common Lisp 的精彩講解,更有非常實用、貼切的例程進行參考

《ANSI Common Lisp》中文版 --基本讀物,可以作為額外的參考補充

《GNU Emacs Lisp 程式設計入門》 --此書專門講 Emacs Lisp ,和 Common Lisp 具體細節不太一樣,不過建議能對照著看看,會有意想不到的收穫,尤其是其中的一些基本概念很接近;

《On Lisp 中文版》 --此書屬於擴充套件閱讀,有大量的程式碼例項,重點放在傳授一種程式設計思想,主要探討 Common Lisp 的函式和巨集,建議讀冰河翻譯的中文版,因為糾正了原文的一些程式碼錯誤,初學者在瞭解一些基本概念之後就可以看懂這個了,推薦

《Google Common Lisp 風格》 --該文件涉及的範圍比較廣,建議先大致瀏覽,學到哪裡再細看哪裡的相關章節

迭代式學習:本文嘗試使用一種名為迭代式學習的方式進行內容,也就是說按照從前到後的寫作順序,最前面出現的都是非常基本的知識和操作,讀者可以邊閱讀、邊理解、邊實踐,可以迅速從最簡單的部分入手,然後再以這部分比較簡單的知識為基礎,不斷展開新的稍微難一點的內容,這部分的學習內容同樣需要遵循 邊閱讀、邊理解、邊實踐 的原則,等把這部分難度有所提升的內容掌握後,就到了更難一點的內容,繼續按照 邊閱讀、邊理解、邊實踐 的原則進行:

初級難度==》邊閱讀、邊理解、邊實踐
二級難度==》邊閱讀、邊理解、邊實踐
三級難度==》邊閱讀、邊理解、邊實踐
. . . . . .
超級難度==》邊閱讀、邊理解、邊實踐

看到這裡,有些對 Lisp 略有所知的朋友想必明白了,這不就是 Lisp 的迭代開發模式 Read-Eval-Print-Loop :REPL 的變形嗎?哈,恭喜你看穿了,就是這樣,經過一段時間使用 REPL 迭代方式的 Lisp 程式寫作,我發現這種探索性的漸進式迭代開發方式非常適合用來從無到有、從簡單到複雜構建一個全新的系統。

一種全新的知識體系也是這樣一個未知的需要漸進探索的大系統,人類的認知過程應該遵循這種從易到難、知行合一(理論+實踐)的漸進迴圈方式,這樣每個學習階段你都能感覺到進步,所有的反饋都是正面的,它既為你帶來成就感,又能激勵你接受難度漸增的挑戰而期待更多的成就感,這種認知方式不會因為難度太高讓你產生挫折感,進而喪失繼續學習的興趣,正所謂:學而時習之,不亦樂乎(我的理解是:學習了理論知識然後去實踐中應用它,是多麼有趣啊!)。

對於初學者而言,一定要多看、多想、多試,千萬不要怕出錯,事實上,現在錯誤就是下一輪迭代的起點,從另一個角度來說:如果你能把錯誤提示資訊裡的各類錯誤全部都嘗試一遍,那你對這門語言也掌握得差不多了!

所以,初學者要要勇於思考、勇於嘗試、勇於犯錯!

【小提示】:

用一個簡單的文字檔案把每次出錯的資訊記錄下來,後面如果解決了就把解決方法也記錄一下,養成這種學習習慣,你會受益匪淺。

在這裡,對於初學者而言, Common Lisp 體系經過多年的發展,就是這樣一種全新而複雜的知識體系,有很多內容相互關聯,個人自學起來難以下手,想要掌握這個知識體系,最好的辦法就是 REPL 迭代式學習,當然,這裡的難度迭代式教程寫作也是我個人的一種思考和探索,目前還沒有得到什麼實際驗證,是否可行還不一定,不過我們可以一起在這裡嘗試一下,反正也沒什麼損失。:)

  • 寫作本文的目標是希望能為 Common Lisp 初學者提供一份簡單易懂,容易上手的初學者教程。
  • 本文適用的讀者群體就是對 Lisp 瞭解很少但是希望儘快開始學習、實踐一門 Lisp 語言的初學者。
  • 本文嘗試的迭代式學習就是學習內容循序漸進,學習過程反覆迭代的一種學習方法。

學習任何一門程式語言都不應該僅僅停留在理論階段,更重要的是實踐,有些概念可能看半天文字講解都不得要領,但是一寫成程式碼,到計算機上跑一遍就比什麼講解都清楚了。

因此對於一門語言的初學者而言,動手實踐是非常重要的,但是不幸的事實是:配置開發環境是絕大多數初學者不得不面臨的一個難題,要麼是需要自己配置編譯引數、自己編譯版本,要麼是需要定製各種配置檔案,而且常常會有一些莫名其妙的錯誤提示,讓初學者的第一個程式夭折,說老實話,這些知識點在初學者入門之後根本不算什麼,都是常識,但是在沒有入門之前,那就是天大的障礙,現在網路比較發達,很多類似問題都可以上網搜尋,以前網路沒這麼發達的時候,初學者遇到這種問題那真是痛苦…

所以如果能有一個一鍵式的開發環境那是多麼幸福的事情,這樣初學者就可以迅速進入狀態,避免無關的干擾,快速上手!

在這裡,Lisp 初學者們有福了,有一個非常簡單的一鍵式開發環境 LispBox 等著大家使用(雖然目前 LispBox 已經停止更新,不過託開源之福,我們可以自己更新版本),這個開發環境在各種主流平臺都提供了對應的版本,目前支援:

 MS-Windows
 Mac OSX
 Linux

我使用了 MS-Windows 和 Mac OSX 下的版本,就目前使用情況來看,還是比較滿意的,因此我會強烈推薦初學者使用這個開發環境,它不需要你做任何配置,把壓縮包下載回來,解壓後直接雙擊可執行檔案就可以執行,沒有任何障礙。

LispBox 下載地址:

http://gigamonkeys.com/lispbox/
這個地址是《實用 Common Lisp 程式設計》的作者提供的,包括了寫給即將學習 Lisp 的新手們的一段話,大家可以看看。

LispBox 實際上是把 Emacs、Slime、Clozure CL 以及 QuickLisp 整合到一起,關於 LispBox 更詳細具體的介紹可以參考我以前寫的文章: 就不再這裡重複了。

等初學者對 LispBox 熟悉一些後,就可以自己修改配置來使用其他 Common Lisp 實現了,比如加入 SBCL

擴充套件閱讀

使用 LispBox 做開發環境就相當於選擇了 Emacs 作為編輯器、選擇 Slime 作為互動介面,那麼一定要熟悉 Emacs 和 Slime 的各種快捷鍵,這不僅會讓你的學習開發過程事半功倍,更讓你有一種高效率、不間斷鍵盤作業的享受。

建議參考讀物:

《GNU Emacs Lisp 程式設計入門》 -- 讓你瞭解 Emacs 工作的機制,明白那些外掛是怎麼工作的

《Slime 使用者手冊》 -- 建議看帝歸翻譯的中文版,省時省力,全面介紹了 Slime 的快捷鍵

開發環境啟動後會進入一個 REPL 介面,我們可以直接在 CL-USER> 後面輸入 Lisp 程式碼,然後敲擊回車執行程式碼

; SLIME 2012-11-12
CL-USER> 

第一個程式就沿用傳統,向世界打個招呼吧:

CL-USER> (print "hello,world!")

"hello,world!" 
"hello,world!"
CL-USER> (format t "你好,  世界!")
你好,  世界!
NIL
CL-USER> 

這裡其實用了兩個函式,一個是 print 函式,一個是 format 函式,都是輸出內容到螢幕。

不過在 Common Lisp 中更常用 format 函式來輸出到螢幕多一些,可以把它跟 C 語言的 printf 函式對照著來看,注意一下 format 中的那個引數 “t”,代表的是標準輸出流:*standard-output* ,也就是說如果在 t 的位置換一個引數,我們也可以把這段問候語傳送到任何一個指定的輸出流上。

(format t "你好,  世界!")

這個結構就是一個列表,用括號包圍,裡面共有 3 個元素,這些元素用空格分隔,不過雙引號裡的空格作為字串內容處理,不起分隔作用,可以很明顯地看出,format 屬於比較特殊的符號,它就是一個函式名,後面的兩個元素都是它的引數。

OK,是不是很簡單,就跟 Lisp 世界發出了第一聲問好!

(為什麼 print 輸出了兩遍呢?說實話我也不清楚,要不自己去查查資料,然後把答案反饋給我 :) )

有朋友說了,這個程式太簡單了,而且如果我想重複問好怎麼辦?難道每都把這段程式碼拷貝、貼上嗎?那好,讓我們把這段程式碼寫成一個函式 hi ,這樣,每次問好時只需要輸入 (hi) 就可以了。

Common Lisp 程式中直接呼叫函式時一般要用括號把函式名括起來,比如 (hi)

我們就直接在 REPL 介面來編輯剛才輸入的內容,可是剛才已經執行過這段程式碼了,現在的 CL-USER> 提示符後面是空的,有朋友說:我就是不喜歡來回拷貝,希望能有一個快捷鍵來列出我輸入過的歷史命令,沒問題。

Emacs 中查詢歷史命令的快捷鍵是 M-p ,這裡的大寫 M 表示 Alt 鍵,M-p 就是同時按下 Alt 鍵 和 p 鍵
M-p 是向上翻
M-n 是向下翻

這樣就可以把你在 REPL 中輸入過的歷史命令一一查看了,言歸正傳,歷史命令找回來了,可是游標跑到最後了,我們需要把游標移動到最前面,我明白,你不想操作滑鼠移動游標,希望有移動游標的快捷鍵,沒問題:

C-a 是把游標移動到行首的快捷鍵,這裡大寫的 C 表示 Ctrl 鍵,C-a 就是同時按下 Ctrl 鍵 和 a 鍵
C-e 是把游標移動到行尾的快捷鍵

恩,看來 Emacs 的鍵盤快捷鍵操作起來果然很流暢,那我們繼續把程式碼修改為函式:

CL-USER> (defun hi () 
   (format t "你好,世界!"))
HI
CL-USER> (hi)
你好,世界!
NIL

這裡涉及到自定義函式的知識點,我假設大家都學過 C 語言,那麼我們可以猜測一下 defun 的語法結構:

首先是括號,然後是 defun ,表示開始定義函式,再後面是 hi ,是我們自定義的函式名稱,後面的空括號應該是引數吧,不過因為我們這一段程式沒有使用引數,所以是空的,接著是函式體,也就是這個函式具體執行的操作,這個函式體要用括號括起來,最後再用一個括號和最前面的括號對應,把所有的內容括起來。 這裡我們發現 REPL 在遇到回車換行時,它不會按行處理,而是按括號來處理,所以你可以增加任意個回車換行,只要沒有輸入跟第一個左括號匹配的右括號,它都不會認為你的輸入結束,只有當你所有的左括號都有一個對應的右括號來匹配時,REPL 才會認為你輸入的內容結束了。

這裡給一個 defun 函式定義的標準語法形式吧:

(defun name (parameter*)
    "可選的函式描述"
    body-form*)

parameter* 表示 0 個或者多個 parameter,這裡的 * 是正則式語法符號,表示 0 個或多個
body-form* 表示 0個或多個 body-form

對應中文就是這樣:

(defun 函式名 (引數*)"可選的函式描述"
    形式體*)

這裡解釋一下 body-form 這個概念,Common Lisp 定義了兩個語法黑箱,前者叫讀取器,將文字轉化為 Lisp 物件,後者叫求值器,它用前者定義好的 Lisp 物件來實現語言的語義,我們知道直接輸入到讀取器中的 Lisp 程式是由 S-表示式組成的,而求值器則定義了一種構建在 S-表示式(符號表達式)之上的 Lisp形式--form 的語法。

所有的字元序列都是合法的 S-表示式

這一點意味著你可以把任意的字元序列交給 Lisp 的讀取器來處理,你可以定義任意的語法格式來作為你的程式的文字輸入---當然,這需要你做一些相關的設定,不過我們還是建議初學者先了解、熟悉大家都習慣的 Lisp 語法形式,等你真正學會了,就可以創造自己的程式語言了,是不是聽起來很鼓舞鬥志?

但是並非所有的 S-表示式 都是合法的 Lisp形式--form

舉個例子就清楚了,(hi) 和 ("hi") 都是合法的 S-表示式,但是 (hi) 是一個合法的 Lisp形式--form,而 ("hi") 就不是一個合法的 Lisp形式--form,因為字串作為列表的第一個元素對於 Lisp形式--form 而言是沒有意義的。

說了這麼多,其實主要是討論什麼才是函式定義中的 body-form(形式體)的合法形式,想搞清這個問題,又不願意多想的話,就到環境上去試驗吧,把你能想到的各種形式都試驗一下。:)

留個小作業:

如果函式定義中有多個形式體,應該如何去寫?建議大家自己上機試驗。

  • 函式呼叫的特殊情況

既然有一般情況,那就有特殊情況,另一種對函式的呼叫方式是間接呼叫,就是把函式1作為引數傳遞給另一個函式,由另一個函式間接呼叫函式1,具體到我們這個例子就是用另一個函式間接呼叫 hi,接下來就介紹這兩個函式:funcall 和 apply,它們需要使用這種形式:

CL-USER> (funcall #'hi)
你好,世界!
NIL
CL-USER> (apply #'hi nil)
你好,世界!
NIL
CL-USER> 

感興趣的朋友可以試著分析一下 funcall 和 apply 的區別,另外也可以試著執行一下下面這兩種形式,看看會有什麼錯誤提示,從這些錯誤提示資訊也可以瞭解一些 Common Lisp 的內部處理機制。

犯錯嘗試:
錯誤1:    (apply #'hi)
錯誤2:    (funcall #'(hi))
錯誤3:    (apply #'(hi))

上面我們提到一個組合符號 #' ,它由兩個符號組成,前面是井號 # ,緊跟著是單引號 ' ,這個組合符號 #' 等價於函式 function,前者是後者的“語法糖”,不過兩者的使用形式有些區別:

CL-USER> (funcall (function hi))
你好,世界!
NIL
CL-USER>

【小提示】:

在這些不起眼的處理細節上多想想區別,多試試錯誤,多看看錯誤提示資訊,有助於我們更好的理解 Common Lisp 的內部處理機制。

關於 funcall 和 apply 更具體的應用場景就不在這裡詳述了,建議大家閱讀《實用 Common Lisp 程式設計》和 《ANSI Common Lisp》中的相關章節來做更深入的瞭解。

哈,經過這麼一番學習,終於完成了我們的第一個函式,於是有人就說:這麼好的函式能不能儲存起來,免得下次想呼叫它還得重新輸入這麼多字元,沒問題:

可以先拷貝程式文字,這裡說一下 Emacs 下的拷貝貼上快捷鍵:

Mac 系統
拷貝是 Command 鍵 和 c 鍵同時按下
貼上是 C-y : Ctrl 鍵 和 y 鍵 同時按下
是不是感覺有些奇怪,沒關係,如果不適應的話可以自己修改配置檔案,或者修改 slime.el 檔案來重新定義

MS-Windows 系統
拷貝是  M-w :Alt 鍵 和 w 鍵 同時按下
貼上是  C-y :Ctrl 鍵 和 y 鍵 同時按下

然後建立新檔案:

使用如下快捷鍵
C-x C-f 就是先同時按下 Ctrl 鍵 和 x 鍵,然後全部鬆開,再同時按下 Ctrl 鍵 和 f 鍵,再鬆開,Emacs 螢幕底部會顯示如下:
Find file: ~/
預設儲存在當前使用者目錄下,Mac系統是 /Usrs/admin/

你輸入要儲存具體要儲存的目錄,我的檔案儲存在 ~/ECode/Markdown-doc/hi.lisp

可以使用 TAB 鍵來自動補全,這樣就不必一個個手工輸入了

我輸入的檔案路徑和名稱如下:

Find file: ~/ECode/Markdown-doc/hi.lisp

注意檔名字尾要儲存為 .lisp 代表這個檔案是 Common Lisp 程式。

Emacs 也有一種用來定製編輯器的 Lisp 語言,叫做 Emacs Lisp,這種檔案的字尾是 .el.emacs

相關推薦

Common Lisp 初學者快速入門指導

目錄 寫作本文的緣起:我也是一名 Common Lisp 的初學者,在對照著各種教程學習 Common Lisp 的過程中,發現有不少細節都需要自己去摸索,比如對開發環境的進一步配置(推薦使用開發環境--LispBox 作為一個一鍵式開發環境,大大降

阿里雲MQ快速入門指導

官方文件 本文主要描述從開通 MQ 服務、建立 MQ 資源,到使用 MQ SDK 進行訊息收發的完整流程,旨在以最簡單明瞭的方式引導您快速上手 MQ,為進一步使用和熟悉 MQ 的功能提供入門。 訊息收發部分以 TCP 協議下呼叫 Java SDK 為例來演示。

MarkDown總結(適合初學者快速入門

  今天第一天寫部落格,寫點什麼好呢。。。 就把自己常用來寫文件的小工具——MarkDown做個簡單的總結分享給大家吧,利人也利己。。。      本篇就對MarkDown簡要做總結,非常適合初學者快速入門。。      總得的來說,MarkDown

沒有基礎的初學者學java怎樣快速入門?超全的學習路線圖

... 當下 需要 賺大錢 分享圖片 ase 都是 post 快速入門 現在地球人都知道互聯網行業工資高,上萬都是小case,不值一提。可是對於大部分人來說,工資七八千都算很難了。那我也想學java,當程序員,賺大錢。可是作為一個初學者,怎樣才可以快速入門呢?早點入門就可以

UI設計初學者必看,這款設計神器教你快速入門

網路時代,網頁和手機App已經深入到人們生活的方方面面。這也使得App介面設計越來越受青年求職者們的青睞,並紛紛投入這個行業。但是,作為UI設計初學者,究竟如何才能快速的入門?當今市場上,是否有那麼一款高效實用的設計工具,幫助他們快速入門,提高工作效率的同時,迅速提升專業技能

快速入門CAD 給初學者的8條建議

  想要快速入門CAD繪圖,今天小編給CAD初學者8條建議:   第1條:選擇適合的軟體   也許你毫不猶豫的選擇AutoCAD,但是我勸你放棄,因為裡面的命令是英文的,作為初學者,在沒有了解軟體操作的情況下,還要先熟悉英文命令,這對矇頭轉向的寶寶們來說太難了。如果你不是個小天才,還是踏實一

大資料初學者的福利——Hadoop快速入門教程

1、Hadoop生態概況 Hadoop是一個由Apache基金會所開發的分散式系統整合架構,使用者可以在不瞭解分散式底層細節情況下,開發分散式程式,充分利用叢集的威力來進行高速運算與儲存,具有可靠、高效、可伸縮的特點 Hadoop的核心是YARN,HDFS,Mapreduce,常用模組架構如下 2、

大數據初學者的福利——Hadoop快速入門教程

硬件故障 資源管理 默認 2.6 book 分布式系統 strong 基金會 幫助 1、Hadoop生態概況 Hadoop是一個由Apache基金會所開發的分布式系統集成架構,用戶可以在不了解分布式底層細節情況下,開發分布式程序,充分利用集群的威力來進行高速運算與存儲,具有

入門篇:快速上手指導,10步輕鬆get強大夥伴使用技巧

一、 註冊 1、點此進入夥伴協同官網主頁。 2、在右上角點選“免費註冊”。 3、按照要求填寫好資訊,完成使用者註冊。 二、登入 1、在主頁右上角點選“登入”。 2、填寫註冊資訊後進入。 三、加入企業 1、點選企業管理員發來的邀請郵件或簡訊連結,進入夥伴協同。 2、完善個人資訊後開始使

Common Lisp 入門】配置開發環境 in Emacs

安裝 Emacs sudo apt-get install emacs 安裝 Common Lisp 環境 sudo apt-get install common-lisp-control

day39-Spring 12-Spring的JDBC模板:快速入門

pri 哪些 困難 ces 5.0 使用 只需要 common commons Spring AOP的關鍵是它的底層的原理和思想,配置和使用並不是十分困難.AOP本身就是一個思想,是面向對象的延伸,不是用來替換面向對象的,而是用來解決面向對象中的一些問題的.在最初的時候提出

ANSI Common Lisp Chapter 2

第一個 程序 clas 叠代 bic mar section mon 交互式 Chapter 2 總結 (Summary) Lisp 是一種交互式語言。如果你在頂層輸入一個表達式, Lisp 會顯示它的值。 Lisp 程序由表達式組成。表達式可以是原子,或一個由操作符跟著

vuex2快速入門

for nbsp mar lin ext mac os cnblogs value san #建立store.jsimport Vue from ‘vue‘; import Vuex from ‘vuex‘; Vue.use(Vuex) export d

快速入門系列--WCF--07傳輸安全、授權與審核

最大的 緩存 ims cut 常見 曾經 strong 這一 set 這部分主要涉及企業級應用的安全問題,一般來說安全框架主要提供3個典型的安全行為:認證、授權和審核。除了典型的安全問題,對於一個以消息作為通信手段的分布式應用,還需要考慮消息保護(Message Prote

快速入門系列

body 現在 安全 behavior 需求 discovery 中心 驗證 溝通 最後一章將進行WCF擴展和新特性的學習,這部分內容有一定深度,有一個基本的了解即可,當需要自定義一個完整的SOA框架時,可以再進行細致的學習和實踐。 服務端架構體系的構建主要包含接下來

快速入門系列--WCF--02消息、會話與服務寄宿

abc align bsp 不同的 cpu .org 程序 伸縮 網絡 經過WCF基礎的ABC學習,已經可以構建簡單的WCF的服務,使用不同的服務地址和綁定類型,根據業務提供所需的服務契約。但不禁想問,服務所使用的消息報文是什麽樣的形式麽?蘊含什麽樣內容呢?WCF服務是否支

python 基本語法速覽,快速入門

我們 method adding ger monk use gre 數據類型 struct https://zhuanlan.zhihu.com/p/24536868 學習參考於這個博文。 我做一個筆記。 關於python一些常用的語法快速的預覽,適合已經掌握一門編程語

Django REST framework 的快速入門教程

ret turn ads 使用 blog 所有 定義 想去 cti CRM-API項目搭建 序列器(Serializers) 首先,我們來定義一些序列器。我們來創建一個新的模塊(module)叫做 crm/rest_searializer.py ,這是我們用來描述數據是如何

Celery 分布式任務隊列快速入門

ade sunday reat 失敗 繼續 complete port 機器 single Celery介紹和基本使用 在項目中如何使用celery 啟用多個workers Celery 定時任務 與django結合 通過django配置celery period

Unity快速入門

小冰 教程 應該 arp nbsp 2.3 入門 模擬操作 飛機 1.熟悉基本操作。 最權威的應該是官方出品,158元的Unity官方教程,其他的基礎操作視頻 lynda 的5.0 ,5.4都可以 2.熟悉簡單例子,將API熟悉一下啊,這個過程中,背誦API是捷徑。 2