MB and Me: 國三邁向畢業中

2009/12/23

Coding practice of NVDA


My reviewed solution for P*B/SI C*D Engineer writing testing from my colleague and friend. Just for your consideration only, don't copy or publish without any permissions. There is no any warranties to use following in your project and solution.



1a)
class GraphNode {
    std::vector     adj_nodes;
    std::string                 node_name;
public:
    GraphNode(const char* name) : node_name(name) { }
    void                insert(GraphNode* v)    { adj_nodes.push_back(v); }
    
    const std::string&  name() const    { return node_name; }
    int                 size() const    { return adj_nodes.size(); }
    GraphNode*          operator[](int n) const { return adj_nodes[n]; }
    GraphNode*          get(int n) const { return adj_nodes[n]; }
};

1b)
void depthFirstTraversal (const GraphNode *root) {
    std::stack  stack;    
    stack.push(root);    
    while(!stack.empty()) {
        const GraphNode* vertex = stack.top();
        stack.pop();
        std::cout << vertex->name() << std::endl;
        for(int i=0, size=vertex->size(); i < size; ++i )
            stack.push( (*vertex)[i] );
    }
}


1c)
void breadthFirstTraversal (const GraphNode *root) {
    std::queue  queue;    
    queue.push(root);    
    while(!queue.empty()) {
        const GraphNode* vertex = queue.front();
        queue.pop();
        std::cout << vertex->name() << std::endl;
        for(int i=0, size=vertex->size(); i < size; ++i )
            queue.push( (*vertex)[i] );
    }
}


1d)
template struct my_hash {
  size_t operator()(const T* __s) const
  { return (size_t)__s; }
};
typedef __gnu_cxx::hash_map >  visit_hash;
bool hasCycle2 (const GraphNode* vertex, visit_hash& hash) {
    for(int i=0, size=vertex->size(); i < size; ++i ) {
        GraphNode* adj_node = (*vertex)[i];
        if(hash[ adj_node ])
            return true;
        hash[ adj_node ] = true;
        if( hasCycle2( adj_node, hash ) )
            return true;
        hash[ adj_node ] = false;
    }
    return false;
}
bool hasCycle (const GraphNode* root) {
    visit_hash   hash;
    return hasCycle2(root, hash);
}

2)
void showArcPoints(double x, double y, const Arc& arc, int n);
void printArcPoints(const Arc& arc, int n)
{
    const double diameter = arc.radius*2;
    const double cx = 0.5 * (arc.A.x + arc.B.x);
    const double cy = 0.5 * (arc.A.y + arc.B.y);
    const double dx = (arc.B.x - arc.A.x);
    const double dy = (arc.B.y - arc.A.y);
    const double length = sqrt(dx*dx + dy*dy);
    if( length == diameter )
        showArcPoints(cx,cy, arc, n);
    else if(length < diameter ) {
        const double height = sqrt( arc.radius*arc.radius - length*0.5*length*0.5);
        const double tdx = -height*dy/length;
        const double tdy =  height*dx/length;
        showArcPoints(cx+tdx, cx+tdy, arc, n);
        showArcPoints(cx-tdx, cx-tdy, arc, n);
    }
}

void showArcPoints(double x, double y, const Arc& arc, int n)
{
    double radian_A = asin((arc.A.y-y) / arc.radius);
    if(arc.A.x <= x)  radian_A = M_PI - radian_A;
    double radian_B = asin((arc.B.y-y) / arc.radius);
    if(arc.B.x <= x)  radian_B = M_PI - radian_B;
    double radian_diff = radian_A - radian_B;
    if(radian_diff < 0.0)
        radian_diff += M_PI * 2.0;
    radian_diff /= 1.0 * n;
    double radian = radian_A - radian_diff;
    std::cout << setprecision(3);
    std::cout << "(" << arc.A.x << "," << arc.A.y << ") " ;
    for(int i=0; i
        std::cout << "("
                  << arc.radius * cos(radian)
                  << ","
                  << arc.radius * sin(radian)
                  << ") ";
        radian -= radian_diff;
    }
    std::cout << "(" << arc.B.x << "," << arc.B.y << ")";
    std::cout << std::endl;
}

