我的雲端生活網 - Life+

Tuesday, December 30, 2008

以 Prolog 示範規則推論系統

規則推論系統,須由規則推論引擎、知識庫、以及輸入事實三者構成。推理方法有向前鏈接 (forward chaining) 和向後鏈接 (backward chaining) 方式,分別對應二種不同的需要。向前鏈接是由規則的前提向規則的結論方向串連可用的規則,由原因導出結果。向後鏈接是由規則的結論向規則的前提方向串連可用的規則,由結果導出原因。於是,前者適用於預測和決策,而後者適用於診斷和歸納。
Prolog 是法文 programmation en logique ,即英文 programming in logic 的合併詞,是個以邏輯操作為主的程式語言。 Prolog 的推理方法是向後鏈接,而且,將 Prolog 系統比擬為推論引擎,是使用 Markov 演算法作為規則歸納策略。說「比擬為推論引擎」,指 Prolog 並不是完整的專家系統框架。不過, Prolog 提供了足夠的基礎架構,可能做出小型、甚至大型的規則推論系統。
本篇以一份小、且不完整的規則知識庫,解決學術界一項著名的小問題「猴子取香蕉」 (the monkey and bananas problem) ,作為對於規則推論系統的展示。
問題描述:
在空間中有猴子,和香蕉、梯子、躺椅等物品,散置於各處。猴子窩在躺椅上,香蕉懸在高處,而且躺椅、香蕉和梯子彼此相隔特定距離。猴子必須站在夠高的位置,並靠近夠近的距離,才能取得香蕉。於是,問題是:猴子該如何取得香蕉?
猴子取香蕉的問題在學術界有各面的討論,例如,研究心理與認知的人關心動物如何操作心理的機能以達成學習。我們對於規則推論系統的討論,則關心要解決這件問題,該建立哪些知識,以及該如何使用這些知識來推理。以下是我的程式。須注意這份程式只是示範,並是知識未建置完整。所示範的重點是:可建立足夠的知識以取得解答,以及掌握 Prolog 向後鏈接推理方法的原則撰寫規則。
% The monkey and bananas problem

% Naming principle:
% 1. Adjectives: for checking properties.
% 2. Verbs: for goals with two members, i.e., a subjective and a objective.
% 3. Past Participles: for goals with two members, i.e., two objectives.

% facts
:-
assert(near(monkey, position(3, 4))),
assert(near(bananas, position(5, 2))),
assert(near(ladder, position(1, 1))),
assert(near(couch, position(3, 4))),
assert(on(monkey, couch)),
assert(light(bananas)),
assert(light(ladder)),
assert(high(bananas)).

% backward chaining rules
holds(monkey, W) :-
not(high(W)),
light(W),
made_neared(monkey, W),
format('Monkey holds ~w.~n', W)
;
high(W),
light(W),
made_neared(ladder, W),
not(on(monkey, ladder)),
climbs(monkey, ladder),
holds(monkey, W)
;
high(W),
light(W),
made_neared(ladder, W),
on(monkey, ladder),
holds(monkey, W)
.
made_neared(O1, O2) :-
near(O1, P1),
near(O2, P2),
moves(O1, P2),
format('Now ~w is near ~w at ~w.~n', [O1, O2, P2])
;
near(O1, P),
near(O2, P),
format('~w and ~w are at the same position.~n', [O1, O2])
.
moves(S, P) :-
retractall(near(S, _)),
assert(near(S, P)),
format('Action performed: moving ~w to ~w.~n', [S, P])
.
climbs(S, O) :-
retractall(high(_)),
assert(on(S, O)),
format('~w climbs on ~w.~n', [S, O])
.
Prolog 的基本符號有:小寫開頭符號為詞彙 (term),大寫開頭符號為變數,帶有參數的詞彙為描述詞 (predicate)。 ":-" 是規則的中介符號,其左邊項是規則的結論,右邊項是規則的前提。句點是一則完整描述的結尾,逗點是 and 連接詞,分號是 or 連接詞。一則完整描述若只帶有左邊項(沒有右邊項和 ":-" 符號),是單元詞彙,代表既存在的事實。一則完整描述若只有右邊項和 ":-" 符號,代表一則查詢。以上程式撰寫了事實與規則。程式的啟動狀態為:
near(monkey, position(3, 4))
near(bananas, position(5, 2))
near(ladder, position(1, 1))
near(couch, position(3, 4))
on(monkey, couch)
light(bananas)
light(ladder)
high(bananas)
以上描述詞彙,使用 assert 描述詞和逗號組合成查詢句型,使程式被載入時能動態地建立這些詞彙。( Prolog 中,只有動態建立的描述詞才能被動態地刪除。)這些詞彙稱為事實,構成推論系統的工作空間及狀態。
規則的組成結構,以第一條規則為例,是:
holds(monkey, W) :-
not(high(W)),
light(W),
made_neared(monkey, W),
format('Monkey holds ~w.~n', W).
要找到一項目標 holds(monkey, W) ,「要猴子抓住某物品W」,附帶若干條件例如「物品W位置不高」、「物品W很輕」,則必須找到一項前置目標 made_neared(monkey, W) ,「要讓猴子與物品W是位置接近的」。最後一項 format('Monkey holds ~w.~n', W) 是將物品W放進字串 "Monkey holds ~w.~n" 的 ~w 位置,作為結果輸出。最後一項輸出存在的意義是,引用的這一項規則之後,狀態為「猴子抓住了香蕉」。其他規則比照於此,都包含了一項目標 (goal)、必要的前置目標 (subgoal)、相關的條件、以及引用規則之後的狀態。將程式存檔為 .pl 副檔名,用 Prolog 載入這份程式,並輸入查詢:
?- holds(monkey, bananas).
以上查詢是問「猴子抓住香蕉,怎麼做?」結果輸出為:
Action performed: to move ladder to position(5, 2).
Now ladder is near bananas at position(5, 2).
monkey climbs on ladder.
Action performed: to move monkey to position(5, 2).
Now monkey is near bananas at position(5, 2).
Monkey holds bananas.
true
換個查詢:
?- holds(monkey, ladder).
「猴子怎麼取梯子?」結果輸出為:
Action performed: to move monkey to position(1, 1).
Now monkey is near ladder at position(1, 1).
Monkey holds ladder.
true
以上例子要展示,對於一些有多個解決方向的問題,也許不適合直接寫一條演算法,或者不適合強制決定一項結果。而使用了規則推論系統,只要寫了適合的規則知識,就能夠取得可接受的答案。雖然答案的正確程度取決於規則的正確程度,不過,此系統的優勢是對於取得解答的要求與限制是寬鬆的、軟性的。
備註: Prolog 的規則格式,左邊項幾乎只能有一項描述詞,而缺乏 and 或 or 連接詞的寫法。因應於此限制,規則的四項構成物件:目標、前置目標、相關條件、以及引用規則的描述,只有目標寫在左邊項。其他使用向前鏈接推理的系統,例如 OPS ,規則格式寫成 "if ... then ..." 格式,能夠容許左邊項和右邊項都有 and 或 or 連接詞的寫法,則是在左邊項寫了前置目標和相關條件,並在右邊項則寫了目標和引用描述。

Monday, December 29, 2008

推論引擎

最近在閱讀有關規則推論引擎 (rule-based inference engine) 的書和資料。這方面的研究知識早在九零年代結束之前就成熟了,但在國內技術應用看起來像是冷門技術項目。有人說專家系統是沒落的東西。然而,放眼看過去技術應用趨勢,八零年代時 LISP 的使用也相當熱門,九零年代初期 Prolog 已取得成功應用,而專家系統 (expert system) 的規則推論引擎和框架系統 (frame-based system) 是二項成功產物。資訊領域並不是只有命令式程式 (imperative programming) 計算模型,並不是要會寫 C 或 Java ,或者要會雕刻組合語言,才佔領全局。還有其他的聰明、高產能的選項可挑選!
推論引擎的產生,來自於解決問題的需要 --- 許多問題並不只是寫一則演算法就能解決。有些問題的思考空間太龐大,而且對於那些問題,經常只有一部分的解題規則,這些規則可能來自於專家的知識或經驗。於是生成系統 (Production System) 出現,後來此系統類型稱為專家系統。規則式生成系統的構成,有一組以具體表達的規則所組成的知識庫、知識輸入介面、推論引擎、以及工作空間。系統接受一些事實作為輸入,由推論引擎將輸入事實與知識庫中的解題規則互相比對,藉由邏輯的歸納推理產生解決方案。此系統的好處是,答案是由專家知識所導出,而且導出答案的那些規則可以直接作為解釋。缺點是,系統所容納的知識庫不能太大,若規則太多則耗費計算時間,以及知識規則的建置花費工夫。
推論引擎的效能問題,在於輸入的事實與知識庫的規則比對所消耗的時間。 Markov 演算法提出順序式的比對,帶來直接的毛病是:有多少規則,就要比對多少時間以上。而且,規則的比對經常花費 O(n2) 級的成本,因為推論引擎必須做到衝突決議 (conflict-resolution) 的處理程序,意即經過眾多層次不同且可能有彼此矛盾的規則,綜合評判之後,取得一致的正確結果。為了適應規則推論引擎的特殊計算環境, Rete 演算法提出以網狀資料結構 (rete 是拉丁文,意思是 net ) 處理衝突決議。推論引擎總是進行循環工作,進行步驟有:1. 接受輸入事實並啟動; 2. 比對規則; 3. 衝突決議:若沒有比對到任何規則,則關閉,否則由比對到的規則中挑選一條規則,認定為生效; 4. 將生效的規則啟動,改變工作空間的狀態; 5. 回到步驟 (2) 。
推論引擎雖然不好寫,卻也可以用組合語言或 C 撰寫。 2003 年, Lynwood Wilson 在 Dr. Dobb's 雜誌發表的文章 ”Rule-Based Programming in C” 示範了二項注意事項: 1. 要做衝突決議; 2. 將專家系統劃分為模組使計算時間減少。因為是簡單的示範,他使用 Markov 演算法比對規則。
參考文獻
1. Joseph C. Giarratano & Gary D. Riley. Expert Systems: Principles and Programming. (4 ed.) Course Technology, Thomson Learning, 2005.
2. Charles L. Forgy. Rete: a fast match algorithm. AI Expert, vol. 2, issue 1, 1987.
3. Lynwood Wilson. Rule-Based Programming in C. Dr. Dobb's Portal. Available online: http://www.ddj.com/184405245.

Saturday, December 20, 2008

可以在ORACLE使用PL/SQL發送MSN訊息?

<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



我好久沒碰RDBMS了,主要是因為我覺得殺雞焉用牛刀?這幾年我都使用檔案系統來處理資料,不過在此之前;我幾乎摸過了市面上各式各樣的RDBMS,當然也包括ORACLE,以前我們常使用ORACLE的trigger 或是store procedure 來處理一些事務,所以;我還沒忘記,ORACLE 內有一個很好用的利器UTL_HTTP Package,這裡有一個範例:
http://www.oracle.com/technology/sample_code/tech/pl_sql/htdocs/x/Utl_Http_Package_Enhancements/Cr_Using_Utl_Http.htm
事實上只要利用這個Package,我們就能直接使用triger配合 URL_HTTP 直接線上呼叫msnSDK 發送msn訊息,這個連結也一併給您參考 http://rd-program.blogspot.com/2008/12/msn_18.html 您可以參考這個簡易的範例知道怎麼透過http protocol發送msn訊息

抱歉!我因為太久沒直接碰oracle,手邊也沒有伺服器可用,所以沒辦法直接給出範例,不過我相信過這個描述你們自己一定做的出這個範例,如果有人做出範例;願意讓我知道的話在麻煩您給我一個連結,我會請其他有興趣的人直接去讀您的大作囉...

當然;我同時也相信oracle 現在應該已經有soap 這類的package,因為;我在使用oracle的那段時光,soap尚未成為標準,所以沒有接觸過,否則;有能直接使用這類的package操作msnSDK,不只ORACLE,MSSQL也能透過呼叫外部的ACTIVEX 來做同樣的事...

Wednesday, December 17, 2008

如何直接使用瀏覽器發送MSN訊息

<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



使用瀏覽器就能對MSN發送訊息

使用程式運用msnSDK傳遞MSN訊息真的很簡單,這個例子我們直接使用瀏覽器來發送MSN訊息,現在要找到一種語言不支援這些介面還真不容易(msnSDK支援ADO/CGI/SOAP 三種介面)

--------------
STEP 1:
首先要使用msnSDK 發送訊息,必須取得使用SDK權限
---------------------------------------------------------------
http://59.120.234.84:8082/msnSDK/msn_cgi-win32?FUNC=GETSPID&USERID=apiblogt7&PASSWD=msnsdkt

瀏覽器得到回應(SPID 是一個隨機碼)
1\tSPID
或是
0\t失敗原因

比如: (請注意! 5M9AzR700NWZbbAf 會一直變動,而一旦通過認證這個SPID 可使用6個小時不需重複取用SPID,過期再取即可)

1 5M9AzR700NWZbbAf

--------------
STEP 2:
邀請聯絡人,我想大家都知道,要透過MSN發送訊息,得要對方是我們自己的聯絡人,要特別注意的是XXXXXXXX@hotmail.com得要是真正的MSN地址,因為發送MSN訊息時,得要對方再線上(範例是這樣使用,不過;msnSDK本身可以自動判斷對方是否再線上決定是否發送離線訊息...這需要參考文件,可自行下載文件)
---------------------------------------------------------------
http://59.120.234.84:8082/msnSDK/msn_cgi-win32?FUNC=REGISTER&UIDS=XXXXXXXX@hotmail.com&SESSION=5M9AzR700NWZbbAf

