2011年3月17日 星期四

RMI in C++



之前設計 Client/Server 程式時,都是用 message 來當作 protocol。
例如:


#define msg_open  1
#define msg_close 2
...


Client 將 message 透過 socket 傳給 Server,Server 再對此 message 做解譯動作。
這種設計方式簡單,但常常要處理很 routine 的工作,自己要處理封包代表的意義。(也就是要解釋 buffer size 的大小問題)


比較好的處理方式是用 remote procedure call 的方式,將複雜的底層處理過程包裝起來,client 需要 server 服務時,只要利用類似 function call 的方式就可以達成目的。
通常這種做法像是 COBRA 通常都要用 IDL 的方式,寫一個語言無關的介面,然後再利用程式碼產生器產生出目的語言 (C++、Java...etc)


下面這篇文章,就不用額外的程式碼產生器,而是利用 C++ preprocessor 來產生 C++ code,也就是只需要 C++ compiler 就搞定啦。
http://www.codeproject.com/KB/threads/Rcf_Ipc_For_Cpp.aspx

不過要注意的是:
1. 需要 C++ boost library  (用到 Asio)
2. 我用 VS2010 編譯時,發生  error C3861: '_cpp_max': identifier not found 
     解法再此 link 
     https://connect.microsoft.com/VisualStudio/feedback/details/553420/std-cpp-max-and-std-cpp-min-not-available-in-visual-c-2010
      
3.  附上作者寫的 User Guide http://deltavsoft.com/w/RcfUserGuide/1.3/

    有興趣可以玩玩看!! Have Fun!!

[Introduction To Algorithms] 第四堂: Divide-and-Conquer(3)

這堂課講 Divide and Conquer 的第二種方法,和第三中方法(講一部分)。 The tree-recursion method and The master method。


The tree-recursion method 基本上就是先畫圖把時間估算一下,然後再用 substitution 證明。












第三種方法在大部分的 Divide and Conquer 都可以用,以前對於 master 的解釋有點模糊,現在知道是 leaf 層和其他層的總和誰是老大的問題 (master)


接下來就是有三種情況討論

  • 小於
  • 等於
  • 大於
老師把觀念講出來,詳細證明自己要看教科書。




降~

2011年3月15日 星期二

[Head First JavaScript] Chap1: 互動性網站

這一章利用簡單的動性 iRock 程式介紹 JavaScript,當滑鼠移到石頭後,會出現一彈跳視窗叫你輸入名字。


跟一般 C/C++ 程式不同的是,JavaScript 是以直譯形式跑在瀏覽器上,因此要嵌入在 HTML 的語法裡。




這時候理解 HTML、CSS、JavaScript 三者的分工關西就很重要。
HTML: 程式的骨架。
CSS: 程式的外觀。
JavaScript: 讓程式有互動性。




程式很小,我就把程式碼都貼上來。





























  • JavaScript 應該要嵌入在 HTML 的哪裡。
  • onload 直接寫在 body 裡面... (JavaScript 的另外一種放法??) 這段我就不適很了解,是CSS還是JavaScript的功能。




[Introduction To Algorithms] 第四堂: Divide-and-Conquer(2)

第一堂課去台北參加 VS2010 C++ 開發日,聽錄音檔後再補,今天講的主要介紹,估算 asymptotic notation 的方法 -- The substitution method 。


這方法有兩個步驟,
1. Guess the solution  (猜)
2. Use induction to find constants and show the solution works (建構式歸納法)


觀念上和數學歸納法一樣,只是因為是 asymptotic notation 所以像是 boundary case 就不是那麼重要(immaterial) (時間函數是單調遞增)。
base case 也不用證明,只要
對 ο: c 挑足夠大
對 Ω: c 挑足夠小
這樣就可以蓋過 base case










在推導的過程中,若是遇到天花板、地板的證明就很惱人,要多一些調整的式子。
















Big-O 的證明還好,但是Ω 的證明就很麻煩(tedious)了。


所以老師補充了 smooth 的 Lemma 最後推導出只要是 poly 和 對數函數,都可以省略天花板和地板
但是,指數函數就不能夠省略。










證明過程請參考 p.21 ~ p.27 。
p.26 頁說明如何估算指數函數有天花板地板的 T(n)




















注意 smooth 的條件
1. 單調遞增
2. f(cn) = O(n)
因為是單調遞增,且 smooth,所以  bk 和 bk+1 看起來是 smooth,不會像上一張圖有跳 tone 的感覺。