3)
void printDuplicates (const std::vector &items) {
    typedef std::map >   duplicate_hash;
    duplicate_hash   dup_count;  
    for(int i=0, size = items.size(); i < size; ++i )
        dup_count[ items[i] ] ++;
    duplicate_hash::const_iterator dup_iter;
    for(dup_iter = dup_count.begin(); dup_iter != dup_count.end(); ++dup_iter) {
        if(dup_iter->second >= 2)
            std::cout << dup_iter->first << std::endl;
    }
}




2009/11/10

測到的最快 WiMAX 速度


目前試用的全球一動 4G WiMAX 網路速度中,這次算是最快的一次。平常測最高大概是 3~4Mbps 下載,上傳倒是都很快。測試條件跟前一次都一樣,在金山東街位置,訊號品質滿格(~30dB)。所以這次測到的速度 6.28Mbps 算是第一次看到這麼快的速度,但是 speedtest.net 測到的速度是瞬間最快速度,也就是從頭到尾只要有一瞬間這麼快的速度,就會出現這個數值。所以用 HiNet 測速網頁就不太能出現這麼快的數值,因為他是整個下載完畢,從開始到結束的時間,去算平均的速度。而 ISP 自己本身的測速呢?可以參考速博的測速網站,避免經過太多 routing 和 peering 的頻寬問題。但是全球一動官網自己的測速網頁每次用都不太爭氣,因為每次測都很低。:P


2009/11/8

新竹 全球一動 4G WiMAX 搶先試用

全球一動免費封測活動中,很高興可以被選中為試用的用戶之一,搶先試用最新的無線網路科技 WiMAX。在 11/7 下午的時候,親自到場聽取說明和領取 WiMAX USB dongle。


簡單重點 Summary:
  1. 試用期間 11/7/2009 ~ 1/6/2010。USB dongle 價值 NT$ 3,500 免費贈送使用 (稅還是要繳的)
  2. 基地台架設由新竹市往北建置,新竹市訊號涵蓋率 97%
  3. 明年 1/6 後商轉,聽說費用比手機或其他上網費用便宜
  4. 測速速率可達下載 10Mbps,上傳 2Mbps。(實際傳輸速度則視訊號、對方網站而定)
  5. 測試提供實體 IP,不鎖任何 ports
  6. 目前僅提供 Windows 32-bit 連線程式。Linux、Mac OS X、64-bit Windows 暫不提供
  7. 目前服務據點在新竹市兩間"大x發"都有
此 USB dongle 為華碩生產製造,但是與網路上找到的 ASUS WUSB25E-32 照片不同。大小比較起來,感覺還比較小,大約一個 USB 隨身碟的大小。不像 3.5G 網卡或是電視/數位電視 dongle 那麼大。底下的圖可以看得出來,其實直接插在 USB 孔不用轉接頭,也不會佔用到另外一個 USB 孔的位子,如果使用滑鼠或其他隨身碟都沒問題。第一張圖還有可以轉各種角度的轉接頭,可以在使用時隨時調整角度,而不是人拿著 notebook 轉角度。比起 iPod shuffle 來說還小了點。第三張圖可以看到生產廠商和 NCC 認證字樣。

此 USB dongle 硬體 chip 為 Beceem 生產。目前找得到的 driver 只有 Windows 和 Mac OS X,所以我的MacBook就只能用BootCamp或是Virtual Machine來測試。國外的 Clear wire 有提供 Mac OS X 的驅動程式,因為他們使用的 4G WiMAX 也是有 Beceem 所生產的 chip。但是可能因為些許不同,驅動程式可以使用,但是無法啟動 USB dongle 的無線功能(雖然說已經安裝了 /System/Library/Extensions/BeceemAppleWiMAXAdapter.kext 以及修改 Info.plist 已符合 Vendor Id 和 Product Id,以及使用 windows\system32\macxvi.cfg 和 macxvi200.bin)。至於 Linux 也許可以透過 NDISWrapper 來載入 Windows NDIS 驅動程式(如同Linux使用Intel的wireless driver),但是缺少 Connection Manager 來做連線認證,即使成功加入 NIC interface,可能還是無法上網。(或許可以使用 Clear Connection Manager,參考\Program Files\Global Mobile\WiMAX WUSB25E-32\WiMAXCM.ini 設定來修改他的 profile,至少 Clear 的是用 Java 和 Adobe AIR 做的,可能比用 WINE 跑 .Net Framework 的全球一動連線程式來得可行)。