瀏覽器得到回應
1\t成功訊息
或是
0\t失敗原因

<<此時註冊為機器人聯絡人的帳號會在msn 上收到邀請成為聯絡人,選擇受邀請為聯絡人後>>
--------------
STEP 3:
發送訊息給XXXXXXXX@hotmail.com (這必須要是真的MSN帳號,且這個帳號必須在線上,如需傳遞離線訊息...請參考文件)
---------------------------------------------------------------
http://59.120.234.84:8082/msnSDK/msn_cgi-win32?UIDS=XXXXXXXX@hotmail.com&MSG=測試&flags=0&FUNC=SENDMSG&ENCODING=BIG5&SESSION=5M9AzR700NWZbbAf

瀏覽器得到回應
1\t成功訊息
或是
0\t失敗原因

--------------
其他功能可自行下載文件參考,msnSDK 同時支援YAHOO及MSN 的訊息傳遞(傳送與接收),且線上使用免費;歡迎所有有興趣的人直接在網路上應用它,如欲合作,可將合作提案寄到sonet.all@gmail.com

Monday, December 8, 2008

半分鐘搞定msn機器人互動式選單

msnSDK訊息控制開發套件,可支援訊息雙向傳遞;如您非程式開發人員,卻又有訊息雙向傳遞的需求,即可採用如下的作法,輕鬆達成簡易的需求。

Step1:安裝msnSDK訊息控制開發套件後,您可先至目錄msdSDKMenu。
開啟help.lst




PS,上述項目為既有範例,使用者可依據需求進行編輯。
開啟MSN,與MSN機器人的對話中,鍵入『?』或『#help』並Enter,出現如下的對話訊息。



Step2:於主選單增加一筆對話資訊
編輯help.lst,並存檔



與MSN機器人的對話中,再度鍵入『?』或『#help』並Enter。




Step3:編輯互動內容
至目錄msdSDKMenu下新增一目錄,目錄名稱需對應先前於主選單help所增加的指令字串,本例為『#mp』;建議直接複製預設的目錄如『#showndown』(此目錄內的其他檔案需一併複製),完成後將之更名即可。



可編輯目錄下的help.lst



編輯action.lst以呈現互動的結果



與MSN機器人的對話中,『#mp』並Enter。



如msn出現的說明,鍵入任意文字即出現回應訊息。



上述步驟即為簡易的訊息雙向傳遞,

此方法也支援直接直接取用url 資源

http://url....?msn=$msn_passport$&參數=$ARGVS[0]$


如配合原先企業或單位內已撰寫好的網頁或資料庫,不僅可成為單位內重要的訊息查閱管道更是KM整合的一大利器,而衍伸用法可達成不同以往的『單一簽入』型態及解決方案。

Wednesday, December 3, 2008

MSNC:File transfer 拒絕檔案傳送的程序

讀了相關資訊也從google 找資料,但是對 MSNSLP(P2P protocol)的描述多半語焉不詳,尤其是File Transfer,或許是自己的理解能力不好,只得自己SNIFFER,以下是整個拒絕檔案傳送的過程,試了一下;已正常可運行,我順便參考查看了某個msn的函式,發現他的做法不對;反而會造成client 不斷的請求(INVITE)

ps.以下相關msn帳號為測試帳號,並不會用來接收資訊

====Recv====
MSG xue.luke@hotmail.com ?? 1344\r\n
MIME-Version: 1.0\r\n
Content-Type: application/x-msnmsgrp2p\r\n
P2P-Dest: luke0@livemail.tw\r\n
\r\n
(00-00-00-00) (EF-64-8B-13) (00-00-00-00-00-00-00-00)
(2C-05-00-00-00-00-00-00) (B2-04-00-00) (00-00-00-00)
(3C-75-7B-23) (00-00-00-00) (00-00-00-00-00-00-00-00)
INVITE MSNMSGR:luke0@livemail.tw MSNSLP/1.0\r\n
To: \r\n
From: \r\n
Via: MSNSLP/1.0/TLP ;branch={9D589759-6F32-4136-BE3C-6CA353A20907}\r\n
CSeq: 0 \r\n
Call-ID: {8673FEF1-6E96-449D-AF21-8AD10E58630C}\r\n
Max-Forwards: 0\r\n
Content-Type: application/x-msnmsgr-sessionreqbody\r\n
Content-Length: 989\r\n
\r\n
EUF-GUID: {5D3E02AB-6190-11D3-BBBB-00C04F795683}\r\n
SessionID: 662509335\r\n
SChannelState: 0\r\n
Capabilities-Flags: 1\r\n
AppID: 2\r\n
Context: fgIAAAMAAAACAAAAAAAAAAEAAABiAGkAbgBhAHIAeQBfAGIAdQBpAGwAZABfADEALgAwAC4AMwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\� � Hide� Hide� 512� Recvb� AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
(00-00-00-00)

====Recv====
MSG xue.luke@hotmail.com ?? 264\r\n
MIME-Version: 1.0\r\n
Content-Type: application/x-msnmsgrp2p\r\n
P2P-Dest: luke0@livemail.tw\r\n
\r\n
(00-00-00-00) (EF-64-8B-13) (B2-04-00-00-00-00-00-00)
(2C-05-00-00-00-00-00-00) (7A-00-00-00) (00-00-00-00)
(3C-75-7B-23) (00-00-00-00) (00-00-00-00-00-00-00-00)
AAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\r\n\r\n
00 (00-00-00-00)


====Send====
MSG 81 D 145\r\n
MIME-Version: 1.0\r\n
Content-Type: application/x-msnmsgrp2p\r\n
P2P-Dest: xue.luke@hotmail.com\r\n
\r\n
(00-00-00-00) (5A-C9-9C-1E) (00-00-00-00-00-00-00-00)
(00-00-00-00-00-00-00-00) (00-00-00-00) (02-00-00-00)
(EF-64-8B-13) (3C-75-7B-23) (2C-05-00-00-00-00-00-00)
(00-00-00-00)


====Recv====
ACK 81\r\n

====Send====
MSG 82 D 524\r\n
MIME-Version: 1.0\r\n
Content-Type: application/x-msnmsgrp2p\r\n
P2P-Dest: xue.luke@hotmail.com\r\n
\r\n
(00-00-00-00) (5B-C9-9C-1E) (00-00-00-00-00-00-00-00)
(7B-01-00-00-00-00-00-00) (7B-01-00-00) (00-00-00-00)
(47-A4-7E-27) (00-00-00-00) (00-00-00-00-00-00-00-00)
MSNSLP/1.0 603 Decline\r\n
To: \r\n
From: \r\n
Via: MSNSLP/1.0/TLP ;branch={9D589759-6F32-4136-BE3C-6CA353A20907}\r\n
CSeq: 1 \r\n
Call-ID: {8673FEF1-6E96-449D-AF21-8AD10E58630C}\r\n
Max-Forwards: 0\r\n
Content-Type: application/x-msnmsgr-sessionreqbody\r\n
Content-Length: 66\r\n
\r\n
SessionID: 662509335\r\n
SChannelState: 0\r\n
Capabilities-Flags: 1\r\n\r\n
00 (00-00-00-00)


====Recv====
ACK 82\r\n

====Recv====
MSG xue.luke@hotmail.com ?? 142\r\n
MIME-Version: 1.0\r\n
Content-Type: application/x-msnmsgrp2p\r\n
P2P-Dest: luke0@livemail.tw\r\n

(00-00-00-00) (F0-64-8B-13) (00-00-00-00-00-00-00-00)
(00-00-00-00-00-00-00-00) (00-00-00-00) (02-00-00-00)
(5B-C9-9C-1E) (47-A4-7E-27) (7B-01-00-00-00-00-00-00)
(00-00-00-00)

Tuesday, November 25, 2008

3分鐘學會使用程式發送msn訊息, ASP篇(六)

<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



msnSDK訊息控制開發套件 同時支援MSN/Yahoo即時通 訊息雙向傳遞


ASP 的範例我們使用ADO介面來處理,其他語言也可以這樣做,可參考文件(文末提供下載處),另外;下面的程式碼重要的部份只有參數不同,其他大同小異,可參考紅字部分


ps.也請參考 msnSDK的使用流程

(抱歉!太久沒碰ASP,不過基本上;下面這個範例可正確發送MSN訊息)
<%
'--
'---STEP1 取得API 使用權限
'--

on error resume next
Set xmlHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
'如果遇到中文,請使用Server.URLEncode 來處理
'比如 : ...&pname=Server.URLEncode("中文姓名")&...

URL= "http://59.120.234.84:8082/msnSDK/msn_cgi-win32?FUNC=GETSPID&USERID=apiblogt6&PASSWD=msnsdkt&RETTYPE=ADO"

xmlHTTP.open "GET", URL, false
xmlHTTP.send()

if err.description <>"" then
Set xmlHTTP= Nothing
response.write "無法連接遠端伺服器," & err.description
response.end
end if

'--
'將得到的訊息存入 myRS_....xml
'--
set myStream = Server.CreateObject("ADODB.Stream")
myStream.Open
myStream.Charset = "big5"
myStream.WriteText xmlHTTP.ResponseText
myStream.Position = 0

'---
'防止重複的process 存取xml
'---
Febber = Split("1,2,3,4,5,6,7,8,9,0,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z", ",")
For I = 0 To 3
Randomize
keychar = keychar & Febber(Int((62 * Rnd) + 1) - 1)
next
myXMLfile = Server.Mappath("./myRS_" & keychar & ".xml")
myStream.SaveToFile myXMLfile
myStream.Close

'--
'取得myRS_$random.xml 的結果
'--
set rs = server.createobject("adodb.recordset")
rs.Open myXMLfile
Do While Not (rs.EOF)
if (rs(0)=1) then
spid=rs(1)
response.write "取得SPID=" & rs(1) & "
"
else
response.write "認證失敗=" & rs(0)& "," & rs(1) & "
"
response.end
end if
rs.MoveNext
Loop
rs.Close


'--
'刪除暫存檔
'--
set FSO = Server.Createobject("Scripting.FileSystemObject")
Fso.DeleteFile myXMLfile

'--
'釋放使用的物件
'--
set FSO = Nothing
Set myStream = Nothing
Set rs = Nothing
Set xmlHTTP= Nothing
'--

'--
'---STEP2 邀請聯絡人
'--
Set xmlHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
'如果遇到中文,請使用Server.URLEncode 來處理
'比如 : ...&pname=Server.URLEncode("中文姓名")&...
'請注意!
'邀請聯絡人 XXXXXXXX@hotmail.com 請填正確的聯絡人,執行此SUB 後
'msnSDK 會邀請這個人加入聯絡人,必須加入聯絡人後才能發送訊息
'session 由GETSPID 所取得的 spid

URL= "http://59.120.234.84:8082/msnSDK/msn_cgi-win32?FUNC=REGISTER&UIDS=XXXXXXXX@hotmail.com&SESSION=" & spid & "&RETTYPE=ADO"

xmlHTTP.open "GET", URL, false
xmlHTTP.send()

if err.description <>"" then
Set xmlHTTP= Nothing
response.write "無法連接遠端伺服器," & err.description
response.end
end if

'--
'將得到的訊息存入 myRS_....xml
'--
set myStream = Server.CreateObject("ADODB.Stream")
myStream.Open
myStream.Charset = "big5"
myStream.WriteText xmlHTTP.ResponseText
myStream.Position = 0

'---
'防止重複的process 存取xml
'---
Febber = Split("1,2,3,4,5,6,7,8,9,0,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z", ",")
For I = 0 To 3
Randomize
keychar = keychar & Febber(Int((62 * Rnd) + 1) - 1)
next
myXMLfile = Server.Mappath("./myRS_" & keychar & ".xml")
myStream.SaveToFile myXMLfile
myStream.Close

'--
'取得myRS_$random.xml 的結果
'--
set rs = server.createobject("adodb.recordset")
rs.Open myXMLfile
Do While Not (rs.EOF)

response.write "邀請聯絡人回應=" & rs(0) & "," & rs(1) & "," & rs(2) & "
"

rs.MoveNext
Loop
rs.Close

'--
'刪除暫存檔
'--
set FSO = Server.Createobject("Scripting.FileSystemObject")
Fso.DeleteFile myXMLfile

'--
'釋放使用的物件
'--
set FSO = Nothing
Set myStream = Nothing
Set rs = Nothing
Set xmlHTTP= Nothing
'--

'--
'---STEP3 發送訊息
'--
Set xmlHTTP = Server.CreateObject("MSXML2.ServerXMLHTTP")
'如果遇到中文,請使用Server.URLEncode 來處理
'比如 : ...&pname=Server.URLEncode("中文姓名")&...
'請注意!
'傳送訊息給 XXXXXXXX@hotmail.com 請填正確的聯絡人,執行此SUB 後
'msnSDK 會邀請這個人加入聯絡人,必須加入聯絡人後且這個人在線上才能
'發送訊息,如要傳離線訊息請參考文件
'session 由GETSPID 所取得的 spid
msg=Server.URLEncode("測試")

URL= "http://59.120.234.84:8082/msnSDK/msn_cgi-win32?UIDS=XXXXXXXX@hotmail.com&MSG=" & msg &"&flags=0&FUNC=SENDMSG&ENCODING=BIG5&RETTYPE=ADO&SESSION=" & spid

xmlHTTP.open "GET", URL, false
xmlHTTP.send()

