刪除 Mac OS X Key chain 的 CNNIC 根憑證 Root Certifications
依據刪除 IE 與 Firefox 的 CNNIC 根憑證這篇和在 Linux 上移除 CNNIC 憑證這篇
,提供 Mac OS X 底下刪除 Keychain 裡面的 CNNIC 根憑證。如圖。
至於 Firefox 3.6 就內建 CNNIC 根憑證,可以直接刪除。或是透過「編輯」把此憑證可以用來識別網站的選項取消。
依據刪除 IE 與 Firefox 的 CNNIC 根憑證這篇和在 Linux 上移除 CNNIC 憑證這篇
,提供 Mac OS X 底下刪除 Keychain 裡面的 CNNIC 根憑證。如圖。
Posted by
Taiwan RD
at
23:26
0
comments
有人說 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,真正桌機要作的事,還是交給桌機。
Posted by
Taiwan RD
at
00:51
0
comments
上週末已經就期滿了,算是 lag 的文章。慶祝一下自己國防役期滿。其實有沒有綁約是沒有差別的,總是對自己的努力和工作負責。唯一的差別就是心裡面爽字而已。因為,像王葛格一樣身為自由球員,合約不滿意,可以不要簽不要待。
Posted by
Taiwan RD
at
21:00
1 comments
Labels: SS
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
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.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.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
size_t operator()(const T* __s) const
{ return (size_t)__s; }
};
typedef __gnu_cxx::hash_map
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
typedef std::map
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;
}
}
Posted by
Taiwan RD
at
10:30
0
comments
Labels: programming
Posted by
Taiwan RD
at
07:52
0
comments
Labels: WiMAX
在全球一動的免費封測活動中,很高興可以被選中為試用的用戶之一,搶先試用最新的無線網路科技 WiMAX。在 11/7 下午的時候,親自到場聽取說明和領取 WiMAX USB dongle。
Posted by
Taiwan RD
at
21:32
0
comments
Posted by
Taiwan RD
at
20:50
0
comments