這張投影片說明如果是用 asymptotic notation 表示 recurrence ,有何差異,結論是沒甚麼差, θ(n)=cn 這時的 c 是已知,推導下來只要 d 夠大就沒問題了。下張投影片是簡潔的寫法,不過要寫的精確也是要沒問題的啦!















2011年3月14日 星期一

[Distributed Algorithms] 第二堂: Mutual exclusion (2)

今天上 chap 10,開始講 modelling 的觀念,進入一堆證明,不過還是屬於 mutual exclusion 的範疇內,沒想到有這麼多種的 mutual exclusion。


花了最多時間講 Dijkstra’s Mutual Exclusion Algorithm




屬要證明三個部分:

  • well-formedness   
  • mutual exclusion
  • progress
well-formedness 老師說不用甚麼證明,但我對於這個概念還是很模糊,mutual exclusion 用上禮拜的反證法概念。

老師還有特別證明,像是任兩個 process 甚麼情況有可能同時到達 flag(i):= 2 這行,但同一情況不可能一直發生。

對於 Mutual Exclusion 三位大師都有證明:

Dijkstra  : 有 starvation 發生
Knuth     :  (忘記了)
E-M       : 最好

上面的演算法,沒有 atomic,以 
  while turn != i do
     if flag(turn)=0 then turn:=i 
為例這兩個 turn 支間可以相隔很久,而且第二個 turn 沒有多讀的必要,這是因為 psuedo code 太高階了,課本範例有介紹用 pc counter 來達到 atomic 的寫法。
eq.  (此 action 利用 precondition 當 pc counter 等於 set-flag-1 時就執行)
    set-flag-1
    Precondition:
       pc=set-flag-1
    Effect:

接下來證明複雜的 Progress...
課本用了很多 lemma 來說明,比較容易的想法是,CS 是空的時,很多人想進去,那最後 turn 一定會進入穩定狀態,而那個拿到 turn 的 process 也就勢如破竹的進入 CS 了。
課本上還用了比較學理的證明,但是那個太邏輯了,老師說沒甚麼必要(跳過)... XD


  •  Lockout-freedom : 不會餓死 (something good will eventually happened)
  • Number of bypass a: 其他人最多執行 a 次 (something bad can not happened)
老師說這兩種狀況要注意,證明的方法很不一樣 





接下來介紹 Peterson2P 和 PertersonNP 
2P 比較好懂,NP 的證明就比較難,老師舉了想像 N-1 階樓梯,有 N 個老鼠想進去,每個階梯會黏住一個老鼠,所以最後會只有一隻能進去。
這些擰人化的想法只是幫主想像,學理上的證明還是要學院派一點 -= =

最後提到 BurnsMe Algorithm
這個觀念就用長幼有序的方式去想,
尊敬一次後,舉手,在尊敬一次,等後輩執行完後就不客氣了。


舒服!!










    





2011年3月13日 星期日

Virtualbox Ubuntu Linux 更新後共享資料夾不能用的問題

之前也遇過這樣的問題,網路上找了很久,有找到一篇文章要用 modprob 之類的指令,
後來發現只要重新安裝 guest additions 就可以了,也花了一些時間查詢怎麼重新安裝 guest additions
後來用大絕招,在 win 7 virtualbox 的安裝目錄下把 VBoxGuestAdditions.iso 改名然後再從網路更新,就完畢了!!


舒服~ 

2011年3月8日 星期二

[Distributed Algorithms] 第二堂: Mutual exclusion

今天講了三個主題:
 Asynchronous shared memory model,
 Mutual exclusion problem definition,
 Dijkstra's mutual exclusion algorithm 
老師花了很長的時間再講 OS 的 Mutual Exclusion,
old-hw1.pdf 是 mutual exclusion 的 algorithm,
http://en.wikipedia.org/wiki/Eisenberg_McGuire_algorithm 不過 wiki 的這個版本就講得蠻清楚的了。


old-hw1_ans.pdf 裡面是解答。


證明要證明三件事:

  • Safety
  • Progress (Liveness)
  • bound waiting of (n-1) turn
這演算法基本上是講你要進入 CS ,第一要聲明想進去,第二要拿到權杖 (turn)...
好像以前補 OS 的時候有講到這個演算法 (遙遠的回憶啊~~)

我自己的問題是 turn := i 這行需不需要 atomic ...

這次還不習慣老師講解的方式,筆記做的很糟糕~~
我抓的 pdf 和課本好像也不太對 = =

XD 再加油