if err.description <>"" then
Set xmlHTTP= Nothing
response.write "無法連接遠端伺服器," & err.description
response.end
end if

'--
'將得到的訊息存入 myRS_....xml
'--
set myStream = Server.CreateObject("ADODB.Stream")
myStream.Open
myStream.Charset = "big5"
myStream.WriteText xmlHTTP.ResponseText
myStream.Position = 0

'---
'防止重複的process 存取xml
'---
Febber = Split("1,2,3,4,5,6,7,8,9,0,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z", ",")
For I = 0 To 3
Randomize
keychar = keychar & Febber(Int((62 * Rnd) + 1) - 1)
next
myXMLfile = Server.Mappath("./myRS_" & keychar & ".xml")
myStream.SaveToFile myXMLfile
myStream.Close

'--
'取得myRS_$random.xml 的結果
'--
set rs = server.createobject("adodb.recordset")
rs.Open myXMLfile
Do While Not (rs.EOF)

response.write "傳送訊息回應=" & rs(0) & "," & rs(1) & "," & rs(2) & "
"

rs.MoveNext
Loop
rs.Close

'--
'刪除暫存檔
'--
set FSO = Server.Createobject("Scripting.FileSystemObject")
Fso.DeleteFile myXMLfile

'--
'釋放使用的物件
'--
set FSO = Nothing
Set myStream = Nothing
Set rs = Nothing
Set xmlHTTP= Nothing
'--


%>

其他更詳細的參數可以參考msnSDK訊息控制開發套件程式介面說明書

Sunday, November 23, 2008

函數語言版本的費氏數列程式

