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的技巧。

2013年11月21日 星期四

Backup your Xcode snippet

Xcode snippet介紹

http://nshipster.com/xcode-snippets/

備份自己的snippet

首先Fork https://github.com/mneorr/snippie 到自己的repository,然後

git clone https://github.com/*******/snippie.git xcode-snippets

星號部分請代換成自己的使用者名稱

cd xcode-snippets 
bundle install
rake backup 

然後Push到github上,這樣就完成初次的備份了。你可以在自己的snippie fork上看到指令列表。

匯入之前備份的snippet

如果之後換新電腦,這些備份的snippet就可以派上用場了。只要把snippet從git上clone下來,然後

rake import

就成功匯入Xcode了

匯入別人的code snippet

知名的Objective-C開發者Mattt Thompson分享了他的snippet,就用這個來當練習吧。
https://github.com/mattt/Xcode-Snippets
git clone下來之後把全部的.m檔都放到readable_snippets資料夾底下。 但是snippie的rake import只吃.codesnippet檔,所以要先把.m檔轉換成.codesnippet。 好險有熱心網友做了一個ruby script幫助我們做這件事。 https://gist.github.com/subdigital/4463440#file-convert_to_codesnippet-rb
首先把這個gist載到readable_snippets資料夾底下。 然後下指令

