[ Erlang + ActionScript ] System Monitor

2009-05-12
在畢業設計裡加入了一個遠程的服務端負載監測功能,可以遠程查看服務端的當前CPU負載、內存分配等狀況,效果圖如下:
 前台用Flex實現,Flex的圖表組件很好用,坐標軸能自動根據數據來調整,不過數據綁定上好像有點問題,數據源更新了圖表卻不會自動刷新~~後台由Erlang提供數據,Erlang的OS_MON模塊可以提供系統CPU負載、內存狀況、硬碟空間使用情況等系統信息~~Erlang通過Socket主動推送JSON格式的數據給客戶端~~有興趣的話可以看看源碼:

客戶端源碼 / 服務端源碼

Erlang處理JSON數據~~

2009-05-09
要用Erlang處理JSON數據,先下載這個東東:
JSON and JSON-RPC for Erlang
下載解壓編譯完之後,輸出的beam文件在ebin目錄下~~

上面下載的包裡有一個rfc4627模塊,提供了JSON數據的encode、decode等方法,還可以將JSON與Erlang Record相互轉換,十分方便快捷,下面看看用法:
首先試試將字符串轉換為Json Object:
1> JsonBin = <<"{ 
1> \"username\":\"Oscar Tong\",
1> \"password\":\"123456\",
1> \"male\":true,
1> \"age\":23
1> }">>.
<<"{\n\"username\":\"Oscar Tong\",\n\"password\":\"123456\",\n\"male\":true,\n\"age\":23\n}">>
2> {ok, {obj, JsonObj}, _Rest} = rfc4627:decode(JsonBin).
{ok,{obj,[{"username",<<"Oscar Tong">>},
          {"password",<<"123456">>},
          {"male",true},
          {"age",23}]},
    []}

再轉換為JSON格式的字符串:
3> rfc4627:encode({obj,JsonObj}).
"{\"username\":\"Oscar Tong\",\"password\":\"123456\",\"male\":true,\"age\":23}"
經測試表明,JSON數據的解析與處理速度比XML要快得多,decode和encode僅耗時約40us,比xmerl模塊處理XML需要超過200us相比實在是快多了~~

ActionScript處理JSON數據~~

要用ActionScript來處理JSON數據,首先下載這東東:
as3corelib

as3corelib包裡有一個JSON類,可以將一個AS Object轉換為JSON格式的字符串,例如:
var obj:Object = {
    username : "Oscar Tong",
    password : "123456",
    age : 23,
    male: true,
    contacts: {
        mobile: "13800138000",
        phone: "020-39322849",
        addr: "guangdong university of technology"
    }
}
  
var json:String = JSON.encode(obj);
trace(json);

輸出JSON格式的字符串為:
{"username":"Oscar Tong",
 "age":23,
 "password":"123456",
 "male":true,
 "contact":
    {"addr":"guangdong university of technology",
     "phone":"020-39322849",
     "mobile":"13800138000"}
}

貌似輸出結果的順序有點亂了,另外JSON還有一個靜態方法decode,可以將JSON格式的字符串轉換為一個AS Object,具體自己看看包裡附帶的reference吧~~

精簡URL以減輕網站流量壓力?

這篇文章《Thinking outside the box - Filenames and Web Optimization》講述了長URL如何吃掉高流量網站大量的帶寬,以及提供了一些解決方法,值得看看~~

gen_tcp:controlling_process BADARG error ??

2009-05-07
今晚嘗試了一下在ERLANG裡將SOCKET鏈接的控制進程轉到另一個節點上去,結果得了一個{error,badarg}錯誤,代碼如下:
....
{ok, Sock} = gen_tcp:accept(Listener),
Pid = spawn(SomeOtherNode, Mod, Fun, Arg),
ok = gen_tcp:controlling_process(Sock, Pid),
....
看來想用這種方式來將眾多SOCKET鏈接的壓力分擔到多個節點上是不行的 -____- |||

Erlang的進程信息過濾

2009-05-06
Erlang進程之間可以通過收發信息來通信,有時可能有一堆信息從各處無序的湧來,你只想處理其中部分信息,而將其他的保留在進程的收件箱裡遲點再管,那該怎麼搞呢?其實很簡單的,看下面代碼:
...
wait_for_reply() ->
    receive
        {reply, Reply} -> handle(Reply);
        _Other -> wait_for_reply()
    end.
上述函數僅處理匹配{reply, Reply}格式的信息,其他信息因為唯一的匹配模式是一個被忽略的參數_Other,因此不會被處理而繼續留在收件箱裡~~

Erlang : head mismatch ??

2009-05-02
今天編譯代碼的時候出現了一個奇怪的問題,erlang老提示某個函數有head mismatch錯誤,但我看來看去沒發現什麼不對哇,函數的定義和調用都沒錯~~最後發現原來是因為函數放置了在兩個重名函數之間,即:
出錯前:
myfun(params1) -> .... ;
myfun(params2) -> .... .

這樣就會提示錯誤了:
myfun(params1) -> .... ;
new_fun_here(params) -> .... .
myfun(params2) -> .... .
把新函數放到其他地方就OK了~~粗心之過~~

M-OSCAR | Powered by Blogger | Entries (RSS) | Comments (RSS) | Designed by MB Web Design | XML Coded By Cahayabiru.com