2013年10月29日 星期二

Web Services 觀念


Web Services的起源
Web應用的巨大成功和不斷發展,使其滲透到商業領域和個人生活的各個方面。人們只要使用瀏覽器,就可以享受到各種各樣的Web服務,例如網上購物,網上交易,網 ​​絡遊戲,預定車票,網上聊天和交友等等。與此同時,由於Web技術所帶來的優勢(統一的客戶端和較好的維護性),使一些傳統的應用紛紛轉型到BS結構上。
然而,在發展中,逐步暴露了一些問題。所有這些Web頁面都是為人準備的,是讓人去閱讀,去輸入,去判斷。因此各 ​​種反映視覺效果的內容佔用了大量的網絡帶寬,例如各種圖片,字體信息,文字排版樣式等。而真正含有高價值的一些信息,被深深埋在這些顯示信息中,很難被其他應用和程序所使用。更重要的是,各種web服務之間缺少交互和通訊的機制。
程序之間的互相通訊很重要嗎?簡單舉一個例子。
假設你經常去國外出差,在你回國以後,第一件事就是費用報銷了。而你們公司有這樣的財務規定,所有的報銷款,都按報銷當天的外匯比價進行結算。因此在你填寫報銷單的時候必須先填寫每一筆在各個國家的花消,然後上網查出當天的外匯比價,填寫到報銷單上。剩下的事情也許不用你做了,你的報銷單填寫工具會自動進行換算和統計。
覺得有什麼不妥嗎?作為IT公司的員工,也許都有一個特點,計算機能做的事情,盡量要計算機去做。外匯比價的查詢可以讓計算機自動去做嘛!然而,讓你的程序自動去網頁上查找指定的外匯比價可不是一件容易的事。因為這些網頁是給人閱讀的, ​​人眼和大腦的反應速度有多快,它們可以從一整頁信息中快速定位到你所要的內容,而且無論網頁怎樣變化和改版都不會帶來太大的影響。而應用程序想要做同樣的事就差得太遠了。因此,現在需要的是專門為應用程序制定的Web服務。
隨著應用程序之間通訊的需求越來越大,這就需要製定統一的標準和協議。HP公司是最先提出這個觀點的公司,他們制定了有關 e-Speak”的標準來保證應用程序之間的交互,並聲稱將成為下一代Internet信息交互的標準。而隨後,MicroSoft意識到此計劃的美好前景,便推出了.Net戰略;IBM很快就發布了Web Services Toolkit(WSTK),和Web Services Development Environment(WSDE),申明對Web Services的全力支持。與此同時,Oracle也開發出自己的Dynamic Services,並和Oracle 8i Release 2集成在一起。在這以後,W3C統一制定了Web Services的各種標準。而SUN公司在宣布了自己的Web Services的框架以後,將Web Services的標準溶入J2EE的環境,使Web Services有了廣泛支持的基礎和平台。

Web Services的基本原理
Web Services是通過一系列標準和協議來保證程序之間的動態連接。其中最基本的協議包括:SOAP, WSDL, UDDI
·         SOAP: Simple Object Access Protocol”的縮寫,SOAP是消息傳遞的協議,它規定了Web Services之間是怎樣傳遞信息的。簡單的說,SOAP規定了:
1.
傳遞信息的格式為XML。這就使Web Services能夠在任何平台上,用任何語言進行實現。
2.
遠程物件方法調用的格式。規定了怎樣表示被調用對像以及調用的方法名稱和參數類型等。
3.
參數類型和XML格式之間的映射。這是因為,被調用的方法有時候需要傳遞一個複雜的參數,例如,一個Person物件。怎樣用XML來表示一個物件參數,也是SOAP所定義的範圍。
4.
異常處理以及其他的相關信息.
·         WSDL: Web Services Description Language”的縮寫.意如其名,WSDLWeb Services的定義語言。當你實現了某種服務的時候(,股票查詢服務),為了讓別的程序調用,你必須告訴大家你的服務的接口.例如,服務名稱,服務所在的機器名稱,監聽端口號,傳遞參數的類型,個數和順序,返回結果的類型等等.這樣別的應用程序才能調用你的服務。WSDL協議就是規定了有關Web Services描述的標準。
·         UDDI:Universal Description, Discovery, and Integration的縮寫。簡單說,UDDI用於集中存放和查找WSDL描述文件,起著目錄服務器的作用。

