2015年10月26日
#
轉發 http://blog.chinaunix.net/uid-23093301-id-90459.html
問題來源:
創建一個游戲系統,其將運行在互聯網的環境中。客戶端通過WWW服務或特定的客戶端軟件連接到游戲服務器,隨著流量的增加,系統不斷的膨脹,最終后臺數據、業務邏輯被分布式的部署。然而相比中心化的系統,復雜度被無可避免的增大了,該如何降低各個組件之間的耦合度。
挑戰:
需要保證可伸縮性、可維護性、可更新性,需要將服務劃分為各個相對獨立的組件,組件被分布式的部署,它們之間通過進程間通信方式實現交互。服務的增加、刪除、改變都應該被支持。理想情況,以開發者的角度看,集中化的系統和分布式的系統在中心邏輯上沒有什么不同。為實現這個目標:
l 可以遠程的訪問服務,而對于訪問者,服務的位置應該是透明的。
l 提供服務的組件可以增加、刪除、改變,而且這些在運行期同樣應該被支持。
l 訪問服務的客戶端不應該關心服務的實現細節。
解決方案:
引入一個Broker組件,解耦客戶端和服務端。服務端注冊自己到Broker,通過暴露接口的方式允許客戶端接入服務。客戶端是通過Broker發送請求的,Broker轉發請求道服務端,并將請求的結果或異常回發給客戶端。通過使用Broker模式,應用可以通過發送消息訪問遠程的服務。
這一架構模式允許動態的改變、添加、刪除服務端,從客戶端的角度,這些都是透明的。
結構:
Broker模式定義了6中類:Client,Server,Client_Proxy,Server_Proxy,Broker,Bridge。
Server:
l 責任:處理特定領域的問題,實現服務的細節,注冊自己到Broker,處理請求并返回結果或異常。
l 協作類:Server_Proxy,Broker
Client:
Client是需要訪問遠程服務的應用程序,為此,Client發送請求到Broker,并從Broker上接收響應或異常。Client和Server只是邏輯上相關而已,實際上Client并不知道Server的確切位置。
l 責任:1. 實現用戶端功能,2. 發送請求到Broker,3. 接收相應和異常。
l 協作類:Broker,Client_Proxy
Broker:
Broker可以被看成消息轉發器。Broker也負責一些控制和管理操作。它能夠定位服務端的位置,若發生異常,能夠將異常捕獲傳給Client。Broker需要提供注冊服務的接口給Server。如果請求來自其他的Broker,本地的Broker需要轉發請求并最終將結果或異常回應給相應的遠程Broker。Broker提供的服務和name service非常相像(如DNS、LDAP)。
l 責任:1. 注冊服務。2. 提供服務API。3. 轉發消息。4. 容錯處理。5. 與其他Broker的交互。6。 定位服務。
l 協作類:Client_Proxy,Server_Proxy,Bridge
Client_Proxy:
連系Client和Broker,這一層保證了通訊的透明性,使Client調用遠程服務就像調用本地的服務一樣。
l 責任:1. 封裝特定的系統調用。2. 封裝通訊的參數、控制信息等。
l 協作類:Client,Broker。
Server_Proxy:
Server_proxy是與Client_Proxy相對應的,它接受請求,解包消息,解析出參數并調用服務的實現接口。
l 責任:1. 封裝特定的系統調用。2. 封裝通訊的參數、控制信息等。3. 調用server的服務接口。
l 協作類:Server,Broker。
Bridge:
Bridge用來連接各個Broker,一般這個組件是可選的。當系統是發雜的網絡組成時,有可能需要這一角色。
l 責任:1. 封裝特定的網絡特性。2. 傳遞Broker之間的通訊。
l 協作類:Broker。
應用場景一:
直接通訊方式。Client和Server相互理解他們之間的通訊協議。Broker主要完成Client和Server之間的握手。之后所有的消息、異常都是由Client與Server直接交互。(想象DNS)。簡單對象交互如圖:
應用場景二:
l Broker啟動,完成自身的初始化,之后進入事件循環,等待消息到來。
l Server啟動,首先執行自身的初始化,然后注冊自己到Broker。
l Broker接收Server的注冊請求,將其加入到可使用服務的列表,并回應Ack給Server。
l Server接收Ack,進入事件監聽循環,等待消息到來。
l Client調用遠程服務對象的方法,Client_Proxy封裝消息請其發送給Broker。
l Broker查詢可使用的Server,將請求轉發給Server。
l Server_Proxy解析消息,分離出參數和控制信息,并調用特定的Server實現接口。Server處理完的結果通過Server_proxy封裝成消息轉發到Server。
l Broker將相應消息轉發給正確的Client_Proxy,Client受到響應繼續其他邏輯。
簡單對象交互如圖:
應用場景三:
l Broker A接收到請求,交由Server處理,但是發現該Server位于其他的網絡節點。
l Broker A將請求轉發給Bridge A,Bridge A將請求進行必要的格式化,傳送給Bridge B。
l Bridge B將請求進行必要的格式化,轉化成Broker B可以理解的格式,并轉發給Broker B。Broker B執行場景二中的過程,處理的結果按如上逆序返回。
簡單對象交互如圖:
部署示意圖:
總結:
u 優點:
1. 服務的位置透明性。
2. 組件的可變性及擴展性。由于Server是注冊到Broker上的,所以Server可以動態的增加、刪除、改變。
3. Broker之間可交互。
4. 可重用性。
5. 由于組件的耦合度較小,調試和測試的工作也是可控的。
u 缺點:
1. 效率;增加了一層Broker的消息轉發,效率有所降低。
2. 容錯能力必須要特別考慮。
3. 調試和測試的工作加大。
2014年10月16日
#
大師的非凡能力來源于何處?思維方式是關鍵。科學證據告訴人們,沒有天生的大師,只有煉就的專家。只要擁有專家的思維,你就能成為大師!
1909年的一天。多張象棋桌圍成了一個圈,一個男子在圈內慢慢踱步。他的雙眼不斷掃描周圍的棋局,每隔兩三秒鐘就會下一步棋。而在圈外,數十位象棋迷不停地搔頭、苦想對策。這個人是誰?為什么他能以一人之力抗衡數十人的智慧?他就是國際象棋界的傳奇人物,古巴象棋大師卡帕布蘭卡(José Raúl Capablanca)。比賽結果毫無懸念,卡帕布蘭卡28局全勝。這只是他巡回表演賽中的一站,在整個巡回表演賽中,卡帕布蘭卡贏了168局。
為什么眨眼間他就能作出最正確的決定?面臨巨大的壓力,他能提前計算幾步?卡帕布蘭卡輕描淡寫地說:“我只提前看一步,但總是最正確的一步。”
這句話再簡單不過,卻開創了心理學研究的新紀元:象棋大師優于新手的地方就在于那電光火石間的思考。這種快速的、由知識引導的知覺,有時叫做“領悟”。在其他領域,專家們同樣具有“領悟”的本領。一次比賽完畢,象棋大師能記住自己走過的每一步棋;對于一段音樂,哪怕只聽過一遍,資深音樂家也能寫出樂章的曲譜。無論多么困難,象棋大師也能在瞬間想到最妙的棋著;不管多么復雜,經驗豐富的專業內科醫生有時只須瞥上病人幾眼,就能作出準確的診斷。
專家們的非凡技藝從何而來?源于天賦,還是得益于強化訓練?通過對象棋大師的研究,心理學家找到了答案。一個世紀的探索積累了大量研究成果,新的理論應運而生,人腦處理信息(信息的組織與提取)之謎也由此破解。這項研究的意義還不僅在于此,人類的教育事業也將從中受益:象棋棋手提高棋藝的技巧,可否用于提高學生們的閱讀、寫作和計算能力呢?
象棋是最好的研究對象
人類何時開始擁有專業技術?這也許要從祖先們的狩獵說起。對于他們而言,狩獵技術是維系生命的重要工具,不掌握它就難以生存。經驗豐富的獵人不僅知道獅子在哪里出沒,而且還能推斷出獅子的行蹤。從孩提時代開始,他們就得跟隨長輩練習追蹤技術。隨著年齡的增長,追蹤技術也日益嫻熟。“技術的熟練程度隨著年齡的增長而增長,35歲左右達到技術的巔峰,”美國加利福尼亞大學富勒頓分校的人類學家約翰?博克(John Bock)說道。練習追蹤技術要花費很多時間,可能比培養優秀的腦外科醫生還要費事。
相對于新手,如果在技術上沒有絕對優勢,那就難稱專家,只不過是多了一張唬人的文憑。這種披著專家外衣的人比比皆是。過去20年的研究結果表明,所謂的專業炒股者并不比業余者賺的錢多;知名品酒家對酒類的鑒別能力并不比饞酒的老農強;高學歷的精神病醫生并不比低文憑的同行出色……即使真的存在專業技術,如教學、工商管理,都很難去衡量,更別提如何去闡釋。
不過,棋藝卻可以度量、可以分解、可以接受試驗研究,并且十分直觀,尤其在比賽時,任何人都能隨時觀看。正是基于以上原因,認知科學家如獲至寶,將象棋作為研究思維理論的最佳試驗對象。于是象棋被稱作“認知科學的果蠅”。
對象棋手棋藝的度量,已經走在了其他任何比賽、運動或競技活動的前面。運用統計學公式,對棋手曾獲得的所有成績進行分析,就可以得到棋手的實力等級。然后根據棋手的等級與對手的實力,即可準確地推算出棋手的獲勝幾率。如果A棋手的等級分高于B棋手200點,那么在比賽中,A戰勝B的平均幾率為75%。不管棋手是頂級的還是普通的,這種預測都很準確。例如,俄羅斯特級象棋大師加里?卡斯帕羅夫(Garry Kasparov),他的等級分是2812點,而荷蘭象棋大師揚?蒂曼(Jan Timman)的等級分是2616點。如果二者對弈,那么卡斯帕羅夫就有75%的勝算。同樣,中等水平的棋手(1200點)與另一個1000點的棋手對弈,前者亦有75%的勝算。選手的等級分代表著他們的真正實力,以選手的等級為標準,心理學家就可以客觀地評估他們的專業技術,動態追蹤他們整個象棋生涯,而不會受到選手名氣的影響。
為什么認知科學家沒有選擇臺球或橋牌作為研究模型,而偏偏選擇象棋呢?可能是因為象棋比賽最考驗人的智慧。正如德國詩人歌德所言,象棋是“智慧的試金石”。象棋大師的技藝出神入化,令人嘆為觀止,人們將他們的能力歸因于他們“擁有魔力”的大腦。這種魔力在下盲棋時體現得淋漓盡致。法國心理學家阿爾弗雷德?比奈(Alfred Binet)是首個智力測驗的發明人之一。1894年,他曾請象棋大師描述他們下棋的過程。起初,他認為棋盤就像照片一樣存在于象棋大師的大腦中,但是他很快斷定,大師們大腦中的圖像還要抽象得多。他們整體把握棋子的位置關系而不注重具體細節,就像只關心馬而不關心馬的鬃毛一樣。
通過把握比賽的即時細節以及回想走過的棋步,盲棋大師能將腦海中的棋局補充完整。假設大師忘記了卒的準確位置,該怎么辦呢?他立即開始回想開局時的套路,因為在開局時,套路相對固定,而且已經爛熟于胸,因此很容易找到卒曾經所在的位置。他也可以回憶走過的棋步,通過推理來找到卒的位置――“前兩步我沒能抓住他的相,所以當時一定有卒在擋路……”他不必糾纏細節不放,利用組織完善的連接系統,可以重獲任何想要的細節。
如果大師們的魔力――超凡的計算、計劃能力都是以復雜的知識結構為基礎,那么就可以肯定,專業技術多半來源于刻苦訓練,而非上天的恩賜。荷蘭心理學家阿德里安?德赫羅特(Adriaan de Groot)是一位象棋大師。1938年,荷蘭舉行了一場國際象棋錦標賽,他利用主場之便,對普通棋手、專業棋手與世界頂級大師進行比較后,進一步鞏固了上述觀點。他曾使用的一種方法就是請棋手觀看節選自比賽的棋局,然后說出自己的想法。他發現,盡管專業棋手的分析能力要比普通棋手強,但是當他們的實力提升至大師級時,反而不會去思索更多的下法。因為在高手的心中,只會留下最妙的棋著――正如卡帕布蘭卡聲稱的那樣。
近來研究表明,德赫羅特的發現只展示了象棋大師的部分實力。在一場對弈中,如果大量而精確的計算無法避免時,大師們就會拿出真功夫,深入研究各種可能的棋步走法。這種能力,會讓普通棋手望塵莫及。同樣,知識淵博的物理學家遭遇難題時,也會比他的學生想出更多的解決辦法。然而在上述兩種情況下,專家依靠的不是與生俱來的強大的分析能力,而是多年來逐漸建立起來的知識結構。面對困難的棋局,一個實力平平的棋手可能會耗費大半個小時去計算、提前看許多步,然而總是錯過最正確的一步。相反,一個大師級的棋手根本不用有意識地去分析,立即就能看到精妙入微的一步。
德赫羅特還讓參加試驗的棋手在短時間內審視棋局,然后憑記憶重建棋局。在這樣的試驗條件下,任何棋手的實力都會暴露無遺。就算用長達30秒鐘的時間去回憶棋局,新手能記起的細節也是支離破碎的。而象棋大師,即使只瞟上幾眼,也能輕松重建棋局。這種差別源于一種特殊記憶,也就是對棋局的特異性記憶。特殊記憶是訓練的結果,因為在一般性的記憶測試中,大師的表現并不比其他人好。
同樣的現象還能從橋牌牌手(多場牌局后,仍記得出過的牌)、計算機程序設計師(能重組大量的計算機編碼)和音樂家(能記住大段大段的樂章)身上看到。在特殊領域,對主題事務的記憶能力,是衡量專業技術水平的重要標準。
一個不常見的案例也能證明,知識結構才是專家們戰無不勝的法寶。一個叫D.H(姓名不全)的業余棋手,經過9年的訓練,終于在1987年成為了加拿大一流的象棋大師。美國佛羅里達州立大學的心理學教授尼爾?蔡內斯(Neil Charness)指出,盡管這個棋手的實力已經今非昔比,但是他對棋局的分析范圍并不比從前廣泛,反而是日益精深的棋局知識和相關策略幫助他連連告捷。
非凡能力來自何方
在上世紀60年代,美國卡耐基-梅隆大學的心理學家赫伯特?西蒙(Herbert Simon,1978年諾貝爾獎得主)和威廉?蔡斯(William Chase),試圖通過研究專家的記憶局限性來更好地洞察專家的記憶能力。按照德赫羅特的研究思路,他們請各個級別的棋手重建曾被人動過的棋局。不過這盤棋局不是大師對弈后的殘局,而是一盤亂擺的棋局。在重建這盤隨機棋局時,棋手間的差距并不明顯。
因此,象棋運動中的特異性記憶不只取決于象棋這項運動,還取決于棋局的類型。這些實驗驗證了早期的研究結果,有力地證明了能力的非通用性,不同的領域需要不同的能力。早在一個世紀前,美國心理學家愛德華?桑代克(Edward Thorndike)就首先提出了上述理論。當時他指出,拉丁語說得好不等于英語水平高,幾何證明也不能教會人們在日常生活中運用邏輯思維。
象棋大師要處理的信息,數量極其龐大,似乎已經超越了人類記憶的極限。為了解釋他們這種超凡的能力,西蒙引入了模塊理論。1956年,美國普林斯頓大學的心理學家喬治?米勒(George Miller)曾發表過一篇著名的論文――《非凡的數字7±2》。米勒在論文中指出,人的記憶有一定的限度,每次只能處理5~9條信息。西蒙強調說,通過把不同層次的信息構建成一個一個模塊,大師就能突破記憶的極限。通過這種方法,他們會去捕捉5~9個模塊,而不是5~9個具體細節。
以“Mary had a little lamb”(瑪麗有一只小羊羔)這句詩為例。詩里的信息模塊數取決于讀者對詩歌與英語的熟悉程度。對于以英語為母語的人,這句詩是一個非常大的模塊――著名詩歌的一部分;對于懂英語卻不懂詩歌的人,這就是一句話――一個完整的模塊;對于記得單詞卻不明白含義的人,這句話是5個模塊(單詞);而對于認得字母,卻不認識單詞的人,這句詩就是18個模塊(字母)!
在象棋新手和象棋大師之間就能清楚地看到這種差別。假如有一個擺著20個棋子的棋局放在面前,新手和大師會怎么處理其中的信息呢?新手滿眼都是棋格,而棋子又有多種擺法,因此他獲取的信息模塊遠多于20個。那么大師呢?他會將棋局整體化,然后把整個棋局分割成5~6個模塊,這樣記起來不就輕松多了!根據獲取一個新的記憶模塊所花掉的時間,以及普通棋手成長為大師級選手所需要的時間,西蒙估算出了象棋大師的大腦中存儲的信息模塊數:5萬~10萬個!就像我們聽幾個字就能背出一首古詩一樣,象棋大師只要看一眼棋局,就能從記憶中提取出相應的信息模塊。
但是模塊理論還有缺陷。對一些記憶現象,例如當大師們精力分散時,他們的表現并沒有受到明顯影響,模塊理論就無法給出合理的解釋。佛羅里達州立大學的K?安德斯?埃里克森(K. Anders Ericsson)與蔡內斯認為,可能還存在另外一種機制,使得專家可以把長時記憶當作暫存區使用。埃里克森說:“訓練有素的棋手在不看棋盤的情況下,能以幾乎正常的水平下棋,要用模塊理論來解釋這樣的事例,幾乎不可能。因為你必須先了解棋局,然后才能在記憶中把它翻出來。”這一處理過程需要改變已有的信息模塊,就像倒背 “Mary had a little lamb”,雖然可以做到,但是很難,而且還會錯誤不斷。然而在下盲棋的時候,象棋大師仍然可以精準快速地下棋,讓對手無所適從。
埃里克森還引證了內科醫生的學習過程。醫生們先把信息變為長時記憶,當需要使用這些信息來診斷疾病時,再把它從記憶中提取出來。埃里克森還列舉了一個最普通、最常見的例子――閱讀。1995年,他在研究中發現,越是熟練的讀者越不容易受到干擾。就算閱讀被打斷,熟練的讀者也能在幾秒鐘的時間內恢復原有的閱讀速度。研究人員用長時工作記憶來解釋這一現象。這一說法似乎自相矛盾,因為長時記憶與工作記憶是兩個相互對立的概念。不過在2001年,德國康斯坦茨大學進行的大腦成像研究卻為這一說法提供了依據。研究結果表明,較之新手,專業棋手的長時記憶顯然更容易激活。
上世紀90年代末期,西蒙曾提出過一種競爭理論。英國倫敦布魯內爾大學的費爾南德?戈貝特(Fernand Gobet)對它推崇備至。競爭理論實際上是模塊理論的延伸,它引入了“模板”的概念,也就是一種極其典型并包含了大約12只棋子的大型布局。模板擁有許多插口,大師可以插入卒或者相這樣的變量。再以詩句“Mary had a little lamb”為例,如果某個詞的韻律與詩句中的詞等同,那么就可以用這個詞來替換詩中的詞。例如,用“Larry”替代“Mary”,用“pool”來替代“school”等等。任何知道原始模塊的人,都能在瞬間插入另一個詞。
天才是怎樣“煉”成的
要想在大腦中建立復雜的知識結構,就得不斷努力。西蒙提出了“十年規則”,他認為要掌握任何技藝,十年的艱辛歷程是無法避免的。即便是數學天才高斯,音樂奇才莫扎特,象棋神童菲舍爾,也得去拼搏、去奮斗,也許他們所付出的努力是常人難以想象的。
近年來,象棋天才似乎不斷涌現,但這都歸因于計算機的強大功能。計算機能讓孩子們研究海量的大師級比賽,頻繁地與大師級程序對抗,于是在較短的時間內,他們就能積累豐富的實戰經驗。1958年,15歲的菲舍爾獲得了象棋大師的稱號,當時這一消息震驚了全世界。而目前的記錄保持者、烏克蘭的謝爾蓋?卡爾亞金(Sergey Karjakin)獲得大師稱號時,僅有12歲零7個月!
埃里克森認為,光是練習遠遠不夠,還需要全身心投入,不斷挑戰極限、超越自我。就像業余愛好者,他們可能會用大量的時間來練習下棋、打高爾夫球、演奏樂器,卻始終達不到專業水平;然而一個經過正規訓練的學生,卻能在較短的時間內超過他們。這是一個很有趣的現象,說明練習和比賽對棋手的幫助似乎不如踏踏實實地學習。訓練和比賽的主要價值在于,新手可以從中發現自己的缺陷,從而在以后逐漸彌補。
在學習初期,新手往往興趣濃厚,鉆研勁兒十足。他們剛開始學習打高爾夫球或者開車時,技術的進步速度可用“神速”二字來形容。但是技術一旦攀升到一定的階段,例如跟上了高爾夫球友的節奏,或者考取了駕照,大多數人就松懈了。于是,他們變得懶散,技術也被荒廢。相反,訓練專家總是讓人不停地思考,因此參與學習的人就會自覺自律地去鉆研、不斷提高技術,從而縮小與高手之間的差距。
人類在進步,衡量專業水平的技術標準也在不斷提高。現在的高中生能在4分鐘內跑完一英里(約合1.6公里);學音樂的學生敢于演奏曾經只有名家才敢嘗試的曲子。如果說上述比較還不能讓人信服,那么我們再來看看象棋上的證據。英國人約翰?納恩(John Nunn)既是數學家,又是象棋大師。他利用計算機,比較了1911年和1993年舉行的兩屆國際象棋錦標賽。結果發現,現代棋手出錯的幾率要小很多,換言之,他們比前輩們下得更準確。納恩還研究了1911年的一個棋手下過的所有棋局。在當時,這個棋手算是一個中等級別的選手。按照今天的標準,他的等級分不會多于2100點,離大師級標準還有一大段距離。與普通棋手相比,百年前的大師仍然實力強勁,不過與今天的大師相比,可能就有一定的差距。
在卡帕布蘭卡的那個時代,計算機、象棋數據庫都還沒有出現,他們只能靠自己解決一切問題,正如巴赫、莫扎特和貝多芬。如果說今天的大師在技術上已經超越了曾經名滿天下的先輩們,然而在創造力方面他們卻難以望其項背。今天,剛畢業的物理學博士掌握的物理知識,恐怕連牛頓也要自嘆弗如,但是在這些博士中,有誰能像當年的牛頓一樣發現萬有引力定律?
說到這里,很多懷疑論者的耐心可能會蕩然無存。他們肯定會說,要步入卡耐基殿堂,除了練習、練習、再練習之外,還要付出更多的東西。雖然相信天資的重要性,尤其是專家和他們的學生對此深信不疑,然而奇怪的是,沒有任何證據來支持這一觀點。2002年,戈貝特曾做過一項研究。研究中,他用圖形記憶測驗衡量各級別棋手的視覺空間智能。結果發現,棋藝的高低與視覺空間智能的強弱根本沒有聯系。還有研究人員發現,職業裁判預見賽馬結果的能力與他們的數學能力也沒有什么關系。
... ...
2014年6月12日
#
摘要: 熵是信息理論中非常重要的一個概念,用來度量信息,在實踐中大量使用。
信息檢索最重要的概念TF/IDF(term frequency/inverse document frequency)就是基于信息熵理論。搜索引擎、新聞分類、文本相似度計算都使用這個概念。
閱讀全文
2013年6月24日
#
看Chomsky的書是因為在編譯原理課程中多次提到這個人,這是個變態天才,神一般的存在,而且還是活的。
Chomsky的語言學理論觀點在語言學、心理學和哲學領域都產生了廣泛而深刻的影響。Chomsky的哲學思想是一個貫穿了唯實論、自然主義和心智主義的連貫的、完整的體系。這一體系的核心是內在語言理論。但是這一理論觀點與傳統觀點分歧很大 ,因此遭受到哲學界的強烈攻擊。Chomsky正是在這些爭論的過程中不斷地發現問題并對自己的理論和觀點進行修改和補充 ,從而使其哲學系統乃至語言學理論系統更趨完善。哲學問題咱不關心這么無聊的問題留給哲學家們去扯。
理論方法
Chomsky語言學的理論方法概況起來講,是自然科學中形式主義的演繹方法,用Chomsky自己的話講,叫伽利略研究風格(Galileo Style),像伽利略為宇宙建立抽象的數學模型一樣,構建有關語言知識的抽象數學模型,相信類似數學一樣的形式主義的演繹推理模型具有自足自明的真理性。Chomsky的語言研究所追求的是從世界各種語言五花八門的句子樣式中抽象出幾個簡單的句法規則。
Chomsky的句法結構一書中把語言學看成跟自然科學中的其他科學一樣,可以從假設出發,進行推演并形式化。換句話說,非經驗主義是可能的。《句法結構》有一半篇幅用于英語語法的形式化。非經驗主義和形式化是轉換生成語法的首要標志。
把句法關系作為語言結構的中心并以此說明語句的生成是這場革命的又一表現。為了描寫和解釋語言現象,Chomsky在《句法結構》中論證了語法的生成能力,認為應該把語法看成是能生成無限句子的有限規則系統。
它以"核心句"為基礎,通過轉換規則描寫和分析不同句式之間的內在聯系。該書分析了以"馬爾可夫過程"為基礎的通訊理論,認為它只能生成有限狀態的語法,而這種"有限狀態的語法"不能生成象英語這種語言里含有不連續結構的所有合乎語法的句子。基于此,喬姆斯基提出了轉換語法模式,認為它才能生成所有合乎語法的句子而不會生成不合乎語法的句子。轉換語法模式由短語結構規則、轉換規則、語素音位規則三套規則構成。
短語結構規則有三種:合并、遞歸、推導式,其基本形式是x→y 。→讀作"改寫",這個公式就是將x改寫成y。短語結構規則生成的是"核心語符列",不經過轉換直接由這種語符列得出的基本句型叫"核心句"。
轉換規則包括:移位、刪略、添加。最后運用語素音位規則得出實際說出的句子。這三套規則中,最引人注目的是轉換規則,因為短語結構規則和語素音位規則實際上繼承了描寫語言學的"直接成分分析"和語素音位的分析,轉換是一種創新,它使語法具有更強的解釋力。
《句法結構》把語義排除在語法之外,這一時期的理論框架不包括語義部分。喬姆斯基認為,語法理論不應該建立在語義的基礎上,而應該用某種嚴格的、客觀的方法去代替對于模糊的語義的依賴。不過這一理論在后來的發展中做了重大的修正。
Chomsky 定義的四種形式語言文法中, 0 型文法又稱為 ( A )文法; 1 型文法又稱為 ( C ) 文法; 2 型語言可由 ( G ) 識別。
A .短語結構文法 B 前后文無關文法 C 前后文有關文法 D 正規文法
E 圖靈機 F 有限自動機 G 下推自動機
文法是用來定義語言的一個模型,常用的文法體系為Chomsky文法體系。
文法定義
文法G(Grammar)是一個四原組,G=(N,T,P,S),N(Non-terminator)是非終結符集合,T(Terminator)是終結符集合,P(Production)是產生式集合,S(Start)是起始符
其中:
N 交 T = 空集
P 是形式為 α -> β 的產生式
α ∈ (N∪T)*N+(N∪T)*,也就是說α中必須有一個非終結符
β ∈ (N∪T)* ,也就是說β可以是空串
S∈N
分類
0型文法(短語文法或無限制文法),識別0語言的機器叫做圖靈機
定義:P中產生式a-->b,其中a屬于V正閉包且至少含有一個非終結符,b屬于V星閉包
注:任何0型文法都是可遞歸可枚舉的
對0型文法作某些限制,可以得到其他文法的定義
1型文法 又稱上下文有關文法。生成式形式為 α->β, 且 |α| < |β| 并且不存在 A->ε
2型文法 又稱上下文無關文法。生成式形式為 A->α,即左邊必須只有一個非終結符
3型文法 又稱正則文法。
生成式 A->wB或A->w,稱為右線性文法
生成式 A->Bw或A->w,稱為左線性文法
0型文法 對生成式沒有任何限制的文法稱為0型文法。從0到3都是包含的關系,但是有特例,包含 A->ε 產生式的2,3型文法不屬于1型文法。
四種文法產生的語言分別稱為 上下文有關語言,上下文無關語言,正則語言,無限制性語言。
2型語言的表示法
2型語言是很重要的一種語言,除了用四元組的方法表示,此處再介紹兩種表示方法。
當人們要解釋或者討論程序設計語言本身時,經常又需要一種語言,被討論的語言叫做對象語言,即某種程序設計語言,討論對象語言的語言稱為元語言,即元語言是描述語言的語言。BNF范式通常被作為討論某種程序設計語言語法的元語言,而語法圖是與BNF范式的描述能力等價的另一種文法表示形式,因其直觀性而經常采用。
(1)巴科斯范式(Backus Normal Form,BNF)
2型文法生成式左端只有一個非終結符,所以可以把左端相同的生成式合并在一起,右端用|隔開,用::=代替->,所有非終結符用<>括起來,這是Backus為了描述AIGOL語言首次提出并使用的。
用BNF描述十進制整數的生成語法:
<無符號整數> ::= <數字>|<數字><無符號整數>
<數字> ::= 0|1|2|3|4|5|6|7|8|9
(2)語法圖
語法圖有四種基本形式
(3)推導樹
2型文法還經常用推導樹表示
2013年6月9日
#
節選自java.g
modifiers
:
( annotation
| 'public'
| 'protected'
| 'private'
| 'static'
| 'abstract'
| 'final'
| 'native'
| 'synchronized'
| 'transient'
| 'volatile'
| 'strictfp'
)*
;
Strictfp —— Java 關鍵字。
strictfp, 即 strict float point (精確浮點)。
strictfp 關鍵字可應用于類、接口或方法。使用 strictfp 關鍵字聲明一個方法時,該方法中所有的float和double表達式都嚴格遵守FP-strict的限制,符合IEEE-754規范。當對一個類或接口使用 strictfp 關鍵字時,該類中的所有代碼,包括嵌套類型中的初始設定值和代碼,都將嚴格地進行計算。嚴格約束意味著所有表達式的結果都必須是 IEEE 754 算法對操作數預期的結果,以單精度和雙精度格式表示。
如果你想讓你的浮點運算更加精確,而且不會因為不同的硬件平臺所執行的結果不一致的話,可以用關鍵字strictfp.
import語句可以導入一個類或某個包中的所有類
import static語句導入一個類中的某個靜態成員(方法或屬性)或所有靜態成員
語法舉例:
import static java.lang.Math.sin;
import static java.lang.Math.*;
例子:
//導入Math類中的所有static方法和屬性。
//這樣我們在使用這些方法和屬性時就不必寫類名。
import static java.lang.Math.*;//import static java.lang.Math;//這樣寫報錯
public class StaticImport {
public static void main(String[] args) {
// System.out.println(Math.max(3, 5));//沒有使用靜態導入
// System.out.println(Math.abs(1-9));//沒有使用靜態導入
System.out.println(max(3, 5));
System.out.println(abs(1-9));
}
注意:1默認包無法用靜態導入。
2如果導入的類中有重復的方法和屬性則需要寫出類名,否則編譯時無法通過。
}
2013年5月14日
#
概述:
在設計開發過程中經常會出現開發庫與測試庫不一致,測試庫與生產庫不一致,每次手工比對是個辛苦的活。
以前用java寫過一個數據庫結構比較工具,最近騰出功夫來學習了一下python,用python重寫了一下,已經提交到了github和sourceforage.
版本控制使用github
https://github.com/zhengys/dbcompare.gitsourceforage上邊放了exe文件(用pyinstaller打包的程序發現在部分win7上不能正常工作,
又用py2exe打包了一個64位版本的,已經上傳sourceforage , 感謝itshu的反饋)http://sourceforge.net/projects/databasecompare/files/通過這個工具可以做到簡單明了的看出區別。
對于數據庫和設計文檔不一致的情況,目前只能是先根據文檔生成數據庫,再和原來的庫做比對。未來考慮增加powerdesinger和數據庫的間直接比較。
目前只支持oracle,mysql,sqlserver,要是用的人多了再增加其它類型的數據庫。
使用:
功能類似文本比較工具,分別輸入數據庫連接信息,在結果頁面顯示比對結果。
操作很簡單看圖就知道怎么用了。
如圖:

打包說明
一開始用py2exe打包,發現在winxp下用不了
改用pyinstaller打包,360會誤認為是木馬攔截,文件夾形式打包,比較占地方,壓縮后也得36MB.
可根據源碼自行打包。
2013年3月1日
#
首先解釋一下為什么它被稱之為SOCKS。其實該協議設計之初是為了讓有權限的用戶可以穿過過防火墻的限制,使得高權限用戶可以訪問一般用戶不能訪問的外部資源。當時設計者考慮到幾乎所有使用TCP/IP通信的應用軟件都使用socket(套接字,實際上是一組應用程序接口)完成底層的數據通信。為了方便軟件開發者使用該協議,協議設計者就刻意對應了幾組socket編程最經典的操作,并且將協議定名為SOCKS。
最先被廣泛使用的SOCKS協議是其第四版本,就是SOCKS4。IE和一些其他應用程序直接用“Socks”表示SOCKS4協議。該版本支持TCP的connect(作為客戶端連接)和listen(打開一個監聽端口),不支持UDP協議。SOCKS4A對SOCKS4作了一點增強,即允許客戶端將域名發送給SOCKS服務器,讓SOCKS服務器進行域名解析。
SOCKS5是第五版,相對第四版作了大幅度的增強。首先,它增加了對UDP協議的支持;其次,它可以支持多種用戶身份驗證方式和通信加密方式;最后,修改了SOCKS服務器進行域名解析的方法,使其更加優雅。經過這次脫胎換骨的升級,SOCKS5于1996年被IETF確認為標準通信協議,RFC編號為1928。經過10余年的時間,大量的網絡應用程序都支持SOCKS5代理。
SOCKS5雖然可以支持多種用戶身份驗證方式,但是應用程序真正實現的一般也只有兩種:不驗證和用戶名密碼驗證。所以大多數應用程序SOCKS5代理設置也只有用戶名/密碼這一種可選驗證方法。另外,盡管從SOCKS4開始,就支持打開TCP監聽端口,但是直到SOCKS5,也只允許這個端口接收一個客戶端連接。因此網絡服務提供者(如http服務器)不能使用SOCKS。實際上,很多SOCKS服務器的實現也不支持打開TCP監聽端口。
由于SOCKS5實際上仍然對應了socket的經典操作,所以有人利用這一點編寫了一種通用軟件,可以讓不支持SOCKS5協議的應用軟件也能通過SOCKS5服務器進行網絡通信,而應用軟件則對此一無所知。這類軟件最著名的莫過于SocksCap32了,它是Permeo公司(其前身是NEC北美公司的一個部門,而SOCKS最初就是NEC北美公司的工程師開發并維護的)早期推出的一款產品。用戶可以免費使用其試用版。試用版和正式版相比,沒有功能上的限制,只有使用時間的限制。但是到目前為止,Permeo總是會在老版本到期之前推出一個延后了期限的“新”版本,所以用戶實際上可以免費使用。SocksCap32是利用API鉤子,截獲應用軟件對socket函數的調用來實現對SOCKS5客戶端的模擬。盡管SocksCap32很有名,但是由于推出的時間較早,對很多現代應用軟件時常表現的力不從心,所以Permeo又提供了Permeo
Security
Driver(以下稱為PSD)。這款產品使用了驅動技術從底層直接截獲應用軟件的socket通信,因此幾乎可以為所有應用軟件提供SOCKS5客戶端的支持。PSD不提供試用版,但是可以找到其早期版本的注冊碼。
雖然說設計SOCKS協議的初衷是在保證網絡隔離的情況下,提高部分人員的網絡訪問權限,但是國內似乎很少有組織機構這樣使用。一般情況下,大家都會使用更新的網絡安全技術來達到相同的目的。但是由于SocksCap32和PSD這類軟件,人們找到了SOCKS協議新的用途——突破網絡通信限制,這和該協議的初衷實際上正好相反。比如某些網游的部分服務器設置為只接收部分地區的IP地址的連接。為了突破這種限制,可以找一個該地區的SOCKS5代理服務器,然后用PSD接管網游客戶端,通過SOCKS5代理服務器連接游戲服務器。這樣游戲服務器就會認為該客戶端位于本地區,從而允許進行游戲。還有一種情況是:防火墻僅允許部分端口(如http的80端口)通信,那么可以利用SOCKS5協議和一個打開80端口監聽的SOCKS5服務器連接,從而可以連接公網上其他端口的服務器。利用一些額外的技術手段,甚至可以騙過內部的http代理服務器,這時在使用內網http代理上網的環境下也可以不受限制的使用網絡服務,這稱之為SOCKS
over HTTP。通通通([url]www.tongtongtong.com[/url])是老牌SOCKS over
HTTP代理提供商,實現了所有的SOCKS5的連接功能,且有多組國內外服務器。信天游([url]www.xtyproxy.com[/url]),則是最近剛剛出現的代理服務提供商,功能和通通通相比還有差距,但是目前完全免費。當然,使用代理服務器后,將不可避免的出現通信延遲,所以應該盡量選擇同網絡(指網通/
電信),距離近的服務器。
sock5代理的工作程序是:
1.需要向代理方服務器發出請求信息。
2.代理方應答
3.需要代理方接到應答后發送向代理方發送目的ip和端口
4.代理方與目的連接
5.代理方將需要代理方發出的信息傳到目的方,將目的方發出的信息傳到需要代理方。代理完成。
由于網上的信息傳輸都是運用tcp或udp進行的,所以使用socks5代理可以辦到網上所能辦到的一切,而且不輿目的方會查到你的ip,既安全又方
便
sock5支持UDP和TCP,但兩種代理是有區別的,以下分類說明
如何用代理TCP協議
1.向服務器的1080端口建立tcp連接。
2.向服務器發送
05 01 00 (此為16進制碼,以下同)
3.如果接到 05 00 則是可以代理
4.發送 05 01 00 01 + 目的地址(4字節) +
目的端口(2字節),目的地址和端口都是16進制碼(不是字符串!!)。 例202.103.190.27 -7201 則發送的信息為:05 01 00 01 CA
67 BE 1B 1C 21 (CA=202 67=103 BE=190 1B=27
1C21=7201)
5.接受服務器返回的自身地址和端口,連接完成
6.以后操作和直接與目的方進行TCP連接相同。
如何用代理UDP連接
1.向服務器的1080端口建立udp連接
2.向服務器發送
05 01 00
3.如果接到 05 00 則是可以代理
4.發送 05 03 00 01 00 00 00 00 +
本地UDP端口(2字節)
5.服務器返回 05 00 00 01 +服務器地址+端口
6.需要申請方發送 00 00 00 01
+目的地址IP(4字節)+目的端口 +所要發送的信息
7.當有數據報返回時 向需要代理方發出00 00 00 01 +來源地址IP(4字節)+來源端口
+接受的信息
注:此為不需要密碼的代理協議,只是socks5的一部分,完整協議請RFC1928
2012年11月29日
#
在linux下開發,mysql數據庫是經常用到的,對于初學者來說,在linux怎么安裝卸載mysql數據庫,也許可能比較痛苦,這里簡單介紹下,怎么卸載msql數據庫。
a)查看系統中是否以rpm包安裝的mysql
- [root@linux ~]# rpm -qa | grep -i mysql
- MySQL-server-5.1.49-1.glibc23
- MySQL-client-5.1.49-1.glibc23
[root@linux ~]# rpm -qa | grep -i mysql
MySQL-server-5.1.49-1.glibc23
MySQL-client-5.1.49-1.glibc23
卸載MySQL-server-5.1.49-1.glibc23和MySQL-client-5.1.49-1.glibc23
- [root@linux ~]# rpm -e MySQL-client-5.1.49-1.glibc23
- [root@linux ~]# rpm -e MySQL-server-5.1.49-1.glibc23
[root@linux ~]# rpm -e MySQL-client-5.1.49-1.glibc23
[root@linux ~]# rpm -e MySQL-server-5.1.49-1.glibc23
b)查看有沒有mysql服務
- [root@linux ~]# chkconfig --list | grep -i mysql
- mysql 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@linux ~]# chkconfig --list | grep -i mysql
mysql 0:off 1:off 2:on 3:on 4:on 5:on 6:off
刪除mysql服務
- [root@linux ~]# chkconfig --del mysql
[root@linux ~]# chkconfig --del mysql
c)刪除分散mysql文件夾
- [root@linux ~]# whereis mysql
- mysql: /usr/lib/mysql /usr/share/mysql
[root@linux ~]# whereis mysql
mysql: /usr/lib/mysql /usr/share/mysql
分別刪除
- [root@linux lib]# rm -rf /usr/lib/mysql/
- [root@linux lib]# rm -rf /usr/share/mysql
[root@linux lib]# rm -rf /usr/lib/mysql/
[root@linux lib]# rm -rf /usr/share/mysql
通過以上幾步,mysql應該已經完全卸載干凈了
原文地址:
http://blog.csdn.net/love__coder/article/details/6894566
一、 解析Linux應用軟件安裝包:
通常Linux應用軟件的安裝包有三種:
1) tar包,如software-1.2.3-1.tar.gz。它是使用UNIX系統的打包工具tar打包的。
2) rpm包,如software-1.2.3-1.i386.rpm。它是Redhat Linux提供的一種包封裝格式。
3) dpkg包,如software-1.2.3-1.deb。它是Debain Linux提供的一種包封裝格式。
而且,大多數Linux應用軟件包的命名也有一定的規律,它遵循:
名稱-版本-修正版-類型
例如:
1) software-1.2.3-1.tar.gz 意味著:
軟件名稱:software
版本號:1.2.3
修正版本:1
類型:tar.gz,說明是一個tar包。
2) sfotware-1.2.3-1.i386.rpm
軟件名稱:software
版本號:1.2.3
修正版本:1
可用平臺:i386,適用于Intel 80x86平臺。
類型:rpm,說明是一個rpm包。
注:由于rpm格式的通常是已編譯的程序,所以需指明平臺。在后面會詳細說明。
而software-1.2.3-1.deb就不用再說了吧!大家自己練習一下。
二、 了解包里的內容:
一個Linux應用程序的軟件包中可以包含兩種不同的內容:
1) 一種就是可執行文件,也就是解開包后就可以直接運行的。在Windows中所 有的軟件包都是這種類型。安裝完這個程序后,你就可以使用,但你看不到源程序。而且下載時要注意這個軟件是否是你所使用的平臺,否則將無法正常安裝。
2) 另一種則是源程序,也就解開包后,你還需要使用編譯器將其編譯成為可執行文件。這在Windows系統中是幾乎沒有的,因為Windows的思想是不開放源程序的。
通常,用tar打包的,都是源程序;而用rpm、dpkg打包的則常是可執行程序。一般來說,自己動手編譯源程序能夠更具靈活性,但也容易遇到各種問題和困難。而相對來說,下載那些可執行程序包,反而是更容易完成軟件的安裝,當然那樣靈活性就差多了。所以一般一個軟件總會提供多種打包格式的安裝程序的。你可以根據自己的情況來選擇。
三、 搞定使用tar打包的應用軟件
1. 安裝:
整個安裝過程可以分為以下幾步:
1) 取得應用軟件:通過下載、購買光盤的方法獲得;
2)解壓縮文件:一般tar包,都會再做一次壓縮,如gzip、bz2等,所以你需要先解壓。如果是最常見的gz格式,則可以執行:“tar –xvzf 軟件包名”,就可以一步完成解壓與解包工作。如果不是,則先用解壓軟件,再執行“tar –xvf 解壓后的tar包”進行解包;
3) 閱讀附帶的INSTALL文件、README文件;
4) 執行“./configure”命令為編譯做好準備;
5) 執行“make”命令進行軟件編譯;
6) 執行“make install”完成安裝;
7) 執行“make clean”刪除安裝時產生的臨時文件。
好了,到此大功告成。我們就可以運行應用程序了。但這時,有的讀者就會問,我怎么執行呢?這也是一個Linux特色的問題。其實,一般來說, Linux的應用軟件的可執行文件會存放在/usr/local/bin目錄下!不過這并不是“放四海皆準”的真理,最可靠的還是看這個軟件的 INSTALL和README文件,一般都會有說明。
2. 卸載:
通常軟件的開發者很少考慮到如何卸載自己的軟件,而tar又僅是完成打包的工作,所以并沒有提供良好的卸載方法。
那么是不是說就不能夠卸載呢!其實也不是,有兩個軟件能夠解決這個問題,那就是Kinstall和Kife,它們是tar包安裝、卸載的黃金搭檔。它們的使用方法,筆者會另行文介紹。在此就不加贅述了。
四、 搞定使用rpm打包的應用軟件
rpm可謂是Redhat公司的一大貢獻,它使Linux的軟件安裝工作變得更加簡單容易。
1. 安裝:
我只需簡單的一句話,就可以說完。執行:
rpm –ivh rpm軟件包名
更高級的,請見下表:
rpm參數 參數說明
-i 安裝軟件
-t 測試安裝,不是真的安裝
-p 顯示安裝進度
-f 忽略任何錯誤
-U 升級安裝
-v 檢測套件是否正確安裝
這些參數可以同時采用。更多的內容可以參考RPM的命令幫助。
2. 卸載:
我同樣只需簡單的一句話,就可以說完。執行:
rpm –e 軟件名
不過要注意的是,后面使用的是軟件名,而不是軟件包名。例如,要安裝software-1.2.3-1.i386.rpm這個包時,應執行:
rpm –ivh software-1.2.3-1.i386.rpm
而當卸載時,則應執行:
rpm –e software。
另外,在Linux中還提供了象GnoRPM、kpackage等圖形化的RPM工具,使得整個過程會更加簡單。這些軟件的具體應用,筆者會另行文介紹。
五、 搞定使用deb打包的應用程序
這是Debian Linux提供的一個包管理器,它與RPM十分類似。但由于RPM出現得更早,所以在各種版本的Linux都常見到。而debian的包管理器dpkg則只出現在Debina Linux中,其它Linux版本一般都沒有。我們在此就簡單地說明一下:
1. 安裝
dpkg –i deb軟件包名
如:dpkg –i software-1.2.3-1.deb
2. 卸載
dpkg –e 軟件名
如:dpkg –e software