講完USB dongle硬體來談談軟體和網路部分。此 Dongle 為 USB Composite Device,也就是有隨身碟跟無線網路兩種。當第一次使用,因為沒有 driver,電腦會當成 USB storage。因此在裡面直接可以安裝驅動程式和連線軟體。但是第一次安裝的時候抽插插拔了很多次,因為電腦一直識別為 USB storage。而理論上電腦有 Windows Auto Run 功能,他會執行裡面的 autorun.inf,裡面會再去執行 InstVerif.exe,它除了會檢查和幫你安裝軟體外,會把 USB storage 退出然後讓電腦識別為 WiMAX device。但是 Auto Run 的功能大概很多人都關閉,一來是怕 USB 隨身碟的病毒,而來是 Microsoft 自己都不建議。安裝完後可以在網路連線的裝置中發現 WiMAX Network Adapter,而且一開始是斷線狀態,因為尚未透過連線軟體做認證。使用全球一動連線程式連線之後,就會分配到 IP 和可以看到訊號強弱。

而目前涵蓋的範圍如下圖所示,大概涵蓋了科學園區、新竹市區、高速公路、東西向快速道路、以及香山和新竹段的台鐵。我的測試地點首先在金山東街,其實已經算是蠻算外圍了,差點就跑出涵蓋區域外。但是很訝異的是,訊號可以達到滿格。訊號品質和強度為 28dB/-67dBm 附近。

至於使用官網提供的定位,則會把我的範圍定位到寶山那邊去。跟透過手機的基地台定位(手機沒有AGPS或GPS)比起來,還是差很大。手機裡面面的小藍點是定位位子,放大看還有淺藍色圓圈表示誤差範圍。而 WiMAX 定位則到寶山的明湖路去了。

因為這類的定位都是透過基地台的三角定位。一來是基地台的佈建位置或是設定的定位參數差異,所以造成這麼大的差距。而手機基地台定位差距,我的經驗是最大誤差2000m,但是大都 1200m 或是 800m 的距離,雖然手機有這麼大的誤差,但是定位點都差不多是目前位置附近。

使用 TWNIC 所提供的 whois 查詢,可以看到 IP 所申請的公司和資料。網段的申請大概今年年中而已。

透過 whatismyipaddress.com 來看自己的實際 IP,的確連到外面的 IP 和自己電腦所分配的是相同,所以電腦得到的是實體 IP。有實體的 IP,即使不是固定的 IP 相對好處也會比較多。例如透過 skype 或 msn 傳檔,可以直接連線而不需經過他人當中間的 peer 或 routing。自己電腦也可以分享或遠端遙控。

連到國外試試看,測試目前最熱門的 facebook 網站,透過 traceroute 可以看到是透過 seednet 連接。而前幾項的 211.78.0.0/16 則是「新世紀資通股份有限公司」,也就是速博。

免不了的就是測試實際的上網速度,使用 speedtest.net 來測試,雖然是國外的網站,但是測試 server 位於 TANet 的東海大學。前面雖然說使用的速度可以達到 10M/2M,但是可能因為訊號強弱,以及全部使用者的使用狀況,無法達到全速。因此測出來的下載速度不是很高,但是下載速度 1.91Mbps 已經算是有達到理想值。

Global Mobile 自己官網也有提供網路測試介面。訊號強弱在三四格(滿格為四格)之間跳動,而測出來的情況跟上者就差很大,上下傳分別為 1.5Mbps/0.35Mbps。可能也是因為很多人在測,或者是 server loading 造成。


