2010年9月26日 星期日

抱怨!Google的產品彼此支援度不佳....

剛剛在編輯blogger上的文章時,發現不管怎麼弄,文章內的style一直就是弄不好...最後,想到該不會是Google Chrome的問題吧...所以換到Safari 5.0.2再試一次,結果就OK了...........

其實不只這件,Chrome在某些HTML的呈現與layout效果,似乎也不是很正確,反而是Safari真的是比較正確一點,也比較沒有問題...要不是Safari的memory usage比較大,而且

這真的是一大諷刺啊...Google...

Singleton pattern for Objective-C

在Java中,要撰寫一個應用Singleton pattern的class十分容易。但是在Objective-C中,就沒這麼簡單了。原因在於物件與記憶體的配置與管理機制是完全不同的(個人見解,不見得對)。

其實原理是都很類似,就是設法讓app只產生一個object instance,而且是透過特定的static method來獲得這個instance,而不是透過constructor來建立各個獨立的instance。對於一些某些需要集中管理的資訊或是資源,singleton pattern十分有用。

在Objective-C中,因為無法宣告constructor為private,所以很難避免使用者去呼叫。另外,因為Objective-C的alloc/retain/release/dealloc的機制,所以我們也必須去處理有關instance reference count的問題,不然很容易會出現記憶體管理的問題...而造成災難。

如何撰寫呢?首先,先在header file中定義要取得singleton instance的static method,例如:
+ (id) sharedInstance;
然後,在對應的.m檔案中,添加下列內容:
static MyManager *instance = nil;

@implementation MyManager

#pragma mark Singleton Methods
+ (id)sharedInstance {
@synchronized(self) {
if(sharedMyManager == nil)
sharedMyManager = [[super allocWithZone:NULL] init];
}
return sharedMyManager;
}

+ (id)allocWithZone:(NSZone *)zone {
return [[self sharedManager] retain];
}

- (id)copyWithZone:(NSZone *)zone {
return self;
}

- (id)retain {
return self;
}

- (unsigned)retainCount {
return UINT_MAX; //denotes an object that cannot be released
}

- (void)release {
// never release
}

- (id)autorelease {
return self;
}

- (id)init {
if (self = [super init]) {
// initialize your instance variables
}
return self;
}

- (void)dealloc {
// Should never be called, but just here for clarity really.
// release your instance variables
[super dealloc];
}
@end
首先,是定義全域變數instance,用來表示此class的singleton instance。然後實作之前定義的singleton method,讓它傳回該instance variable,如此一來,只要呼叫此method,就可以取得同一個instance。其他的method都是override原本NSObject的定義。主要是用來處理reference count的問題,用來避免該instance被不小心release掉。其中,在init跟dealloc,可以對自己定義的instance variables做初始化跟回收。原則上,Objective-C的singleton pattern大概就是長這樣。

心得:比起Java,真的複雜多了...而且老實說,我也不知道這樣想是不是真的沒問題...只是目前google到的寫法,大多是長得類似這樣。

檢查MacBook Pro的硬體錯誤

一般來說,當安裝了新硬體之後出現問題,通常就是得自己想辦法從混亂的情況中,找出可能的原因。尤其是安裝了像是RAM或CPU這類的東西。有時候新的RAM有問題或是不合於目前硬體,是不會造成無法開機,但是就會讓你出現很多類似靈異現象的事。

在Windows中,至少我所知道的,就是只能用自己經驗跟third-party的硬體檢測軟體來判斷。但是每套硬體檢測軟體的結果又都不太一樣。

最近,我幫我的MacBook Pro加到了8GB,本來很高興的要工作,但是卻一直有很多不太正常的事...當然,很直覺的就判斷可能是RAM的問題。但是,該怎麼確定呢?於是Google了一些軟體做檢測,但是結果也是時好時壞。
但是後來發現,原來...Apple在出廠時所附的Application installation disc中,就有「Apple Hardware Test」的程式。只要把該片放入光碟機之中,然後在開機時按住「d」,就可以進入「Apple Hardware Test」,檢測很簡單,就是「標準測試」與「延伸測試」兩種。基本上,如果連標準測試都沒辦法過,就是有很明確的問題了。而我的問題在連續三次的標準測試都指出是RAM的問題...所以當然就是去創見處理囉~

結論:再也不用為了硬體檢測問題傷神了~

2010年9月25日 星期六

在Ubuntu Server Edition上安裝GUI介面

想把server改成用Ubuntu Server,但是又不想只用command line的方式來管理與設定系統。所以就想到在Ubuntu Server上面裝上gnome...但是又不想安裝完整的gnome

在參考How to install GUI in Ubuntu Server之後,自己就試著用
sudo apt-get install x-window-system-core gnome-core
結果真的可以安裝很簡易版本的gnome...幾乎沒有任何GUI app...連synaptic都沒有,所以只好再用apt-get來安裝