費氏數列 (Fibonacci's numbers) 是 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 這樣的數列,其中每個數為前二個數的和,除了最前面的底數 0, 1 外。

小小的費氏數列程式很好寫,看起來也很好執行,以 C 語言為例:

n_2 = 0; n_1 = 1;
if (n == 0)
fn = n_2;
else if (n == 1)
fn = n_1;
else
for (i=2; i<n; i++) {
fn = n_2 + n_1;
n_2 = n_1;
n_1 = fn;
}

最後 fn 為答案。但 C 程式版本其實不好執行,若指定的費氏項數稍大,而程式中的變數是整數或長整數,就會溢位。

函數語言 Haskell 寫出來的比較可愛:

fibNum :: (Integral a) => a -> a
fibNum 0 = 0
fibNum 1 = 1
fibNum (n+1) = fibNum (n-1) + fibNum n

雖然沒有溢位問題了,但是打個 fibNum 100 跑得真久,因為遞迴的計算量很大。

但函數語言的好處是,許多程式可用累積變數 (aggregating parameters) 改寫成線性版本,改善計算效率。在此,例如:

fib :: (Integral a) => a -> a
fib n = fib1 n 0 1

fib1 :: (Integral a) => a -> a -> a -> a
fib1 0 x _ = x
fib1 1 _ y = y
fib1 (n+1) x y = fib1 n y (x+y)

打個 fib 100 很快就跑出答案為: 354224848179261915075 。漂亮!

在此可見程式語言的特性,除了語法可愛和簡潔之外,在可優化的容易程度是特別有價值的。

想要探索更深入的價值,請積極參與微程式資訓技術研討會1並參閱投影片。


1微程式資訊技術研討會微程式資訊股份有限公司的內部會議。

Tuesday, November 18, 2008

關於msnSDK 使用上的問題,特此說明

http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=3056858&SiteID=14
這篇文章有提到關於msnSDK 產品使用的問題,因為個人疏忽沒有特別提出這個問題,特此說明

API 使用權限的帳號密碼,直接寫在範例程式裡,所以;個人使用確實是免費的,而此API 同時支援MSN/YAHOO即時通,如果有需要使用非程式範例內的帳號密碼,也可以跟我索取(sonet.all@gmail.com),至少以上這些都是免費提供使用,文件也可以自行參考下載,個人使用與商業版功能完全一致;沒有差異,唯一的差異是商業版會安裝在購買的使用者機器上,且依照販售合約提供相關維護保固...,而個人使用則不提供這些服務或保證

Sunday, November 16, 2008

3分鐘學會使用程式發送msn訊息, VB6.0篇(五)








<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>





msnSDK訊息控制開發套件 同時支援MSN/Yahoo即時通 訊息雙向傳遞



VB6.0 的範例我們使用ADO介面來處理,其他語言也可以這樣做,可參考文件(文末提供下載處),另外;下面的程式碼重要的部份只有參數不同,其他大同小異,可參考紅字部分





ps.也請參考 msnSDK的使用流程

================================







Dim RS As New ADODB.Recordset

Dim URL As String

Dim Session As String '授權碼



'取得API 的使用權利

Private Sub GETSPID_Click()

Dim RET As String

On Error GoTo ErrHandle



'API 連接位置

URL = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32"

'apiblogt5/msnsdkt 取得API 使用權限的帳號/密碼


RS.Open URL & "?FUNC=GETSPID&USERID=apiblogt5&PASSWD=msnsdkt&RETTYPE=ADO"


Do While Not (RS.EOF)



'查詢回應

'RS(0) 0 認證失敗 1認證成功

'RS(1) 失敗傳回 失敗原因 / 成功傳回 SESSION

'

If (RS(0) = 0) Then

MsgBox "認證失敗,無法使用API"

Else

'取得認證授權使用API

'授權碼

Session = RS(1)

End If

RS.MoveNext

Loop

RS.Close

Exit Sub

ErrHandle:

MsgBox "無法連接伺服器,或是參數不正確"



End Sub



'邀請聯絡人

Private Sub REGISTER_Click()



Dim RET As String

On Error GoTo ErrHandle



'API 連接位置

URL = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32"



'邀請聯絡人 XXXXXXXX@hotmail.com 請填正確的聯絡人,執行此SUB 後

'msnSDK 會邀請這個人加入聯絡人,必須加入聯絡人後才能發送訊息

'session 由GETSPID 所取得的session


RS.Open URL & "?UIDS=XXXXXXXX@hotmail.com&FUNC=REGISTER&RETTYPE=ADO&SESSION=" &
Session


Do While Not (RS.EOF)



'查詢回應

'RS(0) 0 邀請失敗 1邀請成功

'RS(1) 失敗傳回 失敗原因 / 成功訊息

'

If (RS(0) = 0) Then

MsgBox "邀請失敗"

Else

MsgBox RS(1)

End If

RS.MoveNext

Loop

RS.Close

Exit Sub

ErrHandle:

MsgBox "無法連接伺服器,或是參數不正確"



End Sub



'發送MSN/YAHOO即時通訊息

Private Sub SENDMSG_Click()

Dim RET As String

On Error GoTo ErrHandle



'API 連接位置

URL = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32"



'傳送訊息(MSG)給 XXXXXXXX@hotmail.com(必須是此聯絡人已接受邀請)

'flags 1 當聯絡人不在線上則依據系統設定處理(系統設定為傳送離線訊息) 0 當連絡人不在線上,則不送任何訊息

'encoding 標示目前傳送訊息的中文編碼

'rettype 設定為使用ADO

'session 由GETSPID 所取得的session


RS.Open URL & "?UIDS=XXXXXXXX@hotmail.com&MSG=測試&flags=0&FUNC=SENDMSG&ENCODING=BIG5&RETTYPE=ADO&SESSION=" & Session


Do While Not (RS.EOF)



'查詢回應

'RS(0) 0 傳送失敗 1傳送成功

'RS(1) 失敗傳回 失敗原因 / 成功訊息

'

If (RS(0) = 0) Then

MsgBox "傳送失敗"

Else

MsgBox RS(1)

End If

RS.MoveNext

Loop

RS.Close

Exit Sub

ErrHandle:

MsgBox "無法連接伺服器,或是參數不正確"

End Sub



其他更詳細的參數可以參考msnSDK訊息控制開發套件程式介面說明書

Friday, November 14, 2008

MSN機器人開發套件 demo篇

MSN機器人開發套件影片,msnSDK本身可以同時支援MSN/YAHOO即時通,影片中for MSN的字樣指的是這個影片展示的是MSN部分,另外這個影片沒有展示與msn互動的部份,msnSDK本身能夠做到MSN/YAHOO互動雙向訊息的應用;若有公司企業欲洽談合作,不論合作方式的大或小,可洽sonet.all@gmail.com

http://tw.youtube.com/watch?v=hbQ1Va_IqzM

Thursday, November 13, 2008

3分鐘學會使用程式發送msn訊息, Perl篇(四)

<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



msnSDK訊息控制開發套件 同時支援MSN/Yahoo即時通 訊息雙向傳遞

perl 的範例我們使用soap 介面來處理,其他語言也可以這樣做,可參考文件(文末提供下載處)
wsdl位置:http://59.120.234.84:8082/msnSDK/genwsdl-win32

ps.也請參考 msnSDK的使用流程
================================
#!/usr/bin/perl
use SOAP::Lite;

#取得使用api 的權限
sub setspid
{
my $session_ret=SOAP::Lite->uri('http://59.120.234.84:8082/MSN')
->proxy('http://59.120.234.84:8082/msnSDK/msn_soap-win32')
->GETSPID('apiblogt4','msnsdkt')->result;
my ($code,$session)=split("\t",$session_ret);
$session=~tr/\r\n //d;
return $session;
}

#註冊聯絡人
sub register
{
my $sret= setspid();
my $session_ret=SOAP::Lite->uri('http://59.120.234.84:8082/MSN')
->proxy('http://59.120.234.84:8082/msnSDK/msn_soap-win32')
->REGISTER('要加入聯絡人的msn/yahoo帳號',$sret)->result;
print $session_ret;
}

#傳送訊息
sub sendmsg
{
my $sret= setspid();
my $msg_ret = SOAP::Lite->uri('http://59.120.234.84:8082/MSN')->
proxy('http://59.120.234.84:8082/msnSDK/msn_soap-win32')->
SENDMSG( '要傳送訊息聯絡人的msn/yahoo帳號', '欲傳送的訊息', 'utf-8','1',$sret)->result;
print $msg_ret;
}

其他更詳細的參數可以參考msnSDK訊息控制開發套件程式介面說明書

Wednesday, November 12, 2008

ALE middleware 架構布局


目前正在思考 Application Level Events 介面 [1,2] 如何整併入系統中。我的構想如右圖。 Middleware 為 ALE 介面的實作,處理讀寫命令呼叫及程序觸發與控制,可能是獨立 server 、或是 DLL 、 local services 或 Web services 形式。一件 middleware server 可以管理許多台 readers 。 Middleware 對應用系統提供介面做讀取 (pooling) 。

Middleware 對 readers 以低層 reader 協定 (LLRP) 溝通,對應用系統則以 SOAP (簡單物件存取協定) 溝通。 Readers 的設定表可能離線備份在 middleware ,使上下二端讀取設定比較簡單。每一台 reader 只和少數一件 middleware(或二件,包含備援機)溝通,不同步的問題會比較少。應用系統的開發人員則呼叫 middleware 的 ALE 介面,傳 SOAP 參數或訊息,讓程式比較好寫。不過,少數的 middleware 會是效能關卡,這方面還要思考解決方案。


Middleware 做成獨立模組,內涵物可以有許多故事。例如 [4] 的處理方式。

SOAP 效能問題則可以參考 [3] 的處理方式(參左圖):應用系統送出訊息(由路線 2 )都由 client 代理,處理每一串 SOAP 訊息都先找 cache 有沒有舊的相同資料(由路線 3 ),若有則發送舊的訊息(由路線 5 ),或者若沒有則發送新訊息(由路線 5 )。

參考資料

[1] EPCglobal Inc. The EPCglobal architecture framework, EPCglobal final version 1.2 approved 10 September 2007. http://www.epcglobalinc.org/standards/architecture/architecture_1_2-framework-20070910.pdf , Sep. 10, 2007 (referred at August 2008).

[2] EPCglobal Inc. The Application Level Events (ALE) specification, version 1.1: Part I: Core specification. http://www.epcglobalinc.org/standards/ale/ale_1_1-standard-core-20080227.pdf , Feb. 27, 2008 (referred at September 2008).

[3] K. Devaram and D. Andresen. SOAP optimization via client-side caching. Proceedings of the First International Conference on Web Services (ICWS'03), pp. 520-524, Las Vegas, NV, June 24-27, 2003.

[4] J. Song, T. Kim, S. Lee, and H. Kim. Security enhanced RFID middleware system. Procedings of World Academy of Science, Engineering and Technology, v.10, pp.79-82, Dec. 10, 2005.

msnSDK的使用流程說明

<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



3分鐘學會使用程式發送系列文章所使用的流程

STEP1:
取得SPID: GETSPID請參考各種語言所使用的帳號/密碼(每篇文章的程式碼內有),取得SPID以取得使用API 的權力

STEP2:
註冊聯絡人: 要發訊息給別人,需要先讓他成為聯絡人,因此這必須要是合法聯絡人(msn/yahoo帳號),而此時這個帳號會收到邀請通知(請見下圖)

STEP3:
傳送MSN/YAHOO訊息: SENDMSG(uids傳遞訊息的目的MSN/YAHOO帳號,msg欲傳遞的訊息內容,encoding傳遞的訊息中文編碼(utf-8/big5/gbk/gb2312),flags 0 對方離線則不送訊息 1對方離線則訊息是否傳送由系統決定,session GETSPIS得到的session值)

msnSDK擁有非常多的FUNCTION,也包含互動式的機器人選單,其他功能可參考msnSDK訊息控制開發套件程式介面說明書

Monday, November 10, 2008

3分鐘學會使用程式發送msn訊息, Java篇(三)

<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



msnSDK訊息控制開發套件 同時支援MSN/Yahoo即時通 訊息雙向傳遞
ps.也請參考 msnSDK的使用流程
================================
public class clsMsnSDK {
public static void main(String[] args) throws Exception {
String UserName = "apiblogt3";
String Password = "msnsdkt";
//取得SPID
String strRet = GETSPID(UserName,Password);
String[]tmp = strRet.split("1\t");
String strValue = tmp[1].replace('\n',' ').trim();

String SPID = strValue;
System.out.println(SPID);
//註冊聯絡人
String Email = "xxxxx@hotmail.com"; //填入msn/yahoo聯絡人,勿使用這個預設值
String ret = Register(Email,SPID);
System.out.println(ret);
//發訊息
String strMsg = "Hello_World!"; //輸入訊息 (未做 Url EnCoded)
String MsgRet = SendMsg(Email,strMsg,SPID);
System.out.println(MsgRet);
}


//取得SPID
public static String GETSPID(String UserName,String Password) throws Exception {

String strUrl = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";
String strValue ="?FUNC=GETSPID&USERID=" + UserName + "&PASSWD=" + Password;
java.net.HttpURLConnection urlConnection= null;//定義一個HTTP連線
java.net.URL url= new java.net.URL(strUrl + strValue);//定義一串URL
urlConnection=(java.net.HttpURLConnection)url.openConnection();//將URL餵給HttpURLConnection
urlConnection.setRequestMethod("POST");//設定參數傳遞方式(GET or POST)
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.connect();//開啟連線
java.io.InputStream GetHTML=urlConnection.getInputStream();//內容儲存下來
int leng =0;
byte[] Data = new byte[100];
byte[] totalData = new byte[0];
int totalLeg =0;
do{
leng = GetHTML.read(Data);//(Data);
if(leng>0){
totalLeg += leng;
byte[] temp = new byte[totalLeg];
System.arraycopy(totalData, 0, temp, 0, totalData.length);
System.arraycopy(Data, 0, temp, totalData.length, leng);
totalData = temp;
}
}while(leng>0);
String tmp = new String(totalData,"UTF-8");
urlConnection.disconnect();
return tmp;
}

//註冊
public static String Register(String UIDS,String SPID) throws Exception{
String strUrl = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";
String strValue = "?FUNC=REGISTER&UIDS=" + UIDS + "&SESSION="+ SPID;
java.net.HttpURLConnection urlConnection= null;//定義一個HTTP連線
java.net.URL url= new java.net.URL(strUrl + strValue);//定義一串URL
urlConnection=(java.net.HttpURLConnection)url.openConnection();//將URL餵給HttpURLConnection
urlConnection.setRequestMethod("POST");//設定參數傳遞方式(GET or POST)
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.connect();//開啟連線
java.io.InputStream GetHTML=urlConnection.getInputStream();//內容儲存下來
int leng =0;
byte[] Data = new byte[100];
byte[] totalData = new byte[0];
int totalLeg =0;
do{
leng = GetHTML.read(Data);//(Data);
if(leng>0){
totalLeg += leng;
byte[] temp = new byte[totalLeg];
System.arraycopy(totalData, 0, temp, 0, totalData.length);
System.arraycopy(Data, 0, temp, totalData.length, leng);
totalData = temp;
}
}while(leng>0);
String tmp = new String(totalData,"UTF-8");
urlConnection.disconnect();
return tmp;

}

//傳送MSN 訊息
public static String SendMsg(String UIDS,String MSG,String SPID) throws Exception{
String strUrl = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";
String strValue ="?FUNC=SENDMSG&UIDS=" + UIDS + "&MSG=" + MSG +"&Encoding=BIG5&flag=0&Session=" + SPID;
java.net.HttpURLConnection urlConnection= null;//定義一個HTTP連線
java.net.URL url= new java.net.URL(strUrl + strValue);//定義一串URL
urlConnection=(java.net.HttpURLConnection)url.openConnection();//將URL餵給HttpURLConnection
urlConnection.setRequestMethod("POST");//設定參數傳遞方式(GET or POST)
urlConnection.setDoOutput(true);
urlConnection.setDoInput(true);
urlConnection.connect();//開啟連線
java.io.InputStream GetHTML=urlConnection.getInputStream();//內容儲存下來
int leng =0;
byte[] Data = new byte[100];
byte[] totalData = new byte[0];
int totalLeg =0;
do{
leng = GetHTML.read(Data);//(Data);
if(leng>0){
totalLeg += leng;
byte[] temp = new byte[totalLeg];
System.arraycopy(totalData, 0, temp, 0, totalData.length);
System.arraycopy(Data, 0, temp, totalData.length, leng);
totalData = temp;
}
}while(leng>0);

String tmp = new String(totalData,"UTF-8");
urlConnection.disconnect();
return tmp;
}

}

其他更詳細的參數可以參考msnSDK訊息控制開發套件程式介面說明書

3分鐘學會使用程式發送msn訊息,dotNet C#篇(二)








<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



msnSDK訊息控制開發套件 同時支援MSN/Yahoo即時通 訊息雙向傳遞

ps.也請參考 msnSDK的使用流程

================================



全域的物件及變數

WebClient wc = new WebClient();

string SPID = "";



步驟一:取得SPID(GETSPID)

private void button1_Click(object sender, EventArgs e)

{

string url="http://59.120.234.84:8082/msnSDK/msn_cgi-win32";

string method="POST";

string postdata = "FUNC=GETSPID&USERID=apiblogt2&PASSWD=msnsdkt";

byte[] postbyte=Encoding.UTF8.GetBytes(postdata);

byte[] resb = wc.UploadData(url, method, postbyte);

string resmsg = Encoding.UTF8.GetString(resb);

resmsg = resmsg.Replace("\n", "");

string[] arrstr = resmsg.Split('\t');

if (arrstr[0] == "1")

{

SPID = arrstr[1];

MessageBox.Show("取得SPID成功: SPID= " + SPID);

}

else

{

SPID = "";

MessageBox.Show("取得SPID失敗: " + resmsg);

}

}



步驟二:將帳號註冊為msn機器人的連絡人(REGISTER)

下述: txtmsnacc.Text 為msn/yahoo帳號



private void button2_Click(object sender, EventArgs e)

{

string url = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";

string method = "POST";

string postdata = "FUNC=REGISTER&uids=" + txtmsnacc.Text + "&session=" + SPID;

byte[] postbyte = Encoding.UTF8.GetBytes(postdata);

byte[] resb = wc.UploadData(url, method, postbyte);

string resmsg = Encoding.UTF8.GetString(resb);

resmsg = resmsg.Replace("\n", "");

string[] arrstr = resmsg.Split('\t');

if (arrstr[0] == "1")

{

MessageBox.Show("註冊成功: " + resmsg);

}

else

{

MessageBox.Show("註冊失敗: " + resmsg);

}

}



步驟三:發送訊息(SENDMSG)

private void button3_Click(object sender, EventArgs e)

{

string msg = "msnSDK測試訊息";

string url = "http://59.120.234.84:8082/msnSDK/msn_cgi-win32";

string method = "POST";

string postdata = "FUNC=SENDMSG&uids=" + txtmsnacc.Text + "&msg=" + msg + "&encoding=utf-8&flags=0&session=" + SPID;

byte[] postbyte = Encoding.UTF8.GetBytes(postdata);

byte[] resb = wc.UploadData(url, method, postbyte);

string resmsg = Encoding.UTF8.GetString(resb);

resmsg = resmsg.Replace("\n", "");

string[] arrstr = resmsg.Split('\t');

if (arrstr[0] == "1")

{

MessageBox.Show("發送訊息成功: " + resmsg);

}

else

{

MessageBox.Show("發送訊息失敗: " + resmsg);

}

}



其他更詳細的參數可以參考msnSDK訊息控制開發套件程式介面說明書

Sunday, November 9, 2008

3分鐘學會使用程式發送msn訊息,php篇(一)

---電子發票整合方案 http://rd-program.blogspot.com/2012/03/blog-post.html ---




<imoo msn機器人測試平台,將於下週三(2009.6.24)取消所有未經申請試用的認證資訊,詳見相關資訊>



msnSDK訊息控制開發套件 同時支援MSN/Yahoo即時通 訊息雙向傳遞



ps.也請參考 msnSDK的使用流程

================================



步驟一:取得api 使用的權限(GETSPID)



$file="http://59.120.234.84:8082/msnSDK/msn_cgi-win32?FUNC=GETSPID&USERID=apiblogt1&PASSWD=msnsdkt" ;

$myArray='';

$mySession='';

$myResult='';

$getline='';



if (!($fp = fopen($file, "r"))) {

die("could not open XML input");

}

while ($getline = fgets($fp, 4096)) {

$myArray=explode("\t",$getline);

$myResult=$myArray[0];

$mySession= $myArray[1];

}

fclose($fp);

if ($myResult=="0")

{

echo "get session fail...

";

exit();

}

else

{

//$_SESSION["mySession"]= $mySession;

echo "get session=".$mySession."

";

}

echo "<a href='REGISTER.php?uids=".$_GET["uids"]."&session=".$mySession."'>go register page</a>";

?>



步驟二: 邀請聯絡人(REGISTER)



$myArray='';

$mySession='';

$myResult='';

$getline='';

//register:

$file="http://59.120.234.84:8082/msnSDK/msn_cgi-win32?FUNC=REGISTER&uids=".$_GET["uids"]."&session=".$_GET["session"] ;

echo $file."

";



if (!($fp = fopen($file, "r"))) {

die("could not open XML input");

}

while ($getline = fgets($fp, 4096)) {

$myArray=explode("\t",$getline);

$myResult=$myArray[0];

}

fclose($fp);



if ($myResult=="0")

{

echo "register fail... ".$myArray[1]."

";

//exit();

}

else

{

echo "register ok. account=".$myArray[2]."

";

}

echo "<a href='SENDMSG.php?uids=".$_GET["uids"]."&msg=hello&encoding=utf-8&flags=0&session=".$_GET["session"]."'>go SENDMSG page</a>";

?>



步驟三:發送訊息(SENDMSG)



$myArray='';

$mySession='';

$myResult='';

$getline='';



//send message:

$file="http://59.120.234.84:8082/msnSDK/msn_cgi-win32?FUNC=SENDMSG&uids=".$_GET["uids"]."&msg=".$_GET["msg"]."&encoding=utf-8&flags=0&session=".$_GET["session"] ;

if (!($fp = fopen($file, "r"))) {

die("could not open XML input");

}

while ($getline = fgets($fp, 4096)) {

$myArray=explode("\t",$getline);

$myResult=$myArray[0];

}

fclose($fp);

if ($myResult=="0")

{

echo "send message fail... ".$myArray[1]."

";

exit();

}

else

{

echo "send message ok. message=".$myArray[2]."

";

}

?>



其他更詳細的參數可以參考msnSDK訊息控制開發套件程式介面說明書

Tuesday, November 4, 2008

msnSDK 釋出支援YAHOO即時通的版本

msnSDK 經過適當的改寫後,已支援Yahoo 即時通

1.新增/刪除 聯絡人的處理
2.發送訊息
3.查詢暱稱
4.查詢個人資訊
5.傳送震動訊息
6.傳送離線訊息

Yahoo 再收送資訊的部份與既有MSN 使用不同的指令;但在msnSDK 裡,機器人會自動判斷發送的對象是使用哪種IM,所以使用同一個函式名稱不需變換

請參考其他相關文章
msnSDK文件下載
http://rd-program.blogspot.com/2008/10/msnsdk.html

函數語言處理氣泡排序法

在碩士班期間擔任幾年的大學基礎程式設計課程的實習助教,在講台上解題,講了氣泡排序法幾乎有十次(對不同班、不同年級)。

for (i=0; i<N; i++)
for (j=0; j<N-i-1; j++)
if (A[j] > A[j+1]) {
temp = A[j];
A[j] = A[j+1];
A[j+1] = temp;
}

二個迴圈洽好代表二層次的工作:裏層負責排列順序、外層負責控制執行次數和調整排序範圍。

用 Haskell 函數語言寫氣泡排序,是將二個層次功能做好,然後組合起來。首先是氣泡調整的部份(如下方的 bubble), bubble 函數要將一列資料由小(左)排到大(右),而且要從右邊開始向左調整順序,將較小的數字往左邊推。這和上述的普通程式處理方向相反。

bubble :: (Ord a) => [a] -> [a]
bubble [x] = [x]
bubble (x:xs)
| x > y = y:x:ys
| otherwise = x:y:ys
where (y:ys) = bubble xs


次數控制的部份(如下方的 loop), loop 函數一方面要先將某個 f 函數套到一串數列(xs)上、取回的結果(y:ys)再將 f 函數套上去;另一方面, loop 函數控制執行次數,藉由將 f 函數再次套到上次已經套過 f 函數的結果(y:ys)時,是將第一個數字(y)取出,將 f 函數套在剩餘的數列(ys)上。每次套上 f 函數之後,就取出數列的一個數字,於是剩下的數列越來越小,直到剩下空數列([])。

loop :: (Ord a) => ([a] -> [a]) -> [a] -> [a]
loop f [] = []
loop f xs = y : loop f ys
where (y:ys) = f xs


接下來,氣泡排序程式(如下方的 bubbleSort),是將 loop 函數和 bubble 函數放在一起。

bubbleSort :: (Ord a) => [a] -> [a]
bubbleSort = loop bubble


執行情況:

GHCi, version 6.8.3: http://www.haskell.org/ghc/ :? for help
Loading package base ... linking ... done.
Prelude> :load "d:/code/hsBubbleSort/bubbleSort.hs"
[1 of 1] Compiling Main ( d:/code/hsBubbleSort/bubbleSort.hs, interpreted )
Ok, modules loaded: Main.
*Main> bubbleSort [3,2,9,7,8,5,4]
[2,3,4,5,7,8,9]
*Main> bubbleSort [5]
[5]
*Main> bubbleSort []
[]
*Main>

Monday, November 3, 2008

SOAP訊息的重用

SOAP是使用XML的通訊協議,傳遞的訊息有相當結構性質。而SOAP一般的缺點是,將程式物件的結構(圖結構或樹結構)拼合為訊息的線狀結構非常耗時。這種特性可以理解,例如 ASP 的 VBScript 字串連接符號 & ,與 Haskell 的字串附加運算符號 ++ ,都是惡名昭彰地拖延效率。

有研究指出, SOAP 所傳輸的訊息經常重複,因此只要將舊訊息多多重用,就能夠加強效率。考慮二則訊息的比對,結果是以下四種情況的其中一種:

  1. 完全符合:內容直接符合。
  2. 良好的符合:結構與長度符合,但資料有些不同。
  3. 部份符合:結構符合,但長度和資料不同。
  4. 不符合:結構不符合。

完全符合的訊息可 100% 重用,而不符合則必須照舊建立新訊息。而前後二訊息有資料和長度的若干不同,則可藉由將長度補足為相同,在將差異的局部加以修改,就能節省若干重建結構的時間。

程式細節上,要將一段 SOAP 訊息作大小幅度修改,有若干技巧如劃塊預存(chunking)、平移(shifting)與偷遞(steeling)等等,進而作聰明的編輯距離(editing distance)規劃,實作者必須多研究、演練並加強。

相關文獻

  1. Suhyun Kim, Daeyoung Kim, Jongwoo Sung and Tomas Sanchez Lopez. Template based high performance ALE-TSOAP message communication. Fifth International Conference on Software Engineering Research, Management and Applications, pp.534-541, 2007.
  2. Nayef Abu-Ghazaleh, Michael J. Lewis, Madhusudhan Govindaraju. Differential serialization for optimized SOAP performance. Proceedings of 13th International Symposium on High Performance Distributed Computing, pp.55-64, 2004.
  3. Nayef Abu-Ghazaleh, Michael J. Lewis, Madhusudhan Govindaraju. Performance of dynamic resizing of message fields for differential serialization of SOAP messages. Proceedings of the International Symposium on Web Services and Applications, pp.783-789, 2004.

Tuesday, October 28, 2008

參與2008年第二屆OWASP官方亞洲年會

OWASP是 Open Web Application Security Project(開放網路應用的安全) 的省稱。

這個會議在2008年10月27到28日在台北市國際會議中心(3F)舉行,主要是揭露當前在網路應用上的許多攻擊方式。

概觀

McAfee Foundstone 陳彥銘理事指出當前熱門的攻擊有 mass SQL injection 、 buffer overflow 、 cross-site scripting 等。此外以社會基礎的攻擊方式也需注意,例如由於 Google 搜尋找到一項地方新聞提到 UAL 破產,使 UAL 當天股價臨時劇烈滑落而損失。安全措施類似軟體發展過程,有一套 SDLC (Software Development Life Cycle) 。微軟也有 Microsoft SDL 。而一般企業使用 ad-hoc SDL ,不見得將理論的 SDLC 全部採用。一般安全測試方法有內部狀態測試、將測試外包、或是滲透測試。而未來在網路安全防護的要項是:

  • 使用Web 2.0服務,則一部份安全關卡與 Web 2.0 服務有關係。
  • 安全防護是一個過程,應列為日常生活該做的事情。
  • 有些非安全專業的公司購買安全專業的公司,做為走向安全領域的方法。
  • MS08067的安全威脅不是由自動工具發現;許多攻擊方式不能由自動工具阻擋。

安全防護需要關心的方面有:密碼政策、存取控制政策、程序流程控制、客戶端資料驗證、資料的保護(SSL)、以及不要發明自己的加解密演算法等等。

OWASP台灣分會阿瑪科技黃耀文理事介紹了網路攻擊程式的發展趨勢,由1993年米開朗基羅病毒、1996年的VBA巨集病毒、一路直道2004年 skylived IE javascript heap spray 技巧、以及當前的 mass SQL injection。

攻擊方法

今日多以組織型駭客發動規模攻擊。而攻擊程式則有許多程式技巧:

  • 網頁掛馬:只要想辦法在網頁中殖入 <script src="ALIEN.JS"></script> 就是掛馬。
  • 善用命名混淆、字串分解、編碼混淆就能夠製作變形的攻擊程式。混淆是一般的技巧,對於安全防護的麻煩是,並非混淆的網頁碼都是攻擊。
  • 攻擊程式可用若干技巧躲閉安全分析:測試執行環境是否為可上網的環境或網頁的直譯器、設法隱藏 document.write 和 eval 函數、以及使用 javascript 的函數語言特性撰寫能自我校驗的程式。

Javascript 函數語言特性的程式技巧,例如:

function testCallee () { return argument.callee; }
document.write( testCallee() );
// 印出 function testCallee () { return argument.callee; }

由於網路應用程式執行環境的特殊, source analysis 是可採用的安全分析方法。

ICST的林佳明介紹了 web mail 的攻擊方式,使駭客能夠容易偷取電子郵件。而那樣的攻擊手法不是修改密碼能夠解決的。

另外有 Robert "RSnake" Hansen 介紹新的 clickjacking 攻擊方式。

由此可見,對於 web 執行平台(包含客戶端與服務端),需要新型態的防火牆如 WAF (Web Application Firewalls) 及持續的安全改善政策。

詳細的資訊,或許等十二月的微程式資訊技術研討會做細節的分享。

Friday, October 24, 2008

參與「2008年空間資訊基礎建設國際研討會暨台灣地理資訊學會年會」

2008年10月23到24日在台北市台大集思會議中心(羅斯福路四段85號B1)舉行,由行政院經濟建設委員會與台灣地理資訊學會主辦、財團法人台灣地理資訊中心與逢甲大學地理資訊系統研究中心執行。

在場次C1孫國勛教授發表了〈以RFID、GPS、GIS定位與通訊科技整合為基礎之文化資產保存、管理、展示及導覽系統─以『珍貴老樹管理系統』為例〉,直接點明為RPID資訊應用的一例。

在場次C11,張筑鈞研究生發表了〈以開放空間服務鏈架構支源互操作中介軟體之發展〉,其中提出將多項公開資訊服務串連成服務鏈的構想,為地理資訊應用的中介軟體。做為中介軟體,勢必要思考到異質資料的套疊與重覆資料的整併或篩減。

在場次C15,來自中華電信的楊仕丞先生發表了〈一種快速之階層式合理路徑計算方法〉,提出根據道路層次限制其計算最短路徑所考慮的路徑數目。

當前在RFID技術研究的興趣,轉向到中介軟體(middleware)的考慮。其中可評量觀點有:異質平台的協同運作、資料的粹取、資料的一致、以及通訊安全。這是我參與空間資訊基礎建設研討會所關心的方面,由他山之石尋找切入點。

Monday, October 20, 2008

msnSDK v1.0.2 文件釋出

msnSDK(http://tcmail.program.com.tw/image/msnSDKV1.0.2.pdf)主要的功能就是把一些常用的MSN 功能做成一些API,讓外部的程式可以簡單的應用它來開發相關應用程式

Wednesday, October 15, 2008

MSNP16 與MSNP15 的差異

MSNP16 與MSNP15 唯一的差異

USR 4 SSO S t=...&p=xxx {MACHINE_GUID}
其中 MACHINE_GUID 可以是任何 32bytes 的16進制亂數,這大概是為了要讓MSN 可以在不同位置重複登入所設計,就像是XMPP 中的(jid)uid@domain/resource類似

Sunday, October 12, 2008

msnSDK 文件

msnSDK(http://tcmail.program.com.tw/image/msnSDKV1.0.1.pdf)主要的功能就是把一些常用的MSN 功能做成一些API,讓外部的程式可以簡單的應用它來開發相關應用程式,目前;msnSDK支援4種程式介面, 1.SOAP 2.CGI 3.ADO (這三種API的功能相同) 4.CGI-Steam 這個介面主要是處理從msn client 到msnSDK 之間的訊息以及線上狀況的資訊傳遞,歡迎需要測試功能的人或是有應用需求的各行各業先進與我聯繫(sonet.all@gmail.com)

備註:msnSDK 本身有unix/linux/win32 版本


v1.0.2 已釋出:msnSDK v1.0.2 文件釋出
v1.0.3 已釋出:msnSDK v1.0.3 文件釋出
不分版本(最新):msnSDK 不分版本(最新)文件



Monday, September 22, 2008

OpenID,一套合作的協議

本來以為OpenID是讓用戶在網上有一個通用的識別項,但根據http://openid.net/等網頁的簡要說明,告知顯然我誤會了。顧名思義就是要open,一個登入行遍天下,不過,這「一個」登入似乎不是只登入一次的意思,而且一個「登入」也似乎不是一個帳號的意思。

規格書的認證部份,OpenID Authentication 2.0開宗名義指出:認證是證明用戶操作這個識別項。而識別項就延用網址URI形式,可說是「節能省碳」,重覆使用既有的設計。認證這個話題是很多人都喜歡談的。如果學校收發室要為學生轉寄郵件製作資料庫,就要考慮「誰寄給哪位同學」的問題,學生的識別項很好找,但左邊那個「誰」的識別項不容易設計。既然目前OpenID還不考慮到通用識別項(universal identifier)的情況,盼望將來通訊協議有更好的發展。只是,人與資訊完全密切整合,會是《全民公敵》或《駭克任務》的社會情況嗎?如果是,我不樂見這種未來情況。

Paul and Technometria的OpenID示意圖Leancode的OpenID示意圖給我們一些不同的觀察點,前者採通訊資料流觀點,後者採認證層次觀點。Paul and Technometria的圖告訴我們,哪些資料或訊息的傳遞是一組的,並且為了維持OpenID的運作,各服務方都要表現出適當的行為。Leancode的圖顯示出在認證的訊息傳達之前,須要來往傳遞一些未認證的準備訊息。用戶的目的訊息,是借OpenID提供方的識別項,請求其他的服務方提供服務。而OpenID提供方與其他服務方在下層則必須交換session訊息,這個行為和client-server環境的服務方內部運作相同。

我覺得設計分散式合作協議的人很厲害也夠聰明。低層次的電腦協議是彼此傳遞一組資料,則根據收到的資料符號格式,判讀為哪一種行為。高層次的通訊協議卻可以用比較抽象和淺顯的講法描述各方該傳什麼資料或提供什麼表單,或者表現什麼行為。

OpenID看起來是網路應用的必要過程,從任何網站都只對自己的帳號提供服務,轉變成任何網站都順便對其他網站的帳號提供服務。對微程式資訊自家產品Single Sign-On的參考用處,目前可能是檢查各系統元件、各伺服器,在互動和通訊行為,起碼在自己系統環境中是否足夠open;順便為了未來對其他公司和其他系統的聯外整合做預備。

Tuesday, September 16, 2008

Open WYSIWYG 網頁編輯器配置小技巧

OpenWYSIWYG, http://www.openwebware.com/ , 是很好的網頁程式元件. 除了是全JavaScript寫作的, 也是跨平台適用的.

我有段網頁程式是:

<p>
內容:
<textarea id="content" name="content" style="width: 100%;" rows="6"></textarea>
說明:
<textarea id="content1" name="content1" style="width: 100%;" rows="7"></textarea>
</p>

按照 OpenWYSIWYG 的說明書, 在開頭加上 <script language="JavaScript" type="text/javascript" src="script/wysiwyg.js"></script> <script language="JavaScript" type="text/javascript" src="script/wysiwyg-settings.js"></script> , 文件尾端加上:

<script language="javascript1.2">
var mySettings = new WYSIWYG.Settings();
mySettings.ImagesDir = 'image/';
WYSIWYG.attach('content', mySettings);
</script>

, 所有 script, style 和影像檔都放對位置, 網頁在 FireFox 成功顯示, 卻在 IE 6 出現錯誤:

行: 809
字元: 6
錯誤: 原始 HTML 對這個操作無效
程式碼: 0
URL: ...

翻出 wysiwyg.js 808 行是 textarea.insertAdjacentHTML("afterEnd", editor);
MSDN對insertAdjacentHTML的註解是:網頁正載入時不可做這個操作.
不過, 經過一些檢測, 上述錯誤不是由這個原因發生.

想來想去, 覺得是網頁文件結構不對吧 (non-well-formatted) ... 後來把文件改成:

<p>
<div>內容:
<textarea id="content" name="content" style="width: 100%;" rows="6"></textarea>
</div>
說明:
<textarea id="content1" name="content1" style="width: 100%;" rows="7"></textarea>
</p>

在 IE 就完成了. 我想 OpenWYSIWYG 對網頁結構是敏感的.

Thursday, September 11, 2008

Monday, September 1, 2008

如何成為一位傑出的工程師一文讀後感

這篇文章值得一讀,但是;讀完後我們要怎麼再思考咀嚼成為自己的血肉? 我覺得 why很重要,而why not也很重要,文中提到:



成就傑出表現的原因並不在他們擁有什麼 ,而在於他們如何應用他們所擁有的特質。傑出表現之謎其實在於如何將他們的天分轉換成生產力:就好像將位能轉換成動能一樣。我們的結論是:傑出的表現是努力得來的,與天份無關。(Stars are made, not born.)



那麼這句話自相矛盾的嚴重!沒有天份,就無法將天份轉換成生產力,所以;傑出表現的原因在他需要先擁有天份,才能轉換/應用 特質,結論應該是;傑出的表現是因為有了天份,才能靠後天努力得來,那麼就與天份有關,不是嗎?



這篇文章反應的只是一些特例,也就是說他的研究對象是那些已經在這個領域有充足天份的人,以這些人為基礎來做這個研究,成員結構與一般的公司大相逕庭,所以他的結論應該是;如果你對xx領域已有天份,還需要靠後天的努力才能成為傑出的工程師,於是乎那種天生的宿命論仍然主導一個工程師的傑出不傑出,不是嗎?







--- 電子發票系統建置 http://rd-program.blogspot.com/2012/03/blog-post.html ---

(規範閱覽筆記) 電子產品碼資訊系統架構

架構

EPCglobal 架構包含相關硬體、軟體、資料規範以及一些核心服務,可供 EPCglobal 和他們的委派者使用。透過電子產品碼(EPC)的使用,達成商流與電腦應用的加強。

受惠者

EPCglobal 的用戶,包括
  1. 純用戶:將 EPCglobal 規範與核心服務使用在商務運作中的機構。

  2. 發展者:參與 EPCglobal 規範研發過程的機構。

  3. 方案提供者:根據規範與核心服務,實作用戶系統的機構。

  4. 其他方案提供者。
由 EPCglobal 客戶使用本架構的各項目彼此溝通所造成的綜合效果,俗稱為 EPCglobal Network 。

架構概觀

EPCglobal 架構與三種活動對應,包括 EPC 實物交換規範、 EPC 資料交換規範和 EPC 基礎架構規範。
  1. EPC 實物交換規範:定義貼附實體產品的電子產品碼,用以保證當 EPC 用戶從別的用戶收取所傳送的實物時,能夠判讀實物的電子產品碼。
  2. EPC 資料交換規範:提供用戶在特定的使用群或與公眾分享資料的方法,也提供存取 EPCglobal 核心服務或其他分享服務使資料交換變容易。
  3. EPC 基礎架構規範:定義用以收集和記錄 EPC 資料的介面規範,做為基礎架構元件以提供用戶內部系統的建置。

EPCglobal 架構的目標 (1)


EPCglobal 架構中各份規範的角色如下:

  1. 使交易伙伴的資訊與物資交換變得容易:交易雙方必須先行議定所交換資料的結構與意義和交換機制;也必須先行議定所交換的實物上如何用可了解的方式貼附電子產品碼。

  2. 為系統元件培養競爭市場區位:EPCglobal 規範定義系統元件的介面,使不同廠商製作的元件能夠互通,進而提供用戶一些選擇。

  3. 鼓勵創新:EPCglobal 規範只規定介面,不規定實作。鼓勵實作者在產品與系統能創新,而介面規範能保證系統的互操作性。

[1] F. Armenio, H. Barthel, L. Burstein, J. Duker, J. Garrett, B. Hogan, O. Ryaboy, S. Sarma, J. Schmidt, K.K. Suen, K. Traub, and J. Williams, The EPCglobal Architecture Framework: EPCglobal final version 1.2 approved 10 september 2007 [Online].


(待續)

Saturday, August 30, 2008

抱歉!我並不希望你們假日來公司加班

親愛的夥伴,我最敬愛的摯友;我不知道你們多久會來看我的Blog;或是根本不會來,但是我還是想說一些心裡的話,今天我到公司看到大家認真加班,每個人不求加薪在星期假日到公司來趕工作,那種熱情;我本該由衷感激,不過;抱歉!我必須說:我並不希望你們假日來公司加班,因為加班只是效率不佳與無法準確估算時程最佳寫照,雖然;我不是你們每個人的主管,不過我必須跟你們說:這類的加班是錯誤的,不管對公司對個人來說,都損耗了最大的成本,而且;個人也不相信趕工出來的東西;品質能夠得到任何的保障

不過我應該更精確的說明我的想法,我所指的是沒有按照計畫行事而因為要交付客戶產品時程趕不及所需要的加班,這一連兩個禮拜,我看到這種狀況真的是搖頭連連,如果我自己知道;我所要購買的產品不是按部就班完成,而是透過加班的手段來達成目標,那我會毫不遲疑的退貨,理由無他;因為工作沒有按照例行計畫施行來完成,在每個流程裡的工作者都無法確實估算他的工作流程所需時間;且無法提出保證,這代表了生產品質也面臨相同的問題->不夠精確且無法提出證明,那麼;我們該為這種例外管理上的趕工喝采嗎? 值得商榷...真正有效的管理計畫,應該要包含很多變異的因素,所以計畫本身就要包含變化,才能將不確定的因素降到最低,如此才能使經營成本得到精確的估算,保障企業經營的穩定成長,如果我們遇到的每個問題都是不確定的,那我們要如何保障股東與客戶的權益,替他們提供確實可行的願景?

公司假日仍在公司的比率,我應該數一數二,且每天從事工作相關的事務直到am 1:00,但是我絕對不願意把絲毫的時間浪費在這種無法保證自己工作效率的事務上,我寧願假日到公司心情輕鬆自在的讀我想讀的技術文件,我情願熬夜去探討怎麼寫程式會比較好或怎麼把程式更有效率的完成且如何兼顧避免錯誤的發生,如果興趣就是programming,如果因為興趣而工作需要不停的工作,那是個人選擇,除此之外;抱歉!我只能說,這種補償過錯式的加班,不值得稱許

如果;你們認同我的想法,應該深自思考甚至開會檢討,這兩個星期我們是為什麼加班? 沒準時的理由是什麼? 該怎麼改善這些缺點? 是誰沒準時把東西交出來? 是誰說哪天要給而沒給? 是不是要提早先把工作完成? 我有沒有事先提醒我的夥伴該完成那些工作? 在遇到問題時我有積極向上反應嗎? 該不該獎勵 把準時 把品質 當成第一要務的夥伴? 這樣才真的有把問題解決,否則;我只能說要靠加班趕工來彌補事前無法按部就班所犯下的錯誤,我非常不能認同,尤其是;這本來是可以提前完成的事,為何要這樣浪費資源?

Wednesday, August 27, 2008

寫parser多簡單?

為了處理 Jabber/XMPP 的實作,勢必要考慮到 parser。

根據 Wikipedia 的說明,parser是指將一串輸入文字建立為 parse tree 的功能。根據文法,字串無法剖析為 parse tree 代表剖析錯誤。

用 Haskell 寫 parser 似乎比較簡單。 (?)

Parse tree

一般來說,(binary) tree 是指:

  1. 「空無」情況是 tree ,或是

  2. 以一項物件為基礎,擁有左子項和右子項,二個子項也是 tree 。

在 Haskell 定義 tree 資料結構為

data Tree = A | B | Bin (Tree, Tree)
deriving Show

看起來已經滿足一個 parse tree 的構成。

Parser

Parser 是一個函數,其輸入為一串資料,並輸出一些可能的 parse tree 和剩餘未 parsed 的資料。因此宣告 parser 的資料型態為:

type Parser a b = [a] -> [(b, [a])]

其中, a 是輸入資料的型態, b 是 parse tree 的型態。

根據 Parser a b 的型態規範,可以定義各式各樣的 parser 。例如:

永遠 parsed 的 parser 叫做 succeed

succeed :: Parser a ()
succeed xs = [((), xs)]

永遠 false-parsed 的 parser 叫做 fail

fail :: Parser a b
fail xs = []

讀取指定字元的 parser 叫做 lit (literal parser)

lit :: Eq a => a -> Parser a a
lit x (y:xs) | x == y = [(y, xs)]
lit x _ = []

執行情況:

lit 對字串 "Babcd" 要 parse 一個 `B' 字元,就得到一個 parsed `B',並剩下 "abcd" 字串。

lit 對字串 "Aabcd" 要 parse 一個 `B' 字元, parse 失敗,於是得到一個 empty list [] 代表 false-parsed 。

(待續)

Tuesday, August 26, 2008

關於雲端運算

這篇是談一個稱為雲端運算的東西如何不是雲端運算。因為反面的評價高,相關人事背景加以文字混淆,避開Google搜尋。

Wikipedia對於cloud computing有一番解釋。Cloud就是internet,cloud computing是將計算擺到internet。其中對於商務需求,有一些詞彙如 Platform as a Service (PaaS)、Software as a Service (SaaS)。張亞勤對雲端運算有更細的解釋

26日參與「sales force.com」公司所辦的「碼」,原本希望看到類似於「某個翻議比賽Google傳說」(1)(2)(3)之類的有趣討論,但後來是覺得失望的。

基本上他們公司是做Application Service Providing (ASP)的。這場event是商務軟體發表會,並且與技術思考的交涉不深,其中看到的概念也不新。不過,換一個角度看,我們想要的軟體元件重覆使用的功能他們已經做了,不過耗時九年。

以下是會議摘記:



開場:(業務經理)

網路服務趨勢

  1. 以消費者為導向的enterprise IT,
  2. Enterprise IT服務趨勢: 多用戶和租用,
    且提供服務租用的廠商必須投入成本維持satisfactary。
  3. 網路服務提供叢集的資料中心儲存大量用戶資料。

接下來的說明演示,在本公司商務平台上短短幾分鐘開發應用程式.,達成 (企業內)「無軟體」的商務系統。

說明與演示:(亞洲區業務經理)

本公司花費九年做出可訂製的商務平台,其中包擴了 PaaS和 SaaS 的特性。本平台將商務中許多重用的功能整合,使用戶能自己建置自己合用的系統。

在 CIO checklist 上,企業系統須符合許多準則,如安全、可擴展、可靠、可訂製、資料庫整合、前瞻性、和可用等等。傳統平台:大多只有基本服務,而需要的功能經常要重建。而本商務平台將基礎平台、安全、應用處理架構納入。

一般建製案例

  1. Disney米‧老鼠管理系統:在 .net 平台與本平台建製時間比為 3000 : 96 小時。
  2. EA公司 HR 系統:使用本平台建製,並獲得美國 innovative use of technology award。
  3. JP network 郵便局業務轉型。

演示:(亞洲區系統工程師)

以下為本平台,創新的「非」基礎架構 PaaS 的演示。

需求 1: system reliability

演示 1:本平台一天有超過一億的 transaction.(100M+)..225ms平均處理速度.. 1,100,000+用戶數。並符合 ISO, NCS2 認證。

需求 2:在系統上建置新的模塊數據來管理線上系統的一些資料。

演示 2:在 browser 可建立數據庫、切換介面語系,以及可應使用者熟習語系開發數據庫.。

(創造 project 管理) 建立物件→建立欄位→建立 page view →調整哪一些用戶可以看見物件或欄位→加入資源需求數量。

(根據亞洲區業務經理所提出的說明,資料庫實體檔案應該是以「物件導向資料庫」模型實作。)

好簡單,普通人也可以做?

此時聽眾回應:對這平台的期待更深,因為專案所需要的資料庫都是關聯性很複雜的。一但案子因為在此平台建置出了問題,而資料也都鎖在平台內,是否有風險?

(會後討論針對此問題有解答提出)

需求 3:現有數據庫的移轉。

演示 3:提供 script 將現有數據庫導入本平台

(PaaS 特色) 本平台提供 WebServices API、 Native ERP connectors、 Middleware connectors、 .net- or Java-based tools、 Mashups 和 Desktop Connectors。

需求 4: Logic (work flow) 的需求。

演示 4:本系統可訂製批準流程、自動化、 trigger rules 和欄位與欄位的互動變化等細節特色。

(Logic as a Service 特色) 本系統使用 Java-liked 的 apex 語言,讓使用者能夠撰寫企業需要的邏輯。邏輯建置的方式有:

  1. 宣示性邏輯(只要點擊)
  2. 公式基礎邏輯
  3. apex code

需求 5:UI 的需求。

演示: 5:本平台有標準UI。此外在手機上也提供比較簡單的使用者介面。

此外提出 Vi編su碼al編Fo碼rce 的功能,使平台的整個頁面都能更改.。成功案例有 Cisco、Ashiland 和 Coda 的案例。

除了上述演示之外,

應用程式交換服務: Ap編pe碼xch編an碼ge 平台讓用戶在本平台做的東西可以賣給別人。在此交流平台上可以 "test drive" 也可以 "get it now"。案例:Chevron 用 Ap編pe碼xch編an碼ge 管理內部費用。

本平台也提供 dashboard 功能顯示各種圖形報表。

(Desktop as a Service) 本平台提供 IDE 供桌面開發使用。

結論:(亞洲區業務經理)

Cloud Computing 概念是指系統可在線上使用並與其他系統相連接。企業應知道如何使用公用系統共享合作夥伴與共享用戶。

答問與討論:

1. 資料庫變更欄位所造成的改變是否都正確?

答:線上測試帳號去做某種程度的邏輯測試,滿意了再採購本平台。

(某公司工程師 Danis 的答案) (1) 除了普通邏輯之外,還可以寫一些檢核規則。

(2) 使用 sandbox 測試開發案,完成之後再 deploy 。

2. 設計上與技術圖面上的管理?

答:本平台提供 document 與 version 管理。

此外,主要是跟隨 80-20 原則,本平台希望幫助解決大部份該解決的問題,使企業用互能夠有較多心力專注處理 20% 非平台能夠解決的問題。



以上是會議內容摘要。接下來是我的看法:

  1. 技術人員們,當公司說要建個 cloud computing 這東西,你覺得是什麼?實際該做哪些東西?

  2. 這家公司的這個平台概念不新。 Meta-system (即產生系統的系統) 的概念非常容易由技術圈萌生。做 compiler 的會漸漸做出 meta-compiler ,做 SOHO 的人會漸漸將程式整理成可以組裝的軟體零件。普通寫程式的用手刻程式,厲害的程式師則用少許程式產生大量程式。

  3. 談到正題, cloud computing 與雲端計算。在這次討論中,我看不到那片雲在哪裏。所以第 1 項我感覺不到做為一個 cloud computing 的東西,該有哪些實作。而我說感覺不到那片雲的意思,是因為這個平台只將用戶的軟體與資料搬入網路,卻還談不到任何 cloud computing 。 Cloud computing 的涵義,我覺得是 computing 的效能與產出能夠由這片 cloud 受惠。但這個平台還只是將自己的軟體平台搬上網路,享有一些資料存取的透明度 (storage transparency) 而已。但是產能是否較強呢?在 marketing 層面還有討論空間。但在純計算部份,看不到什麼好東西。

  4. 當場有個關於資料庫組織的討論,對研發者而言是有趣的事情。我們知道 relational database 有很多講究的地方,包括 functional dependency, enterty integrity 、 reference integrity 和表格的劃分。若由網頁介面提供用戶可以自行定義表格,或許表示在用戶的 view 中不必考慮這些事情。但資料庫組織改動之後,要怎麼保持資料庫與改動前的內容一致,其中的 reference 轉換可能很複雜。不過,從發言人的解釋,可以聽出他們使用的資料模型是物件導向資料庫模型,或許在物件的關係與 reference 比較簡單。這方面是可以思考的要點。當你要做個 middleware 時,在 storage transparency 方面要提供某程度的保證。裏頭要談的是一些數學與邏輯上可證明的穩固基礎。

Monday, August 25, 2008

msn 疑似有一個bug

因為自己在摸索msn protocol,發現msn 在做聯絡人的地方有一個bug,當第一次把某個人加入聯絡人(且對方也核准)後,雙方如果都刪除彼此(沒封鎖聯絡人,但同時刪除hotmail聯絡人);當任一方要再訂閱對方,而有拒絕過一次後,對方從此不會再收到訂閱的通知,但自己卻可以訂閱對方為聯絡人且看到對方的線上資訊,這情況跟gtalk很類似,看來;大家在實作這個程序時都留下了一些缺憾

ps.這問題並不是msn client的bug,因為msn server確實沒有傳送ADL 指令;通知對方有人請求加入聯絡人

另外; msn 裡的顯示歌曲資訊會佔用不必要頻寬,msn client勾選這個項目後,似乎每幾秒就會送出UBX 指令給所有的聯絡人,不知道當一個團體很大(數千人,而且每個人都開啟這個功能,且彼此為聯絡人)又同在相同網域下的時候,是不是有可能造成網路嚴重的負擔

Tuesday, August 19, 2008

msnp15 認證過程(I)

使用別人開發好的msn sdk來開發程式;真的能夠滿足你對技術的慾望嗎?以下為msn protocol v15的認證過程,msnp15大致上延續前一版的協定,但是在認證的部份改了,目前msn server 已支援msnp16,而現階段最新的msn client (msn v8.1)還在使用msnp15,要到msn v9才會開始全面支援msnp16
直接從msn protocol著手的主要理由是~這樣,才能將msn 移植到非win32的平台上,否則;微軟本身也有釋出msn sdk,它的缺點是;只能依附在有安裝msn client 的win32上,就這一點來說;msn 的政策還相當封閉,因為每次protocol升級;認證的部份幾乎都有更動,這也是從protocol著手來應用msn 最大的麻煩,不過從追蹤 撰寫msn protocol,可以學到不少東西可說是額外的收穫,msn protocol在技術上跟xmpp真的很大的落差,msn protocol顯得格外凌亂設計不良,既不結構化也談不上功能上的彈性,看起來像是非資訊背景的工程師做出來的系統,我相信當msn與yahoo在談im整合時一定相互埋怨過對方的protocol設計怎麼如此草率,這恰好凸顯了xmpp protocol 的優勢...

207.46.110.86:1863
c2s->[client to server]
s2c->[server to client]

c2s->VER 1 MSNP15 CVR0
s2c->VER 1 MSNP15

c2s->CVR 2 0x0404 winnt 5.2 i386 MSNMSGR 8.1.0178 MSFT luke_shei@hotmail.com
s2c->CVR 2 8.1.0178 8.1.0178 8.1.0178 http://msgruser.dlservice.microsoft.com/download/1/C/F/1CF776CC-90D6-4497-B079-402BA9DB8BE4/Install_Messenger.exe http://get.live.com/tc

c2s->USR 3 SSO I luke_shei@hotmail.com
s2c->GCF 0 6713
s2c->
<Policies>(省略...)</Policies>USR 3 SSO S MBI_KEY_OLD ZUzrcaa4fRluSqjOaLzc9ExfHQaoiZB4MxTjfRcmohTooJuVilSvIJ7jSy+DKBeO

此時需要使用ssl 連接 https://login.live.com/RST.srf , 並且送出認證資訊
<?xml version="1.0" encoding="UTF-8" ?>
<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://schemas.xmlsoap.org/ws/2003/06/secext" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:wsp="http://schemas.xmlsoap.org/ws/2002/12/policy" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing" xmlns:wssc="http://schemas.xmlsoap.org/ws/2004/04/sc" xmlns:wst="http://schemas.xmlsoap.org/ws/2004/04/trust">
<Header>
<ps:AuthInfo xmlns:ps="http://schemas.microsoft.com/Passport/SoapServices/PPCRL" Id="PPAuthInfo">
<ps:HostingApp>{7108E71A-9926-4FCB-BCC9-9A9D3F32E423}</ps:HostingApp>
<ps:BinaryVersion>4</ps:BinaryVersion>
<ps:UIVersion>1</ps:UIVersion>
<ps:Cookies />
<ps:RequestParams>AQAAAAIAAABsYwQAAAAyMDUy</ps:RequestParams>
</ps:AuthInfo>
<wsse:Security>
<wsse:UsernameToken Id="user">
<wsse:Username>帳號@hotmail.com</wsse:Username>
<wsse:Password>密碼</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</Header>
<Body>
<ps:RequestMultipleSecurityTokens xmlns:ps="http://schemas.microsoft.com/Passport/SoapServices/PPCRL" Id="RSTS">
<wst:RequestSecurityToken Id="RST0">
<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>
<wsp:AppliesTo>
<wsa:EndpointReference>
<wsa:Address>http://Passport.NET/tb</wsa:Address>
</wsa:EndpointReference>
</wsp:AppliesTo>
</wst:RequestSecurityToken>
<wst:RequestSecurityToken Id="RST1">
<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>
<wsp:AppliesTo>
<wsa:EndpointReference>
<wsa:Address>messengerclear.live.com</wsa:Address>
</wsa:EndpointReference>
</wsp:AppliesTo>
<wsse:PolicyReference URI="MBI_KEY_OLD" />
</wst:RequestSecurityToken>
<wst:RequestSecurityToken Id="RST2">
<wst:RequestType>http://schemas.xmlsoap.org/ws/2004/04/security/trust/Issue</wst:RequestType>
<wsp:AppliesTo>
<wsa:EndpointReference>
<wsa:Address>messenger.msn.com</wsa:Address>
</wsa:EndpointReference>
</wsp:AppliesTo>
<wsse:PolicyReference URI="MBI" />
</wst:RequestSecurityToken>
</ps:RequestMultipleSecurityTokens>
</Body>
</Envelope>

https://login.live.com/RST.srf 回應

<?xml version="1.0" encoding="utf-8" ?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Header>
<psf:pp xmlns:psf="http://schemas.microsoft.com/Passport/SoapServices/SOAPFault">
<psf:serverVersion>1</psf:serverVersion>
<psf:PUID>0001613089FFCD2E</psf:PUID>
<psf:configVersion>3.100.2199.0</psf:configVersion>
<psf:uiVersion>3.0.869.0</psf:uiVersion>
<psf:authstate>0x48803</psf:authstate>
<psf:reqstatus>0x0</psf:reqstatus>
<psf:serverInfo Path="Live1" RollingUpgradeState="ExclusiveNew" LocVersion="0" ServerTime="2008-08-20T06:17:36Z">BAYIDSLGN1E20 2008.07.30.00.23.50</psf:serverInfo>
<psf:cookies/>
<psf:browserCookies>
<psf:browserCookie Name="MH" URL="http://www.msn.com">MH=MSFT; path=/; domain=.msn.com; expires=Wed, 30-Dec-2037 16:00:00 GMT</psf:browserCookie>
<psf:browserCookie Name="MHW" URL="http://www.msn.com">MHW=; path=/; domain=.msn.com; expires=Thu, 30-Oct-1980 16:00:00 GMT</psf:browserCookie>
<psf:browserCookie Name="MH" URL="http://www.live.com">MH=MSFT; path=/; domain=.live.com; expires=Wed, 30-Dec-2037 16:00:00 GMT</psf:browserCookie>
<psf:browserCookie Name="MHW" URL="http://www.live.com">MHW=; path=/; domain=.live.com; expires=Thu, 30-Oct-1980 16:00:00 GMT</psf:browserCookie>
</psf:browserCookies>
<psf:credProperties>
<psf:credProperty Name="MainBrandID">MSFT</psf:credProperty>
<psf:credProperty Name="BrandIDList">
</psf:credProperty>
<psf:credProperty Name="IsWinLiveUser">true</psf:credProperty>
<psf:credProperty Name="CID">15797708e38d3864</psf:credProperty>
<psf:credProperty Name="AuthMembername">帳號@hotmail.com</psf:credProperty>
</psf:credProperties>
<psf:extProperties>
<psf:extProperty Name="ANON" Expiry="Sun, 08-Mar-2009 13:17:36 GMT" Domains="" IgnoreRememberMe="false">A=604A1CF7C863B25590E98D87FFFFFFFF&E=751&W=1</psf:extProperty>
<psf:extProperty Name="NAP" Expiry="Fri, 28-Nov-2008 14:17:36 GMT" Domains="" IgnoreRememberMe="false">V=1.6&E=6f7&C=D3sTmCI3EaEA1q-Ugji4rYA5G76akrqFloSZtTfKwkT6_ToKa0MUog&W=1</psf:extProperty>
<psf:extProperty Name="LastUsedCredType">1</psf:extProperty>
</psf:extProperties>
<psf:response/>
</psf:pp>
</S:Header>
<S:Body>
<wst:RequestSecurityTokenResponseCollection xmlns:S="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wst="http://schemas.xmlsoap.org/ws/2004/04/trust" xmlns:wsse="http://schemas.xmlsoap.org/ws/2003/06/secext" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:wsp="http://schemas.xmlsoap.org/ws/2002/12/policy" xmlns:psf="http://schemas.microsoft.com/Passport/SoapServices/SOAPFault">
<wst:RequestSecurityTokenResponse>
<wst:TokenType>urn:passport:legacy</wst:TokenType>
<wsp:AppliesTo xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing">
<wsa:EndpointReference>
<wsa:Address>http://Passport.NET/tb</wsa:Address>
</wsa:EndpointReference>
</wsp:AppliesTo>
<wst:LifeTime>
<wsu:Created>2008-08-20T06:17:36Z</wsu:Created>
<wsu:Expires>2008-08-21T06:17:36Z</wsu:Expires>
</wst:LifeTime>
<wst:RequestedSecurityToken>
<EncryptedData xmlns="http://www.w3.org/2001/04/xmlenc#" Id="BinaryDAToken0" Type="http://www.w3.org/2001/04/xmlenc#Element">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc">
</EncryptionMethod>
<ds:KeyInfo xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:KeyName>http://Passport.NET/STS</ds:KeyName>
</ds:KeyInfo>
<CipherData>
<CipherValue>AXFOGn0CJ316qWBnizuzibVEto6s2I2AlZRmD69bPE+dfzAzqHWA3rjheo3p+wy46qtVQJXDw61/V9tVQZ3yFuQ2vuq4EWWaH5wB8RV6Bw5EVxJvlViM4FqNf7a/DaBSUCJqoPCGXxGRvXT5VYJDmMt/KAutuoO3ULh8r1aQYDs4JJQdFzHdst95oRQkeC4b1vzzNh4mRT/3y1C6wnplhlVhArpSRIf5yI5YYAz6dq0w2jzpfUZ/dJmz/vzfEsS3jV7eO0xptvy9X7wA/YM4U1r+8cIITG7DgfU85GhJmjh5P0LbvcZ6p39R/hNxUWJrHw5WU91qdVui0uMSOpQYloZxbtHtNWiQZ0Q2y+/YyGmX7THQdfyPqMSC7wl7gl2M+wwCrPzpUgpu2hRB89kUyARUz5O849F9uBy/DzV2u+l2oNmIzcOjhNDFqf9M003tJqV+ND7DA0KBJD/wQvHXP8M0OXRuTAxA4+z5bnqa858VgqwDrg==</CipherValue>
</CipherData>
</EncryptedData>
</wst:RequestedSecurityToken>
<wst:RequestedTokenReference>
<wsse:KeyIdentifier ValueType="urn:passport">
</wsse:KeyIdentifier>
<wsse:Reference URI="#BinaryDAToken0">
</wsse:Reference>
</wst:RequestedTokenReference>
<wst:RequestedProofToken>
<wst:BinarySecret>BZP+6JadxbOLyXqPL5Ryf1hHNpI9bYtU</wst:BinarySecret>
</wst:RequestedProofToken>
</wst:RequestSecurityTokenResponse>
<wst:RequestSecurityTokenResponse>
<wst:TokenType>urn:passport:compact</wst:TokenType>
<wsp:AppliesTo xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing">
<wsa:EndpointReference>
<wsa:Address>messengerclear.live.com</wsa:Address>
</wsa:EndpointReference>
</wsp:AppliesTo>
<wst:LifeTime>
<wsu:Created>2008-08-20T06:17:36Z</wsu:Created>
<wsu:Expires>2008-08-20T14:17:36Z</wsu:Expires>
</wst:LifeTime>
<wst:RequestedSecurityToken>

<wsse:BinarySecurityToken Id="Compact1">
t=EwBgAswbAQAUs1/VcBU2sH7mwYy3BysWZ71CRDGAAPyC8gbVv65DNR9B35NbtWgaPfSxjcx8TQRH7dSQkHl+pf46GQS1pukb1fNuh5NtW2fsIGDXCyNhyMBi4/BKhzeE66MGXBsfgdWzDzSj/SGnQYnZtvKLdBi9ihv1hR+q018ePodvV4x3Vlcet38/CE1yPd9t8Z/yhNyCBcufTbMVA2YAAAjOONh/nTbDBLABYnUuPlUVuIv9ImLzUxYuvlSzHsgEAxTJkrpnHNmJv4IS0lUGIO9+yvfEbAl46rS1vpr0MHN8uL4JIE7XkS7MHhElesCRHvMpWp/h2O9clTrk9P5krslyhepE45ZCWYyodEaCEPsD5ZEauYe4M8wf3Pm9mrF+vr0RiKwATDDz4Ow1QQ+zz/HS7XaKohPEsCQDLf5rnC+nsQha9053Wbsq6qrbTtAh5DHviCv2KjHVHykPufhlr1R/FTb4Pu/ufe3dt8r3pQseGcm0H16bYJBqlxqyG7ACIKha16xFYCltbENmNas4JGZvKWZMZsPL9XWiRwzwxg2kDUROlAZeW2AA2cBi+M8xjpZwpoktR5JbnZxu9qMta9s8576i/3plIxLxvvutva5FM/favzAauwbSZUX3virKDYKe569LyZxurrAWEmnPWNzj7ORajtvT1CXWcVwHMT+eu5oqW8PhPrKgIeCad5bRjnzyaG3WGNczkOdTcDJ8ybVCOztqrA90vqvSHS1qw1FL6JiJK0hIWHccwXrDoN7YGsnhtxhCFMLj2IQlD5KtA/SMsBJlSCtQKRa+xAE=&p=
</wsse:BinarySecurityToken>

</wst:RequestedSecurityToken>
<wst:RequestedTokenReference>
<wsse:KeyIdentifier ValueType="urn:passport:compact">
</wsse:KeyIdentifier>
<wsse:Reference URI="#Compact1">
</wsse:Reference>
</wst:RequestedTokenReference>
<wst:RequestedProofToken>

<wst:BinarySecret>
YdSj/GIkHNjeRoClluok9J4bYNsWVEea
</wst:BinarySecret>

</wst:RequestedProofToken>
</wst:RequestSecurityTokenResponse>
<wst:RequestSecurityTokenResponse>
<wst:TokenType>urn:passport:compact</wst:TokenType>
<wsp:AppliesTo xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/03/addressing">
<wsa:EndpointReference>
<wsa:Address>messenger.msn.com</wsa:Address>
</wsa:EndpointReference>
</wsp:AppliesTo>
<wst:LifeTime>
<wsu:Created>2008-08-20T06:17:36Z</wsu:Created>
<wsu:Expires>2008-08-20T14:17:36Z</wsu:Expires>
</wst:LifeTime>
<wst:RequestedSecurityToken>
<wsse:BinarySecurityToken Id="Compact2">t=EwDYAfsBAAAUAHmHi/fIK5MsbQWTulxz7EiCF2+AAFyqVQompSp1Zu7W3g7T5yMceStaxs7w5I8wsiIeECJSj2+j7V3JorQeMfR1Y5Z4Azu5z+VHsRDIPrBh7FUgleNZF9SMSrhYfCiEjstd2OWD2RIWzLFmoLdZlDmhAZp1SLtJlf52O5rK6LFwTQrBJCgwYcLrX2o9l1OnwUuIMe0sA2YAAAheN9vDJtdLsigBd3QSSEiD2MhG5sHTnl8nC9xg4TMGF1+p3MomH45rnQPiQrGsgSxbymrtvO3gDDe0GSMIfLCDxJikDWVeUGeqIfrYC/KMEBbKcK24O3H+BkiWNk8PinF8T1FNAv7kK4f/fO6/UucbIyVyZC81b8/ahFjxJ0Z8tYGF3TrAGJzvqWIrgK7Hr3EC2GaagbHs6i3c3u9aNxBWqL+2x2c4csFR79lPx+cyS4DvYY0AMf6DNt03Gy6NiG51oS5At2QMyP7xT+doH2SeDeVGM3fVCa3jL0JlkOZbDy6SxDMANfaPPfOQYEadQsubPyZBe7UDCwmN6X0iio4Jy1DJyWpbROKF+lPax8ICEtB2ZAYw8PUTkym/TSCmEwX54A/LKFa6mwvA33tr4hYIv/hEAQ==&p=</wsse:BinarySecurityToken>
</wst:RequestedSecurityToken>
<wst:RequestedTokenReference>
<wsse:KeyIdentifier ValueType="urn:passport:compact">
</wsse:KeyIdentifier>
<wsse:Reference URI="#Compact2">
</wsse:Reference>
</wst:RequestedTokenReference>
</wst:RequestSecurityTokenResponse>
</wst:RequestSecurityTokenResponseCollection>
</S:Body>
</S:Envelope>

====

BinarySecurityToken-> t=EwBgAswbAQAUs1/VcBU2sH7mwYy3BysWZ71CRDGAAPyC8gbVv65DNR9B35NbtWgaPfSxjcx8TQRH7dSQkHl+pf46GQS1pukb1fNuh5NtW2fsIGDXCyNhyMBi4/BKhzeE66MGXBsfgdWzDzSj/SGnQYnZtvKLdBi9ihv1hR+q018ePodvV4x3Vlcet38/CE1yPd9t8Z/yhNyCBcufTbMVA2YAAAjOONh/nTbDBLABYnUuPlUVuIv9ImLzUxYuvlSzHsgEAxTJkrpnHNmJv4IS0lUGIO9+yvfEbAl46rS1vpr0MHN8uL4JIE7XkS7MHhElesCRHvMpWp/h2O9clTrk9P5krslyhepE45ZCWYyodEaCEPsD5ZEauYe4M8wf3Pm9mrF+vr0RiKwATDDz4Ow1QQ+zz/HS7XaKohPEsCQDLf5rnC+nsQha9053Wbsq6qrbTtAh5DHviCv2KjHVHykPufhlr1R/FTb4Pu/ufe3dt8r3pQseGcm0H16bYJBqlxqyG7ACIKha16xFYCltbENmNas4JGZvKWZMZsPL9XWiRwzwxg2kDUROlAZeW2AA2cBi+M8xjpZwpoktR5JbnZxu9qMta9s8576i/3plIxLxvvutva5FM/favzAauwbSZUX3virKDYKe569LyZxurrAWEmnPWNzj7ORajtvT1CXWcVwHMT+eu5oqW8PhPrKgIeCad5bRjnzyaG3WGNczkOdTcDJ8ybVCOztqrA90vqvSHS1qw1FL6JiJK0hIWHccwXrDoN7YGsnhtxhCFMLj2IQlD5KtA/SMsBJlSCtQKRa+xAE=&p=
--
nonce-> ZUzrcaa4fRluSqjOaLzc9ExfHQaoiZB4MxTjfRcmohTooJuVilSvIJ7jSy+DKBeO
--
BinarySecret-> YdSj/GIkHNjeRoClluok9J4bYNsWVEea
--
此處的程式下一篇補上,將上述資訊做hash 3des 的加密...程式後,產生
HAAAAAEAAAADZgAABIAAAAgAAAAUAAAASAAAAAAAAAAAAAAAu1u3n7shOrO0b1zrRTR/+hPQ97ucXZ/4vd6sPYkgZjyEUBE+nF4Xe+y1WuNzKxLSIG9AcWpKbu0JYUa06PuyvvLCTtjeqipeyISPnyHncMivinI/LcZmGmhOpfo=
而這個值是下一個程序 USR 4 SSO S t=...&p=xxx 中的p值,而t值為BinarySecurityToken

====

c2s->USR 4 SSO S t=EwBgAswbAQAUs1/VcBU2sH7mwYy3BysWZ71CRDGAAPyC8gbVv65DNR9B35NbtWgaPfSxjcx8TQRH7dSQkHl+pf46GQS1pukb1fNuh5NtW2fsIGDXCyNhyMBi4/BKhzeE66MGXBsfgdWzDzSj/SGnQYnZtvKLdBi9ihv1hR+q018ePodvV4x3Vlcet38/CE1yPd9t8Z/yhNyCBcufTbMVA2YAAAjOONh/nTbDBLABYnUuPlUVuIv9ImLzUxYuvlSzHsgEAxTJkrpnHNmJv4IS0lUGIO9+yvfEbAl46rS1vpr0MHN8uL4JIE7XkS7MHhElesCRHvMpWp/h2O9clTrk9P5krslyhepE45ZCWYyodEaCEPsD5ZEauYe4M8wf3Pm9mrF+vr0RiKwATDDz4Ow1QQ+zz/HS7XaKohPEsCQDLf5rnC+nsQha9053Wbsq6qrbTtAh5DHviCv2KjHVHykPufhlr1R/FTb4Pu/ufe3dt8r3pQseGcm0H16bYJBqlxqyG7ACIKha16xFYCltbENmNas4JGZvKWZMZsPL9XWiRwzwxg2kDUROlAZeW2AA2cBi+M8xjpZwpoktR5JbnZxu9qMta9s8576i/3plIxLxvvutva5FM/favzAauwbSZUX3virKDYKe569LyZxurrAWEmnPWNzj7ORajtvT1CXWcVwHMT+eu5oqW8PhPrKgIeCad5bRjnzyaG3WGNczkOdTcDJ8ybVCOztqrA90vqvSHS1qw1FL6JiJK0hIWHccwXrDoN7YGsnhtxhCFMLj2IQlD5KtA/SMsBJlSCtQKRa+xAE=&p= HAAAAAEAAAADZgAABIAAAAgAAAAUAAAASAAAAAAAAAAAAAAAu1u3n7shOrO0b1zrRTR/+hPQ97ucXZ/4vd6sPYkgZjyEUBE+nF4Xe+y1WuNzKxLSIG9AcWpKbu0JYUa06PuyvvLCTtjeqipeyISPnyHncMivinI/LcZmGmhOpfo=
s2c->USR 4 OK luke_shei@hotmail.com 1 0
SBS 0 null
s2c->MSG Hotmail Hotmail 1234
MIME-Version: 1.0
Content-Type: text/x-msmsgsprofile; charset=UTF-8
LoginTime: 1219213056
EmailEnabled: 1
MemberIdHigh: 90416
MemberIdLow: -1979724498
lang_preference: 1028
preferredEmail:
country: TW
PostalCode:
Gender:
Kid: 0
Age:
BDayPre:
Birthday:
Wallet:
Flags: 1610613827
sid: 72652
MSPAuth: EwBgAswbAQAUs1/VcBU2sH7mwYy3BysWZ71CRDGAAPyC8gbVv65DNR9B35NbtWgaPfSxjcx8TQRH7dSQkHl+pf46GQS1pukb1fNuh5NtW2fsIGDXCyNhyMBi4/BKhzeE66MGXBsfgdWzDzSj/SGnQYnZtvKLdBi9ihv1hR+q018ePodvV4x3Vlcet38/CE1yPd9t8Z/yhNyCBcufTbMVA2YAAAjOONh/nTbDBLABYnUuPlUVuIv9ImLzUxYuvlSzHsgEAxTJkrpnHNmJv4IS0lUGIO9+yvfEbAl46rS1vpr0MHN8uL4JIE7XkS7MHhElesCRHvMpWp/h2O9clTrk9P5krslyhepE45ZCWYyodEaCEPsD5ZEauYe4M8wf3Pm9mrF+vr0RiKwATDDz4Ow1QQ+zz/HS7XaKohPEsCQDLf5rnC+nsQha9053Wbsq6qrbTtAh5DHviCv2KjHVHykPufhlr1R/FTb4Pu/ufe3dt8r3pQseGcm0H16bYJBqlxqyG7ACIKha16xFYCltbENmNas4JGZvKWZMZsPL9XWiRwzwxg2kDUROlAZeW2AA2cBi+M8xjpZwpoktR5JbnZxu9qMta9s8576i/3plIxLxvvutva5FM/favzAauwbSZUX3virKDYKe569LyZxurrAWEmnPWNzj7ORajtvT1CXWcVwHMT+eu5oqW8PhPrKgIeCad5bRjnzyaG3WGNczkOdTcDJ8ybVCOztqrA90vqvSHS1qw1FL6JiJK0hIWHccwXrDoN7YGsnhtxhCFMLj2IQlD5KtA/SMsBJlSCtQKRa+xAE=&p=
ClientIP: 59.120.234.89
ClientPort: 6413
ABCHMigrated: 1
Nickname: luke
MPOPEnabled: 0

Blog Archive