再來談到網路速度,當然所有無線的都會依照訊號、距離、速度而有所差異。即使 ADSL 也會因為距離而有速度限制,但是因為是固定的,所以速度變化大概都固定。自己本身有使用台x大 3.5G 上網,但是他的 Latency 蠻高的,大概至少都有150ms以上。上網還沒問題,但是做些即時的事情像是 VNC、Terminal、網路遊戲等等需要立即的回應,就可能有些壞處或缺點。可是因為透過手機上網,手機可以在 windows 或 Mac OS X(不需driver) 就直接可以當做網路卡,就好像把網路線插入網路孔那麼簡單,不需要設定。或是透過 Bluetooth PAN (Personal Area Network)來給電腦使用網路。當然電信公司的網路優先權設定是語音資料封包會比較高過一般數據傳輸。

至於 Windows 7 和 64bit 的驅動程式,可以參考Comcast 2go Highspeed WiMAX / ZTE TU25 USB modem on Windows 7 x64 (沒有OS可以測試,不負責任提供參考)。因為大家都知道使用的 chip 是哪一家,一般硬體 vendor 都是拿公版driver來修改。而不同的 chip 搭配上的 firmware 不同,所以拿上面講的 windows\system32\macxvi.cfg 和 macxvi200.bin,才是給 ASUS 這隻用的 firmware。而連線軟體,在 64-bit 機器應該是可以跑32-bit應用程式沒問題的。

至於費率方面,因為沒有官方的公告,只有「聽說」比現在它家方案便宜。雖然現在外面 3.5G 上網公定價是種花電信850吃到飽,台x大800吃到飽。但是依照「實際」優惠方案,種花是680吃到飽,台x大是600吃到飽。以我的例子,因為不搭網卡,實際月租費是 699,再優惠 99,資料傳輸費免收,所以只要月繳 600 吃到飽。而實際 4G WiMAX 費率是多少可以吸引轉換則需要在考慮,而且如果只在北部跑的人,的確用 4G WiMAX 速度和訊號可能會比 3.5G 好,至少 4G WiMAX 就沒有那麼多的電信通話數據在佔頻寬,加上手機可能會在 3.5G/3G/GPRS 之間 handover,所以實際使用速度可能沒有 4G WiMAX 那麼穩。

另外一件事就是 ISP 之間的 peering,之前吵的很火熱的就是種花電信跟台x大、只有"遠x沒有訊號"等等公司在吵 peering 價格。因為大者衡大,所以大家都要跟他買頻寬。目前雖然透過 whois 知道 IP 是在今年七月註冊,但是在 TWNIC 頻寬調查的 10 月份資料,還沒有看得到頻寬資料,可能因為還沒正式營運關係,所以無法得知台灣一動 WiMAX 跟國內其他之間的頻寬,但因為 traceroute 知道大概是透過速博對國外、國內,因此大約看看速博對其他的連線頻寬可以大約估計。對國外的話,本來就只有那前面幾大家像是種花、seednet、台固、速博、TANet、中研院等等有能力自己拉有海外頻寬線路。

整體來說,第一次接觸到最新一代的無線網路技術,實在有點驚艷。對於網路速度、使用方式來說都很方便。一般使用網路的用途來說,頻寬也都很夠。雖然是試用,但是網路穩定度、運號品質,都有很高的評價。

2009/10/28

Pidgin in Mac OS X


Pidgin 是 Open Source 的即時傳訊軟體,我在公司也是用這套來連 MSN Messenger。因為 win2k 不能裝新的 MSN Messenger,而且又肥大,只好裝這個。但是好處也不少,外觀不像訊息視窗那麼花俏,傳個訊息聊天都不怕會被認為常常在聊天(其實很多工作和同事都靠 MSN 呀,傳簡短的訊息和 commands 都很方便)。
再來,他有 OTR 等加密功能,只要對方是 Pidgin 或是 Adium 等等 libpurple-based 程式,都可以加密。
當然 Pidgin 可以透過 Fink 或 MacPorts 等方式,在 Mac OS X 上本身就有的 X11 上,執行 X11 GTK 的版本。但是缺點就是不能直接內建中文、醜醜的 10 年之前 state-of-art 的外觀(好像敝公司的 unix-like 產品 GUI 都還是這種,經過了十年都沒變,程式寫法也是一樣,比 MFC 還難用),還要開 X11 視窗等等。而 Pidgin in Mac OS X 直接使用了 Mac OS X 的 native GTK,所有的 widget 都是漂亮的 Cocoa 介面,icon 也可以顯示在頂頭的 menu bar。一堆 Pidgin plugins 也都可以使用。
說了那麼多優點,來說說缺點。雖然可以切換輸入法,但是打字是沒有用的,英文字會直接出現。再來介面的字型需要調整,預設看到的中文是亂碼。