find ./*.m -type f -maxdepth 1 -exec ruby ./convert_to_codesnippet.rb {} \;

注意:若有cannot load such file -- nokogiri-plist的錯誤就是缺少plist gem 必須gem install nokogiri-plist才能順利執行。
接下來

cp ./*.codesnippet ../backup/
rake import
rm -rf ./*.codesnippet

現在重新打開Xcode,就可以看到新增的snippet囉。 然後再次做備份 rake backup 再上傳到github,就完成這次的匯入工作了。

2013年11月18日 星期一

開發者選擇到哪個城市過活?

前一陣子看到罗马尼亚程序员的幸福生活這篇文章,我開始好奇如果台灣iOS開發者選擇出走,到國外是否能獲得更好的生活品質?
在文章裡有提供一個網站numbeo比較城市之間消費與收入訊息。

美國加州San Francisco 與台北的比較

You would need around 6,038.47(178,738.69NT) in San Francisco, CA to maintain the same standard of life that you can have with 83,000.00NT$ in Taipei (assuming you rent in both cities). This calculation uses our Consumer Prices Including Rent Index.

如果要在San Francisco達到在台北有83,000 NTD月薪的生活水準,必須要有6,000 USD的月薪,也就是72,000 USD的年薪。
再看Indeed的資料,iOS developer在San Francisco的平均年薪大約座落在121,000 USD左右,根據網路上找到的加州税后工资与税前收入对照表,稅後收入約84,000 USD。聽起來很美好,但是願意幫忙申請工作簽證的公司似乎不好找就是。

荷蘭阿姆斯特丹與台北的比較

You would need around 3,706.02€ (147,921.12NT) in Amsterdam to maintain the same standard of life that you can have with 83,000.00NT$ in Taipei (assuming you rent in both cities). This calculation uses our Consumer Prices Including Rent Index.

如果要在Amsterdam達到在台北有83,000 NTD月薪的生活水準,必須要有3,700 EUR的月薪,也就是44,400 EUR的年薪,換算成美金大約是59,928 USD。 iOS developer在阿姆斯特丹的平均年薪大概在95,000 USD左右,稅後為55,100 USD。但是從網路上的心得分享來看,在荷蘭的工作較為穩定,加班時數較少。順便附上荷蘭的稅率計算方式

2013年10月26日 星期六

2013 Kindle Paperwhite 日版購買心得

買Kindle Paperwhite的原因

因為我平時會閱讀大量的技術文章與技術書籍,透過e-ink技術,可以模擬出接近紙張的體驗,長時間閱讀時比電腦螢幕或iPad舒服很多。另一個優點就是可以直接買國外電子書,價格比實體書便宜,也不用等書飄洋過海。如果平常需要閱讀大量的文章,買這台絕對值得。關於Kindle Paperwhite對於科技工作者的幫助,可以參考 我是如何使用Kindle, 以及我在使用Kindle過程中學到什麼?

機體介紹

請參見日本亞馬遜以及美國亞馬遜Kindle Paperwhite網頁。日本只有無廣告版可以買,但是美版只有2G空間,日版有4G硬碟空間,猜測是日本電子書以漫畫為大宗所以需要較高的容量。

購買方式

美版

目前台灣可以直接從美國亞馬遜下訂送到台灣來,從Google前幾筆查到的購買網址到了確認地址那個步驟會告訴你不能送到台灣,畫面上方會顯示另外一個購買網址給你,這個就可以正常結帳送到台灣了。購買機子加上保護套以及運費還要先預扣三百多塊的關稅(沒用完會退),整體花費大概在六千多。

Items (2): TWD 5,560.41
Shipping & handling: TWD 837.83
Total before tax: TWD 6,398.24
Estimated tax to be collected: TWD 0.00
Import Fees Deposit TWD 359.74
Order total: TWD 6,757.98

日版

日版於2013/10/22正式販售,而且只送日本國內。有許多人成功透過JShopperTenso等業者轉送到海外,之前原本也是考慮走這條路,不過剛好有日本朋友願意鼎力相助,幫我預購以及寄送,我才能在這麼短的時間內拿到我的Kindle Paperwhite,真的十分感謝。

Kindle Paperwhite ¥9980
原廠保護套 ¥3980
EMS運費(2天) ¥1660

合計 ¥15620 大約是台幣47xx吧

開箱

箱子
箱子

從日本來的
標籤

打開長這樣
打開

裡面還有日本的報紙
報紙

報紙拿開之後,主角出現了
主角

保護套

這是保護套的磁鐵,可以讓外蓋牢牢吸住,另外還有像iPad一樣蓋上即休眠的功能
磁鐵

Kinlde Paperwhite盒子外觀
PW Box

撕掉這條才能打開盒子
紙條

打開囉
打開PW

近拍一

近拍二

說明書
說明書

內附一條USB線,可連接電腦充電
USB

保護套的質感很不錯
保護套質感

教你怎麼把Kindle放進去
放進去

霧面不容易留指紋
KindlePW本尊

放進保護套
預備放入

放入了

下面有USB插槽以及電源鍵,說明書上寫說插上電腦,按下電源鍵就可以開始使用了
底部

開機讀取中
開機

有很多語言可以選擇,但就是沒有繁體中文,哈哈哈…
語言

那就選個英文吧
選英文

再度讀取…
loading...

好有震撼力的畫面啊!
Welcome

要連接WiFi才能繼續哦~
連接WiFi

登入帳號
登入帳號

設定好了!
設定好了

如何連接美國Kindle Store

我一設定好之後打開Kindle Store,我的天啊~怎麼會是Amazon.cn呢?這其中一定有什麼誤會。
中國Kindle Store

啊~原來是要去Amazon網頁啦~選Manage Your Kindle
Manage Your Kindle

更改Contry Setting
更改Contry Setting

原本是Unknown,把它改成台灣的地址
Unknown

Kindle按下回到首頁,再進一次Kindle Store,就可以進入美國Kindle Store囉
美國Kindle Store

開箱結束,有心得文會再補上

2013年10月17日 星期四

iOS7的UIAlertView客製化

以前大家經常對UIAlertView做千奇百怪的客製化,add各種subview進去,到cocoacontrols上面搜一下就知道有多少。
但是現在這個管道到了iOS7裡面被禁止了,Apple現在不允許再更改UIAlertView的viewHierachy了。
幸好有熱心的網友做出了模仿iOS7 AlertView的自製元件,可以參考
CXAlertView
image
或是
ios-custom-alertview
image

2013年10月9日 星期三

Xcode5 Interface Builder的兩個小技巧

小技巧一
以前要選到tableview裡面的cell時,通常都是到左側列表中一層一層打開選擇。
現在你只要在tableview上按住control+shift+滑鼠右鍵就可以選擇這個view裡面的元件了。


小技巧二
在Xcode5的Interface Builder裡面,打開File Inspector。如下圖,其中有一個選項叫做View as,可以看你的xib在iOS6上的樣子,對於想要繼續支援iOS6的開發者來說十分好用。

2013年10月4日 星期五

How to export commit message from git repository?

Here is a great tutorial that teach you how to do this. Simpily use git log to show commit history.
For example, git log --oneline --after={2013-09-14} --no-merges --pretty=format:'%h,%ai,%s'
This command will show all commit history after 2013-09-14 without merge commit.
The output message is just like
Git history from AFNetworking
1e5124e,2013-10-02 19:11:32 +0800,Update README.md
0ef5102,2013-10-01 07:17:35 -0700,[Issue #1404] Adding missing #ifdef for iOS 7
64e1ac1,2013-10-01 07:11:59 -0700,[Issue #1406] Fixing request serializers to no
f03b5cf,2013-09-30 13:19:24 -0700,fix cocoa pods pod spec to include AFNetworkin
678b666,2013-09-27 21:36:16 -0700,trivial documentation/comments fix
0d3e4ae,2013-09-30 18:02:58 +0400,fixed initial upload/download task progress up
979dde7,2013-09-30 14:46:59 +0200,Fix names of exposed private methods downloadP
4350a01,2013-09-29 17:21:51 -0500,Updated ssl pinning mode to have default pinne
0604cfd,2013-09-29 11:52:53 -0700,[Issue #1379] Adding missing code macros for i
ebd5841,2013-09-27 12:24:43 -0700,Update README.md
13166f4,2013-09-27 14:21:15 -0400,Fix compiler warning when GCC_WARN_ABOUT_MISSI
c053301,2013-09-27 10:59:05 -0700,Fix example
859132b,2013-09-27 10:24:45 -0700,Update README.md
4566201,2013-09-27 09:47:26 -0700,Bumping version to 2.0.0

7570dfa,2013-09-27 09:47:17 -0700,Fixing spelling in headers

If you want to export it and put it into a txt file, no problem! Just 
git log --oneline --after={2013-09-14} --no-merges --pretty=format:'%h,%ai,%s' > ChangeNote.txt
Have fun! :D

2013年9月14日 星期六

Cocoapods multiple targets setting

如果在一個project裡面有多個target而且不是test target,要讓全部的target都可以使用pod載下來的library,在Podfile裡面要這樣設定
platform:ios, '6.0'
link_with ['Target1', Target2']
pod 'AFNetworking'

2013年8月19日 星期一

在Ubuntu下備份內含Mac作業系統的外接硬碟到映像檔(HFS+)

使用partclone這套國網中心弄的open source軟體。
首先apt-get install parclone

中文使用說明

安裝完後,來看個範例
假設外接硬碟在/dev/sdb2,必須先umount,然後...

-c是clone
-m是buffer size
-s是來源
-o是目的
-L是log檔位置

sudo partclone.hfs+ -c -m 10485760 -s /dev/sdb2 -o /home/user/backup/MacBackup.img -L /home/user/backup/partclone.log

沒有意外應該就會開始備份了。

2013年7月7日 星期日

快速查看IPA內含的Provision資訊-CocoaDeveloper Quicklook Plugin


就像上面這張圖一樣,可以很方便的知道自己包出來的ipa是用哪一個provision。
連到http://ipaql.kf-interactive.com/,安裝就照著步驟做,很簡單。但是我最後一直找不到怎麼看- -
原來是要對ipa點右鍵,選「快速查看」

2013年7月4日 星期四

第一次在Github上create ticket

今天要讓一個舊專案支援Cocoapods,先把project file升級,然後執行

pod setup

修改Podfile

pod install

結果發生error...正當我在考慮怎麼樣把issue內容寫成符合GitHub markdown時,定睛一看

不得不說Cocoapods真的很貼心,你可以發現Error Message都已經幫你寫好markdown格式了

new issue之後直接貼上去就可以了,真是太感動啦~

――― MARKDOWN TEMPLATE ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――

 

### Report

 

* What did you do?

 

* What did you expect to happen?

 

* What happened instead?

 

 

### Stack

 

```

   CocoaPods : 0.22.1

        Ruby : ruby 1.9.3p327 (2012-11-10 revision 37606) [x86_64-darwin11.4.2]

    RubyGems : 1.8.24

        Host : Mac OS X 10.7.5 (11G63)

       Xcode : 4.6.3 (4H1503)

Ruby lib dir : /Users/shenkevin/.rvm/rubies/ruby-1.9.3-p327/lib

Repositories : master - https://github.com/CocoaPods/Specs.git @ 90f0243d52ccc1db58f12108fb4a9b9e00cc0a22

```

 

### Podfile

 

```ruby

platform : ios

 

pod 'FPPopover'

```

 

### Error

 

下略...

2013年7月2日 星期二

PonyDebugger安裝記錄

https://github.com/square/PonyDebugger
安裝Server的部份跟著Readme照做就對了

iOS Client怎麼裝呢?Readme寫了一堆啦哩拉雜的,結果
pod search pony

-> PonyDebugger (0.3.0)
   Remote network and data debugging for your native iOS app using Chrome Developer Tools.
   - Homepage: https://github.com/square/PonyDebugger
   - Source:   https://github.com/square/PonyDebugger.git

   - Versions: 0.3.0, 0.2.1-beta1, 0.0.1 [master repo]

原來都有人包好了,不用客氣,Podfile裡面加入PonyDebugger,下pod update就對了。
PDDebugger *debugger = [PDDebugger defaultInstance];
[debugger connectToURL:[NSURL URLWithString:@"ws://localhost:9000/device"]];
把這三行加進AppDelegate裡面,再依想做什麼樣的debug加入其他行
現在要來做View階層的觀察,所以加入下面這兩行
[debugger enableViewHierarchyDebugging];
[debugger setDisplayedViewAttributeKeyPaths:@[@"frame", @"hidden", @"alpha", @"opaque"]];
開始Debug模式。
打開Chrome,連上http://localhost:9000/,就會看到正在運行的那個App,點進去,Oh! 開始Play吧~

Autolayout Introduction

2013年5月24日 星期五

Asus-N12HP刷Tomato記錄


首先下載Tomato韌體 - http://tomato.groov.pl/download/K26RT-N/build5x-114-EN/Asus%20RT-Nxx/tomato-K26-1.28.RT-N5x-MIPSR2-114-Max.trx

下載Asus官方韌體以防不測 - http://support.asus.com/download.aspx?SLanguage=zh-tw&m=rt-n12hp&os=8

設定ip位址為192.168.1.10,反正就這個網段,不要跟Router IP衝到就好。

子網路遮罩255.255.255.0

關閉Router電源,按著背後的reset鈕不放,然後開機,等到Router電源燈變成5秒亮5秒暗的時候就可以放開reset鈕。

打開command line,使用TFTP Tool,各作業系統用法不同,參照DD-WRT的wiki - http://dd-wrt.com/wiki/index.php/TFTP_flash#TFTP_Tools

我的電腦是Mac OS X,打開 應用程式->工具程式->終端機

使用cd指令切到韌體所在的資料夾下,例如放在下載項目裡面就打


cd ~/Download


然後按enter,以下每打一行就enter一次

tftp 192.168.1.1

binary

trace

rexmt 1

timeout 60

put tomato-K26-1.28.RT-N5x-MIPSR2-114-Max.trx

接著會看終端機一直跑

指令輸出長這樣

sent DATA <block=12598, 512 bytes>

received ACK <block=12598>

sent DATA <block=12599, 512 bytes>

received ACK <block=12599>

sent DATA <block=12600, 512 bytes>

received ACK <block=12600>

sent DATA <block=12601, 0 bytes>

received ACK <block=12601>

Sent 6451200 bytes in 34.4 seconds



成功之後關閉電源,再打開。

請等待幾分鐘讓機器安裝新的韌體,可以去泡杯咖啡之類的。


接下來用瀏覽器連接192.168.1.1

account: admin

password: admin

進去之後就可以看到tomato的設定畫面了。




接著到administration->configuration->Restore Default Configuration

選erase all data...那個選項,然後按OK重開機。

後續還有一些調校以及發揮N12HP天線真正效能的設定。請看http://www.bxtra.net/articles/2012-12-23/how-to-flash-tomatousb-by-shibby-on-asus-rt-n12-b1c1-wireless-n-router




從步驟12開始看。




參考連結:

http://mymengyu.github.io/blog/2012/10/10/tomato-firmware/

http://blog.isaach.com/2012/06/tomato-macintosh-and-asus-rt-n16.html

華碩n12hp的ddwrt刷機小冒險

http://www.bxtra.net/articles/2012-12-23/how-to-flash-tomatousb-by-shibby-on-asus-rt-n12-b1c1-wireless-n-router

2013年4月10日 星期三

夜半


漫無目的的穿梭在這城市中,不曉得為了什麼而走,不曉得自己正在做些什麼。夜晚的大街上特別冷清,只有呼嘯而過的汽車以及零散的路人,似乎是少了點人味吧?我這麼想。
轉進巷子裡,一個小型夜市映入眼簾,與剛才截然不同的氛圍。穿著清涼的女孩與他們身邊的男人,三三兩兩在攤販前等待熱呼呼的宵夜完成。看著看著,突然覺得...啊!為何我的生活如此貧乏無趣?
每天思考創業方向、人生意義,看來只是讓洗澡時頭髮多掉幾根罷了。我們是不是真的要改變世界才創業,還是單純只想快樂享受現在的每一刻呢?現在的我還沒有答案,一路思考著這個問題慢慢走向回家的方向。

2013年1月22日 星期二

App使用者數據追蹤

最近在寫一個Mac OS X App,雛型完成之後還不能馬上放出來。為什麼呢?因為在讀過精實創業之後,我們知道需要設計一些指標追蹤使用者數據,並依此做群組研究。所以這幾天嘗試找了一些市面上有的產品來用,不過很多都是設計給mobile用的,給desktop用的真是少之又少啊。

如果是針對iOS或是Android,Quora上的這篇把一些常見的產品優劣介紹的不錯。

話說回來,那在Mac上的App有什麼產品可以用呢?

Deskmetrics:有SDK直接支援Mac,不過收費似乎不便宜

Usermetrix:提供C/C++支援,調整一下似乎可以整進Xcode

GAJavaScriptTracker:Github上好心人提供的Google Analytics的Objective-C wrapper,可以用Objective-C呼叫Javascript版的Google Analytics

另外偶然發現這個pull request,也許mixpanel可以支援Mac OS X?!