2013年10月18日 星期五

一些名詞簡易解釋


SDK(Software Develop Kit,軟件開發工具包):用於幫助開發人員的提高工作效率。各種不同類型的軟件開發,都可以有自己的 SDK。Windows 有 Windows SDK,DirectX 有 DirectX 9 SDK,.NET開發也有 Microsoft .NET Framework SDK。JAVA 開發也不含糊,也有自己的 Java SDK。

Java SDK(JDK):最早叫 Java Software Develop Kit,後來改名為 JDK,即 Java Develop Kit。JDK 作為 Java 開發工具包,主要用於構建在 Java 平台上運行的應用程序、Applet 和組件等。

JRE(Java Runtime Environment,Java 運行環境):也就是 Java 平台。所有的 Java 程序都要在 JRE 下才能運行。JDK 的工具也是 Java 程序,也需要 JRE 才能運行。為了保持 JDK 的獨立性和完整性,在 JDK 的安裝過程中,JRE 也是安裝的一部分。所以,在 JDK 的安裝目錄下有一個名為 jre 的目錄,用於存放 JRE 文件。

JVM(Java Virtual Machine,Java 虛擬機):是 JRE 的一部分。它是一個虛構出來的計算機,是通過在實際的計算機上仿真模擬各種計算機功能來實現的。JVM 有自己完善的硬件架構,如處理器、堆棧、寄存器等,還具有相應的指令系統。Java 語言最重要的特點就是跨平台運行。使用 JVM 就是為了支援與操作系統無關,實現跨平台。

另外還有幾個名詞需要解釋一下:
J2EE – Java 2 Enterprise Edition(企業版)
J2SE – Java 2 Standard Edition(Java2標準版)
J2ME – Java 2 Micro Edition(微型版)

J2EE、J2SE、J2ME 的概念區別
J2EE:Java 2 Enterprise Edition,是 Java 的一種企業版,用於企業級的應用服務開發。
J2SE:Java 2 Etandard Edition,是 Java 的標準版,用於標準的應用開發。
J2ME:Java 2 Micro Edition,是 Java 的微型版,常用於手機上的開發。

J2SE、J2EE、J2ME 是 java 針對不同的的使用來提供不同的服務,也就是提供不同類型的類庫。針對企業網應用的 J2EE(Java 2 Enterprise Edition)、針對普通 PC 應用的 J2SE(Java 2 Standard Edition)和針對嵌入式設備及消費類電器的 J2ME(Java 2 Micro Edition)三個版本,對於初學者,都是從 J2SE 入手的。

2005年6月,JavaOne大會召開,SUN公司公開Java SE 6。此時,Java的各種版本已經更名以取消其中的數字「2」:J2EE更名為Java EE, J2SE更名為Java SE,J2ME更名為Java ME。

2013年9月18日 星期三

Git 簡介、常用指令

Git是用於Linux核心開發的版本控制工具。與CVSSubversion一類的集中式版本控制工具不同,它採用了分布式版本庫的作法,不需要伺服器端軟體,就可以運作版本控制,使得原始碼的發布和交流極其方便。Git的速度很快,這對於諸如Linux kernel這樣的大項目來說自然很重要。Git最為出色的是它的合併追蹤(merge tracing)能力。



常用指令


git clone {account}@{host}:{project}.git