2009/9/29

Mac Box Set

請同學買的 Mac Box Set,因為他在 Apple 當 Intern,員工價 50% off + tax,換成台幣才三千左右。便宜呀,台幣賣 6290,原價美金 169 去算的話,即使算台灣的營業稅 +6%,6290 可是用美金匯率 35.11 才能買到的價格呀。

2009/9/17

TWNGSM 台灣大哥大 HSDPA 消失?

這幾天手機上不再出現 H 的 logo, 以前 H 表示 3.5G 訊號, 3G logo 表示只有 3G 訊號. HSDPA 以前理論值可以到 3.5Mbps, 3G 只有 384Kbps 下載. 這幾天因為看不到 H logo, 以為沒 HSDPA 可以用了, 結果測試一下速度, 還是破 3G 原本的速度. 應該只是基地台的訊號全部改成 3G 統一識別, 全部升級為 HSDPA 3.5Mpbs/7.2Mbps 的關係吧(猜測). 不過速度 ok 就好, 不管手機上面 logo 顯示為何

2009/4/21

Safari 4 與 Webpage Previews Cache (更新)

用 Safari 4 的使用者要注意囉。Safari 4 有 Webpage Previews 的 Cache 設計,所以你在 Top Sites 看到的畫面基本上都是之前瀏覽過的網頁抓圖。而這個圖檔的快取目錄為以下的位置。請開啟 Terminal 後打

du -sh `getconf DARWIN_USER_CACHE_DIR`com.apple.Safari/Webpage\ Previews
而裡面的檔案就是一堆 jpeg or png。如果你 cd `getconf DARWIN_USER_CACHE_DIR`com.apple.Safari/Webpage\ Previews 後再用 open 加上任一檔案,你可以發現圖檔就是網頁的 screenshot。
基本上這有兩個問題,第一是安全性問題,如果有人可以存取到你的權限或 root,就可以看到你之前瀏覽過的網頁畫面,包含可能是 HTTPS 的網頁。第二個問題是,這個快取沒有大小限制。我的已經長大到 2.1GB,國外 forum 中有人的是 3.2GB。基本上他是以16個16進位數字編碼的檔名,所以理論上會無上限的用光你的空間。
把 Top Sites 關掉並不會關閉在背景抓圖並建立畫面快取。
更新最新的方法,如果要關掉 Top Sites Preview,請結束 Safari 後,在 Terminal 打入或貼上以下命令
defaults write com.apple.Safari DebugSnapshotsUpdatePolicy -int 2
然後重新啟動 Safari。然後把上面目錄中的 *.jpeg *.png 砍光光。

2009/4/16

VMWare Fusion 2.0.4

根據 VMWare Fusion 2.0.4 的Release note修正了一項非常嚴重的漏洞。

Host code execution vulnerability from a guest operating system
A critical vulnerability in the virtual machine display function might allow a guest operating system to run code on the host. The Common Vulnerabilities and Exposures project (cve.mitre.org) has assigned the name CVE-2009-1244 to this issue.
即使 host 跟 guest 本身是兩個獨立的作業系統,但是藉由軟體本身的漏洞,guest 作業系統的程式可能爬出來,影響 host 端的作業系統和安全性。但是,Apple Mac OS X 上跑 Windows 虛擬機器,可能有人會覺得安全無虞,因為是不同的 OS。實際上研究和 demo 證實在 OS X 上還是會被藉由漏洞從 Windows 端的 guest machine 操控。所以,快更新吧。[Ref: VMware Fusion bug breaches the guest-host OS wall]