2013年5月31日 星期五

學習新知java validate xml API

java validate xml  API 應用來驗證XML  validate,一般來說,如果驗證一份XML文件如果只使用一份Schema時程式碼如下:


DocumentBuilder parser=DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document document = parser.parse(new File("instance.xml"));
SchemaFactory factory=SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaFile = new StreamSource(new File("mySchema.xsd"));
Schema schema = factory.newSchema(schemaFile);
   
Validator validator = schema.newValidator();

try {
        validator.validate(new DOMSource(document));
    } 
catch (SAXException e)
 {
        // instance document is invalid!
}

只需要輸入一份XSD檔即可,但是如果是多份schema來驗證一份XML文件且這些schema都有互相關聯,那麼直接套用API季會有錯誤,匯音樂讀取不到<xs:include> ...等造成驗證錯誤。

到網路上搜尋相關解決方法,發現說原來這個錯誤是一個BUG,根據此篇說法可以增加ResourceResolver的程式碼解決這個BUG。或者匯入第3方Jar檔使用其內部資源來解決問題。

2013年5月29日 星期三

區分常用的Web傳輸

1. TCP連接

手機能夠使用連網功能是因為手機底層實現了TCP/IP協定,使手機終端透過無線網路建立TCP連接。 TCP協定可以對上層網路提供接口,使上層網路數據的傳輸建立在“無差別”的網路之上。
建立起一個TCP連接需要經過"三次握手":
  • 第一次握手:客戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,待伺服器確認後。
  • 第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態。
  • 第三次握手:客戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
握手過程中傳送的包裡不包含數據,三次握手完畢後,客戶端與伺服器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接會一直保持下去。斷開連接時伺服器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過"四次握手"(與連線時雷同,最終是確定斷開)。

2. HTTP連接

HTTP協定,即超文本傳送協定(Hypertext Transfer Protocol ),是Web連網的基礎,也是手機連網常用的協定之一,HTTP協定是建立在TCP協定之上的一種應用。
HTTP連接最顯著的特點是客戶端發送的每次請求都需要伺服器回傳回應,在請求結束後,會主動釋放連接。從建立連接到關閉連接的過程稱為"一次連接"。
  1. 在HTTP 1.0中,客戶端的每次請求都要求建立一次單獨的連接,在處理完本次請求後,就自動釋放連接。
  2. 在HTTP 1.1中則可以在一次連接中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束後再發送下一個請求。
由於HTTP在每次請求結束後都會主動釋放連接,因此HTTP連接是一種"短連接",要保持客戶端的在線狀態,須要不斷地向伺服器發起連接請求。通常的做法是即使不需獲得任何數據,客戶端也保持每隔一段固定的時間向伺服器發送一次“保持連接”的請求,伺服器在收到該請求後對客戶端進行回覆,表明知道客戶端“在線”。若伺服器長時間無法收到客戶端的請求,則認為客戶端"下線",若客戶端長時間無法收到伺服器的回覆,則認為網路已經斷開。

3. Socket原理

3.1 插口(Socket)概念
插口(Socket)是通訊的基礎,是支援TCP/IP協定的網路通信的基本操作單元。它是網路通信過程中端點的抽象表示,包含進行網路通信必須的五種信息:
  1. 連接使用的協定,本地主機的IP地址,本地的協定端口;遠地主機的IP地址,遠地的協定端口。
  2. 應用層透過傳輸層進行數據通信時,TCP會遇到同時為多個應用程式過程提供並發服務的問題。
  3. 多個TCP連接或多個應用程式過程可能需要透過同一個TCP協定端口傳輸數據。
  4. 為了區別不同的應用程式和連接,許多計算機操作系統為應用程式與TCP/IP協定交互提供了套接字(Socket)接口。
  5. 應用層可以和傳輸層透過Socket接口,區分來自不同應用程式或網路連接的通信,實現數據傳輸的並發服務。
3.2 建立Socket連接
建立Socket連接至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket ,另一個運行於伺服器端,稱為ServerSocket 。
套接字之間的連接過程分為三個步驟:伺服器監聽,客戶端請求,連接確認。
  • 伺服器監聽:伺服器器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網路狀態,等待客戶端的連接請求。
  • 客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是伺服器端的套接字。為此,客戶端的套接字必須首先描述它要連接的伺服器的套接字,指出伺服器端套接字的地址和端口號,然後就向伺服器端套接字提出連接請求。
  • 連接確認:當伺服器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就回應客戶端套接字的請求,建立一個新的線程,把伺服器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而伺服器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求。

4. Socket連接與TCP連接

建立Socket連接時,可指定使用的傳輸層協定,Socket可以支援不同的傳輸層協定(TCP或UDP),當使用TCP協定進行連接時,該Socket連接就是一個TCP連接。

5. Socket連接與HTTP連接

  • Socket
由於通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發送數據內容,直到雙方連接斷開。但在實際網路應用中,客戶端到伺服器之間的通信往往需要穿越多個中間節點,例如路由器、網關、防火牆等,大部分防火牆默認會關閉長時間處於非活躍狀態的連接而導致Socket 連接斷連,因此需要經過不斷告訴網路,該連接處於活躍狀態。
  • HTTP
