MB and Me: 畢業囉

2010/2/2

刪除 Mac OS X Key chain 的 CNNIC 根憑證 Root Certifications

依據刪除 IE 與 Firefox 的 CNNIC 根憑證這篇和在 Linux 上移除 CNNIC 憑證這篇
,提供 Mac OS X 底下刪除 Keychain 裡面的 CNNIC 根憑證。如圖。

Google Chrome 也因為是用系統 Keychain 裡面的憑證,所以 Chrome 就不用額外刪了。
至於 Firefox 3.6 就內建 CNNIC 根憑證,可以直接刪除。或是透過「編輯」把此憑證可以用來識別網站的選項取消。
此外,為何此事如此嚴重?其實不只瀏覽器,作業系統也是,MS 也內建把 CNNIC Root CA 加入新版的 OS Root CA。試想,如果今天瀏覽一個網站,使用者沒有逐一仔細檢視核發憑證的機構,就隨便確定進入網站輸入自己密碼,其實該網站可能是假的惡意網站,而 CA 正是由不是大家認可的 CNNIC Root CA 機構簽發。雖然你看到 mail.google.com 和憑證無誤,但是該網域並非真正 google 的 server farm。或是下載軟體,雖然看到 Microsoft 或是 Google 的憑證,但是事實上該憑證並非真正由原始簽發單位簽署,一般使用者也不會逐一檢視簽署者是誰。如此一來可能又不小心安裝了什麼後門或流氓軟體。
事實上當然偉大的中國政府不會這麼笨,例如 Google mail 有不少異議份子的帳號,就在內地透過 GFW 轉到假的 Google mail server 和自己簽發的 CA 去,透過 Man in the Middle 偷偷過濾和檢視私密資料。如此一來大家都會發現那堆 server 都是假的。但是透過偉大的 GFW,比如說特工可以懷疑某某 IP 來源是異議份子,僅對那子網域或 IP 進行轉向攻擊。某異議份子存取了自己 Google Mail,但其實透過 DNS 和 IP 轉向,轉到中國某內地 server 偽裝成 Google Mail,又有來自 CNNIC Root CA 簽發的簽證,無論在 Chrome、Firefox、IE 看來都像是 Google Mail,事實上他並沒有仔細檢視簽發者是 CNNIC 而不是 Thawte SGC (Google mail 真正核發簽署憑證的單位) 的 CA 簽署。照樣,即使 Google mail 已經因為前陣子中國駭客事件而全部預設 HTTP SSL 加密連線,依然可以照樣被滲透。
(當然以上都是假想和幻想,如有雷同,那就是對岸抄了我的劇本)

2010/1/30

我看 Apple iPad

有人說 iPad 只不過是大支的 iPhone 或是 iPod touch。沒錯,就功能等級上來看,以及執行的 iPhone OS 來說,這些裝置看來都是同等級的。很多人批評,沒有啦哩拉雜的一堆功能。的確,是的,這也許就是蘋果努力的方向。
Microsoft 或很多 PC 廠商的觀念,就是要把 PC 整個功能縮小化,變成移動裝置的使用經驗。所以從以前的 Tablet PC,跑著 Windows Tablet Edition,或是現在的 Netbook 搭配 Windows XP,都是縮小化的 PC 而已。即使你用觸控筆或手指點著螢幕選單,小圖示等等,其實你只是把手當做滑鼠使用而已。
以前我也用過 Tablet PC,用手指在 LCD 面板上直接摸,但大概很多人會比較疼惜 LCD。用觸控筆,就很難有人類四肢的直接指揮控制權。而上面跑的 Windows Tablet Edition,跟一般 Windows 沒有兩樣。你要點開始,從小小繁雜的選單中,正確無誤地"擊中"那個選項。現在看來這是多麼準確無誤地操作方式,但是累死的會先是使用者。我看過最多 Tablet PC 的應用,其實就是拿來簽名。很多大人物拿台 Tablet PC,唯一看得到的就是他簽個大名在上面,然後很推薦 Tablet PC。所以那麼貴的機器,其實只是個簽名裝置。
而蘋果的 UI 體驗,是讓你從手機、家電的角度去使用電腦。其實對蘋果而言要讓 Mac OS X 的 Aqua 介面直接跑在 iPad 有何困難?為什麼要重新弄個 Mac OS X 核心配上是 Cocoa Touch 的 iPhone OS?因為 Apple 知道,他們的 Mac OS X Aqua UI 設計是基於鍵盤、滑鼠以及使用者坐在螢幕前使用輸入裝置移動的經驗。所以他的 menu bar 總是在最上頭,讓你想都不用想直接滑鼠一推,就到 menu bar。他的 Core Graphics 和 exposé  配合得天衣無縫,讓你排列視窗、選擇視窗、顯示桌面等等,平滑順暢無比。你很難想像 Apple 在 G4 800Mhz CPU 上,就可以透過 exposé,即便放電影的視窗和其他視窗平整地排列在螢幕上讓你選取,而影片的話面卻依然平順地播放。這種東西直到 MS Windows Vista/7 才有,而且還要很好的顯示卡才能開。
什麼,沒辦法多工,那是騙人的。沒辦法多工,那麼底層的 Mac OS X kernel 和 services 不都玩假的。那怎麼一邊背景放音樂,一邊作別的事情?Apple 想要的意圖在於,UI 操作上就簡單、唯一。就像操作手機和家電一樣簡單,前景是什麼介面,就代表該裝置目前表示的是哪種家電。如果 UI 多工了,我想 Apple 只好搬出 Aqua 那套。Scalable Dock、Expose、Menubar、... 好吧,大家回到 Windows Tablet PC 那種使用經驗去了。其實,在 netbook 的 Ubuntu Netbook 版的 GUI 設計上,每個應用程式都會被最大化佔滿螢幕。你沒辦法 resize,唯一就是縮小放到背景。應用程式就大喇喇地排列在桌面上的每個類別裡,而非選單。某種程度上就是呼應這種小裝置的使用方式。
此外 Apple 開出來的 iPad 硬體方面,被批評的體無完膚。都什麼時代的科技,沒有直接內建 SD/MMC slot、HDMI、等等。但是他的軟體使用經驗上,卻又被大家覺得很驚艷。雖然在 iPhone 和 iPod touch 大家已經體會過那種感覺。這次就不會像從無到第一次體驗完美的 multi-touch 硬體那麼讓人驚艷。因為他賣的是一種 services,一種體驗。而不像 PC 賣給你一堆硬體,然後有些很難用的軟體搭配,可以操控使用硬體,這樣就是廠商的責任,剩下是付錢使用者自己的事
再來,Apple 這種設計方式,我一直覺得他並不是故意要漏掉或省掉某些硬體。而是,他們的各種產品搭配度和軟體整合度是非常高的。如果買了一項產品,似乎就類似無止盡地黑洞一樣。買台 iMac/MacBook 搭配 iPad/iPhone,分享和同步照片、音樂、應用程式等等,畢竟 iPad 設計意圖是一台 portable device,真正桌機要作的事,還是交給桌機。

2010/1/19

國防役期滿

上週末已經就期滿了,算是 lag 的文章。慶祝一下自己國防役期滿。其實有沒有綁約是沒有差別的,總是對自己的努力和工作負責。唯一的差別就是心裡面爽字而已。因為,像王葛格一樣身為自由球員,合約不滿意,可以不要簽不要待。

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 才能買到的價格呀。