git add
git add .
將資料先暫存到 staging area, add 之後再新增的資料,
於此次 commit 不會含在裡面.
git add filename
git add modify-file
修改過的檔案, 也要 add. (不然 commit 要加上 -a 的參數)
git add -u
只加修改過的檔案, 新增的檔案不加入.
git add -i
進入互動模式
git rm filename
刪除檔案
git mv filename new-filename
修改檔名、搬移目錄
git status
看目前的狀態

git tag
git tag
列出既有 tag
git tag -l "XX.*"
搜尋XX.*

git reset
git reset xxxx --hard
強制恢復到某一版本
git reset --soft HEAD^
執行 git commit,發現訊息寫錯想要修改,可以使用。
       會刪掉 commit,在執行一次 commit 就可。

git branch & git checkout
local 端產生新的 branch
git branch
列出目前有多少 branch
    git branch –r
列出所有 Repository branch
    git branch –a
列出所有 branch
git branch new-branch
產生新的 branch (名稱: new-branch), 若沒有特別指定,
會由目前所在的 branch / master 直接複製一份
git branch new-branch master
master 產生新的 branch(new-branch)
git branch new-branch v1
tag(v1) 產生新的 branch(new-branch)
git branch -d new-branch
刪除 new-branch
git branch -D new-branch
強制刪除 new-branch
git checkout -b new-branch test
產生新的 branch, 並同時切換過去 new-branch

local 端切換 branch
git checkout branch-name
切換到 branch-name
git checkout -b new-branch test
產生新的 branch, 並同時切換過去 new-branch
git checkout filename
還原檔案到 Repository 狀態
git checkout HEAD
將所有檔案都還原到上一版(最後一次 commit 的版本).
(git checkout -f 亦可)
git checkout xxxx
將所有檔案都還原到 xxxx commit 的版本
git checkout -- *
恢復到上一次 Commit 的狀態(*改成檔名, 就可以只恢復那個檔案)

local New Repository
git init
git add .
git commit -m "init"

git remote add origin git@10.1.100.xx:{Repository Name}.git
# Creates a remote named "origin" pointing at your GitHub repository

如何在 remote site 增加/移除一個 branch
    git push origin origin:refs/heads/branch_name
如果 branch_name 不存在的話
git push origin local_branch_name:remote_branch_name
如果 branch 已經在 local 了,只是要推上去
Or
git push origin HEAD
如果 branch 已經在 local 了,只是要推上去
加入branch對應設定
vim .git/config

如何移除 remote site branch
git push origin :heads/branch_name
branch_name 是你想要移除的 remote branch 名稱

移除 remote site branch 描述資料,branch –a 時就不會再列出
git remote prun origin

開始追蹤 remote branch (當你下一次 pull, 你會對那個新的 branch_name sync)
    git checkout --track -b branch_name origin/branch_name

git commit
     git commit -m "註解" -a
     git commit -F commit.txt -a

git pull & push
git push origin master –tags
master 是你想要推上的 branch, --tags 若有 tag 一起推上.
git pull origin master
master 是你想要 sync branch.
git blame
git blame
git blame hello.c

是一個看誰在哪一版修改了什麼的工具。

MongoDB 簡介、常用指令


mongodbC++寫就,其名字來自humongous這個單詞的中間部分,從名字可見其野心所在就是海量資料的處理。關於它的一個最簡潔描述為:scalable, high-performance, open source, schema-free, document-oriented databaseMongoDB的主要目標是在鍵/值存儲方式(提供了高性能和高度伸縮性)以及傳統的RDBMS系統(豐富的功能)架起一座橋樑,集兩者的優勢於一身。



一些概念
一個mongod服務可以有建立多個資料庫,每個資料庫可以有多張表,這裡的表名叫collection,每個collection可以存放多個文檔(document),每個文檔都以BSONbinary json)的形式存放於硬碟中,因此可以存儲比較複雜的資料類型。它是以單文檔為單位存儲的,你可以任意給一個或一批文檔新增或刪除欄位,而不會對其它文檔造成影響,這就是所謂的schema-free,這也是文檔型資料庫最主要的優點。跟一般的key-value資料庫不一樣的是,它的value中存儲了結構資訊,所以你又可以像關係型數據庫那樣對某些域進行讀寫、統計等操作。Mongo最大的特點是他支援的查詢語言非常強大,其語法有點類似於物件導向的查詢語言,幾乎可以實現類似關聯式資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。Mongo還可以解決海量資料的查詢效率,根據官方文檔,當資料量達到50GB以上資料時,Mongo資料庫存取速度是MySQL10 倍以上。