HTTP連接使用是"請求和回應"的方式,不僅在請求時需要先建立連接,而且需要客戶端向伺服器發出請求後,伺服器端才能回傳數據。
  • 總結
很多情況下,需要伺服器端主動向客戶端發送數據,保持客戶端與伺服器數據的實時與同步。此時若雙方建立的是Socket連接,伺服器就可以直接將數據傳送給客戶端;若雙方建立的是HTTP連接,則伺服器需要等到客戶端發送一次請求後才能將數據傳回給客戶端,因此,客戶端定時向伺服器端發送連接請求,不僅可以保持在線,同時也是在"詢問"伺服器是否有新的數據,若有新數據即可傳給客戶端。

參考出處:

2013年5月27日 星期一

電子發票

—現在政府提倡電子發票,解決紙本電子發票收納的困擾,當然最主要是可以帶來減少樹木的砍伐,但現今生活習慣的問題,大多的人還是都拿紙本,所以將電子發票結合了「載具」,希望可以讓電子發票可以更貼近使用者的消費行為,但載具並不是最貼近人們的生活,沒有載具的限制也可以使用一般的「手機條碼」,電子發票提供了生活便利,如:自動對獎、幫你收納發票等等。

載具種類
—7-11的i-Cash
—悠遊卡
—手機號碼條碼(簡稱手機條碼)
—燦坤會員卡
—Happy GO卡
—順發3C會員卡
—全聯福利社會員卡
—中油家族卡

以下網址可以查詢目前還有哪些載具
https://www.einvoice.nat.gov.tw/APMEMBERVAN/Store/Store?CSRT=10024459690924458644

電子發票申請
—https://www.einvoice.nat.gov.tw/APMEMBERVAN/GeneralCarrier/generalCarrier?mp=1

手機條碼操作手冊
https://www.einvoice.nat.gov.tw/wSite/public/Attachment/f1341277754226.pdf

電子發票API
有提供以下的API

查詢中獎發票號碼清單 /PB2CAPIVAN/invapp/InvApp
查詢發票表頭 /PB2CAPIVAN/invapp/InvApp
查詢發票明細 /PB2CAPIVAN/invapp/InvApp
愛心碼查詢 /PB2CAPIVAN/loveCodeapp/qryLoveCode
載具發票表頭查詢 /PB2CAPIVAN/invServ/InvServ
載具發票號碼明細查詢 /PB2CAPIVAN/invServ/InvServ
載具發票捐贈 /PB2CAPIVAN/CarInv/Donate

回傳格式為JSON。

參考網址:
https://www.einvoice.nat.gov.tw/wSite/mp?mp=1


2013年5月25日 星期六

智慧城市-桑坦德

桑坦德位於西班牙北部,利用900萬歐元打造高科技智慧城市研究中心,全城市擁有12000個感應器來實現此計畫,利用GPS定位技術的APP,城市中的每一樣都可能成為城市中行動的感應器。

以下是整理後的智慧城市內容:

1.每一輛公車都會上傳自己的位置訊息、里程數和速度,同時還會上傳當前所處環境的相關數據,比如臭氧和一氧化氮。

2.路上的街燈還可以自動調節自己的亮度,當街上無人行走時,街燈變暗,在月圓之夜,街燈的亮度要低於雨夜的亮度。

3.傳感器還可以幫助優化花園灌溉活動,以達到省水的目的。清潔工們也不需要查看每個垃圾桶,系統會事先提醒哪個垃圾桶需要清空。

4.在公交站等車的人只要打開手機應用,手機便會迅速查找出經過此站台的所有公車線路,同時還會顯示公車的抵達時間

5.遊客們在市中心的景點,可以通過該應用,了解景點造者、建造時間等訊息;該APP還提供即時的超市特價商品訊息。

6.如果共設施出問題需要維修的時候,只需要通過APP,拍一張現場照片就可以了。居民們輕點手機,這一損壞報告便會連帶GPS定位訊息一道上傳給市政府。
(訊息上傳者的個人訊息則受到隱私保護。市民們和當地媒體還可以使用這一應用追蹤修復工作將花費的時間。)

7.停車位尋找,在停車位上都有感知器,可以藉由APP尋找空車位。


下一步,塞爾納市長打算公開更多城市機密。很多曾經保密的數據都將得到公開,包括人口統計數據和房價。接著,他打算推出一款名為“思想匯”的社交應用——有點像“臉書”(Facebook),但是是為當地市民量身定做的——通過這款應用將市民們聯繫起來。“我們希望在市民和政府之間,創造一種全新的、合作的關係。


心得:從桑坦德可以得到未來IOT與OpenData可能應用的場景,提供給學弟們參考。

參考資料:

http://architecture.archina.com/2013/anews_0326/52693.html

http://tw.news.yahoo.com/%E8%A5%BF%E7%8F%AD%E7%89%99%E5%9F%8E%E5%B8%82%E6%A1%91%E5%9D%A6%E5%BE%B7-%E5%85%A8%E6%AD%90%E7%AC%AC-%E6%99%BA%E6%85%A7%E5%9F%8E-030536303.html