2013年12月30日 星期一

使用Anki背單字

anki demo

這陣子想要加強英文能力,於是在網路上找了一些軟體輔助,後來找到了Anki這套軟體。這是一套用單字卡輔助記憶單字的軟體,可以紀錄學習狀況,達成更有效率的學習,可以在看一下別人寫的Anki簡介。另外已經有人整理好極品GRE紅寶書(繁體中文)+聲音檔這一份資料,只要下載並import進anki就不用煩惱如何自行加入卡片或是設定英文發音等細節了。最後附上Anki的Github網址,原來Anki是用python寫的啊…

2013年12月16日 星期一

Mac下好用的翻譯軟體+Chrome plugin

有道词典Mac版demo

有道词典Mac版 http://cidian.youdao.com/mac.html
裝了之後還不能在chrome選詞翻譯,要再加裝有道词典的chrome plugin,plugin從這裏下載

裝好plugin之後,打開有道词典Mac版,重新開啟chrome,圈選單字就會出現翻譯了。

2013年12月13日 星期五

MacVim+gocode+YouCompleteMe

主要參考這篇讓編輯器支持 Go 語言

需要下載帶有vim7.4版以上的MacVim。MacVim不是使用$PATH,而是使用/usr/libexec/path_helper,參考记录遇到的零碎问题
etc/paths.d下面新增一個go檔案,內容為/usr/local/go/bin
裝Vundle https://github.com/gmarik/vundle
如果是MacOS在裝vim-gocode前需要先brew install coreutils
裝vim-gocode https://github.com/Blackrush/vim-gocode
在vim裡下:BundleInstall

更多資訊可以參考hSATAC的 Golang Vim 配置

2013年12月11日 星期三

在Objective-C 裡如何測試 Singleton

製作Singleton

Cocoa Samurai的 Singletons: You’re doing them wrong 這篇文章提到了一種良好的singleton建構方式。

+(MyClass *)sharedInstance {
 static dispatch_once_t pred;
 static MyClass *shared = nil;

 dispatch_once(&pred, ^{
  shared = [[MyClass alloc] init];
 });
 return shared;
}

這個寫法的優點有三
1. 在整個app生命週期裡只會被執行一次
2. thread safe
3. 比用@synchronize()快

測試Singleton

現在想像有一個class用到了這個singleton,而當我們要對這個class做unit test,測試是否如我們預期般運作的時候問題就來了。在做unit test的時候,受測物件必須隔離與其他物件的相依性,否則就變成integration test了。我們通常會用mock達成這個目的。

例如我們有下面這段code

- (void)doSomething
{
    [[ArticleManager sharedInstance] doSomethingElse];
    ...
}

顯然的,它只會取得唯一存在的instance,沒有讓你mock的機會。這時可以採用 Objective-C Singleton Pattern Updated For Testability 這篇文章提到的方法,把singleton做一點變形。

@implementation ArticleManager

static ArticleManager *_sharedInstance = nil;
static dispatch_once_t once_token = 0;

+(instancetype)sharedInstance {
    dispatch_once(&once_token, ^{
        if (_sharedInstance == nil) {
            _sharedInstance = [[ArticleManager alloc] init];
        }
    });
    return _sharedInstance;
}

+(void)setSharedInstance:(ArticleManager *)instance {
    once_token = 0; // resets the once_token so dispatch_once will run again
    _sharedInstance = instance;
}

@end

在做測試的時候

id mockManager = [OCMockObject mockForClass:[ArticleManager class]];
[ArticleManager setSharedInstance:mockManager]; //把instance換成我們的mock
/*
在這裡做測試
*/
[ArticleManager setSharedInstance:nil]; //還原

這樣就可以使用自己的mock了。

2013年12月9日 星期一

Animate in Xcode Without Code

這是從Github explore上面發現的project,入門教學在https://medium.com/p/20c82a904164
主要目的是讓designer不寫code就可以做出動畫效果,只要在storyboard裡面對UIView設定幾個runtime attribute就搞定了。

背後的開發者是Meng To以及Jamz Tang。Meng To的個人網站非常值得一看,從中可以學習到很多UX的技巧。