BSON
BSONBinary JSON 的簡稱,是一個JSON文檔物件的二進位編碼格式。BSONJSON一樣支援往其它文檔物件和陣列中再插入文檔物件和陣列,同時擴展了JSON的資料類型。如:BSONDate類型和BinDate類型。
BSON被比作二進位的交換格式,如同Protocol Buffers,但BSON比它更“schema-less”,非常好的靈活性但空間佔用稍微大一點。

BSON有以下三個特點:
1  羽量級
2  跨平臺
3  效率高



shell操作資料庫:

   1.  超級用戶相關:
         1. #進入資料庫admin
use admin
         2. #增加或修改使用者密碼
          db.addUser('name','pwd')
         3. #查看用戶列表
          db.system.users.find()
         4. #用戶認證
          db.auth('name','pwd')
         5. #刪除用戶
          db.removeUser('name')
         6. #查看所有用戶
          show users
         7. #查看所有資料庫
          show dbs
         8. #查看所有的collection
          show collections
         9. #查看各collection的狀態
          db.printCollectionStats()
        10. #查看主從複製狀態
          db.printReplicationInfo()
        11. #修復資料庫
          db.repairDatabase()
        12. #設置記錄profiling0=off 1=slow 2=all
          db.setProfilingLevel(1)
        13. #查看profiling
          show profile
        14. #拷貝資料庫
          db.copyDatabase('mail_addr','mail_addr_tmp')
        15. #刪除collection
          db.mail_addr.drop()
        16. #刪除當前的資料庫
          db.dropDatabase()
       
   2. 增刪改
         1. #存儲嵌套的物件
db.foo.save({'name':'ysz','address':{'city':'beijing','post':100096},'phone':[138,139]})

         2. #存儲陣列物件
db.user_addr.save({'Uid':'yushunzhi@sohu.com','Al':['test-1@sohu.com','test-2@sohu.com']})

         3. #根據query條件修改,如果不存在則插入,允許修改多條記錄
            db.foo.update({'yy':5},{'$set':{'xx':2}},upsert=true,multi=true)
         4. #刪除yy=5的記錄
            db.foo.remove({'yy':5})
         5. #刪除所有的記錄
            db.foo.remove()

   3. 索引
         1. #增加索引:1(ascending),-1(descending)
         2. db.foo.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
         3. #索引子物件
         4. db.user_addr.ensureIndex({'Al.Em': 1})
         5. #查看索引資訊
         6. db.foo.getIndexes()
         7. db.foo.getIndexKeys()
         8. #根據索引名刪除索引
         9. db.user_addr.dropIndex('Al.Em_1')

   4. 查詢
         1. #查找所有
        2. db.foo.find()
        3. #查找一條記錄
        4. db.foo.findOne()
        5. #根據條件檢索10條記錄
        6. db.foo.find({'msg':'Hello 1'}).limit(10)
        7. #sort排序
        8. db.deliver_status.find({'From':'ixigua@sina.com'}).sort({'Dt',-1})
         9. db.deliver_status.find().sort({'Ct':-1}).limit(1)
        10. #count操作
        11. db.user_addr.count()
        12. #distinct操作,查詢指定列,去重複
        13. db.foo.distinct('msg')
        14. #”>=”操作
        15. db.foo.find({"timestamp": {"$gte" : 2}})
        16. #子物件的查找
        17. db.foo.find({'address.city':'beijing'})


mongod.exe -dbpath XX/XXX/XX