2012年12月31日 星期一

iOS 開發筆記 - 國曆轉農曆計算 (Chinese Lunar Calendar)

lunar-2013-06


把玩一下 NSCalendar ,發現他可以計算咱們華人常用的農曆日期耶!完整文件 iOS Developer Library - Date and Time Programming Guide


程式碼:


NSString *dateAt = @"2013/06/08";
NSDateFormatter *dateFormatter = [[[NSDateFormatter allocinit] autorelease];
[dateFormatter setDateFormat:@"yyyy/MM/dd"];
NSDateComponents *dateComps = [[[[NSCalendar alloc] initWithCalendarIdentifier:NSChineseCalendar] autorelease] components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[dateFormatter dateFromString:dateAt]];
NSLog(@"%@ => Chinese calendar date (Lunar): %0.2d/%0.2d", dateAt, [dateComps month], [dateComps day]);


結果: 


2013/06/08 => Chinese calendar date (Lunar): 05/01


註:有的農民曆將 2013/06/08 定為農曆 04/30,故挑這天當做範例提醒算法的不同。


2012年12月30日 星期日

2012年的最後一天

Life & Sea


今年很特別,發生了不少事,體驗過交接離職同事待結案的案子(還一次三案 orz)、同公司換單位、跟同好分道揚鑣、Android、國外自助旅行、找房子、搬家、役畢、換公司、iOS、國內離島旅行、看顧、狂用悠遊卡等,想起來真的經歷不少事,記得役畢前還斤斤計較如何追求工作薪資的 CP 值,很奇妙地一役畢反而不在意,看著周邊親友工作上的來來往往,有的厭膩生態、有的追求夢想都好,都是踏出人生的下一步。難得 12/31 可以在老家休息,回老鄉走走,從火車站步行回家,看看許久未見的街景,可真是熟悉又陌生。


回顧這一年,收獲不少,但開始會想想是不是該多充實生活化的記事,例如遊記、聚餐、拍照、音樂、遊戲、語文呢?說真的我還滿高興自己亂寫的一些旅遊或遊戲筆記的瀏覽次數高於一些技術筆記,新年一年應該可以多想想,學一些語文、文化勝於新的程式語言,多走一些景點勝於多開幾個專案。


只是,年都還沒跨過去,又馬上收到新的一年的工作計畫,看來明年一開始又得忙了,越來越多的新事物、挑戰跟角色,年輕就該多衝刺嘛,這大概就是所謂的人生吧!


總之,新年快樂!


2012年12月26日 星期三

[Linux] 強制使用 SSH Keys (key pair) 登入認證 @ Ubuntu 12.04

use-pubkey-only


最近常建一些 VM 來把玩,想到除了用 key-pair 管理登入認證外,還想了一些資安問題,就參考過去把玩 Amazon EC2 的概念,把登入機制強制使用 public key 的方式,如此一來可以安全一點點吧!?(上圖是用 Putty 透過 account/password 登入時的錯誤訊息)


設定:


$ vim /etc/sshd_config
PubkeyAuthentication yes
PasswordAuthentication no


$ /etc/init.d/ssh restart


其他:


$ ssh-keygen -t rsa -P ''
$ scp ~/.ssh/id_rsa.pub account@TargetServer:~/.ssh/authorized_keys


2012年12月20日 星期四

Android 開發筆記 - 使用 keytool 處理 keystore 匯入、合併、更改密碼、更改 alias name

接近半年前幫公司上架一支 Android app ,結果兩個月前想要更新程式時,卻發現自己想也想不起來 keystore 的密碼 XD 當時起就一直抱著砍掉重練的精神,遲遲未更新程式,沒想到今天再次要更新程式時,竟然矇對 keystore 的密碼了!當下想到的第一件事就是更新密碼,把密碼改簡單一點 :P 此外,以前認為一支 Android app 就要獨立一個 keystore 來管理,反而造成管理上的困擾,因此查了一下果真還有可以合併 keystore 的方式 :-) 真是太讚啦


更改 keystore alias name:


$ keytool -changealias -alias "OldAliasName" -destalias "NewAliasName" -keypass YourAliasKeyPassword -keystore your.keystore -storepass YourKeyStorePassword


更改 alias password:


$ keytool -keystore your.keystore -keypasswd -alias AliasName


更改 keystore password:


$ keytool -storepasswd -keystore your.keystore


合併 keystore:


$ keytool -importkeystore -srckeystore SourceKeyStore.keystore -srcstorepass SourceKeyStorePassword -destkeystore DestinationKeystore.keystore -deststorepass DestinationKeyStorePassword


2012年12月17日 星期一

iOS 開發筆記 - 使用 XCode Subprojects 與 Git Submodule

xocde_subproj


雖然 Objective C 的經驗不多,但漸漸地會想把一些共用的程式碼弄成 library 來使用,在加上 git 來管理,這時候就會想到 git submodule 的使用。原先以為把 xcode project 拖拉進來就可以了,後來發現這一切都只是幻想 XD 整體上的概念:編譯時要能找到(header search path),連結時要能找到(link binary)。原本以為拖拉其他 project 進來就能自動化搞動,最後發現還是要手動設定一些環境,所以就來筆記一下。


例如有 Base.xcodeproj 和 Test.xcodeproj,先把常用的程式碼都寫在 Base.xcodeproj:


建立 Xcode Project:


create_base_xcodeproj


新增 TARGETS -> Add Target:


add_target_static_lib


add_target_static_lib_name 


把想要編成 static library 的程式碼擺進 Compile Sources:


create_static_library


add_other_source


使用 git 管理(假設在 /tmp/base.git):


$ mkdir /tmp/base.git
$ cd /tmp/base.git
$ git init --bare
$ cd /path/Base
$ ls
Base  Base.xcodeproj  BaseLib
$ git init
Initialized empty Git repository in /path/Base/.git/
$ git remote add origin /tmp/base.git
$ git add .
$ git commit -am 'init'
$ git push origin master


在 Test.xcodeproj 裡使用 Base.xcodeproj:


建立 Test xcodeproj:


create_test_xcodeproj


使用 git 管理(假設在 /tmp/test.git):


$ mkdir /tmp/test.git
$ cd /tmp/test.git
$ git init --bare
$ cd /path/Test
$ ls
Test  Test.xcodeproj
$ git init
Initialized empty Git repository in /path/Test/.git/
$ git remote add origin /tmp/test.git
$ git add .
$ git commit -am 'init'
$ git push origin master


使用 git submodule 管理 Base library:


$ cd /path/Test
$ ls
Test  Test.xcodeproj
$ git submodule add /tmp/base.git libbase
Cloning into 'libbase'...
done.
$ ls -a
.   .git               Test  libbase
..  .gitmodules  Test.xcodeproj
$ cat .gitmodules
[submodule "libbase"]
  path = libbase
  url = /tmp/base.git
$ git commit -am 'add libbase'
[master 5f69c71] add libbase
  2 files changed, 4 insertions(+)
  create mode 100644 .gitmodules
  create mode 160000 libbase
$ git push origin master


設定 Text.xcodeproj:


拖拉 Base.xcodeproj 進來(從 /path/Test/libbase):


drag_base_xcodeproj


設定 Header Search (/path/Test/libbase):


add_header_search


header_search_path


設定 Other Linker Flags:


-all_load  (如果 library 中有 categories)


設定 Link Binary With Libraries:


link_binary


更新 git:


$ cd /path/Test
$ git add .
$ git commit -am 'add libbase'
$ git push origin master


如此一來,未來在取 Test 的時候,就可以這樣用:


$ git clone --recursive /tmp/test.git testxcode
Cloning into 'testxcode'...
done.
Submodule 'libbase' (/tmp/base.git) registered for path 'libbase'
Cloning into 'libbase'...
done.
Submodule path 'libbase': checked out '920380a7c727d7fb42e38e89bd2eac7a3d2ef72f'
$ ls -a testxcode
.     .git                Test               libbase
..    .gitmodules   Test.xcodeproj


此外,其他時候可能會需要以下指令:


$ git submodule update --init --recursive


iOS 開發筆記 - iOS 6 UIViewController shouldAutorotateToInterfaceOrientation 失效 (orientation bug?)

複習一下 UIViewCnotroller ,在一樣的程式碼,在 iOS 6 不能做 Device Autorotate ,測試了一下是之前用法使用 UIViewController 的方式要更新一下。


以前在 AppDelegate.m 中,使用 [self.windows addSubview:my.view]; 的用法,需更新為 [self.windows setRootViewController:my]; ,如此一來在 iOS 5 跟 iOS 6 都可以正常使用了。


AppDelegate.m:


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.

   UINavigationController *nav = [[UINavigationController alloc] init];

   [self.window setRootViewController:nav];
   //[self.window addSubview:nav.view];

   self.window.backgroundColor = [UIColor whiteColor];
   [self.window makeKeyAndVisible];
   return YES;
}


2012年12月6日 星期四

[MSN] 線上編輯、刪除、還原、匯出聯絡人清單


前陣子微軟公布之後要將 MSN 合併至 Skype 帳號,有點半放棄 MSN 吧?總之 Skype 已經可以提供使用 MSN 帳號登入了,為了在 Mobile (Android) 上可以使用官方的 MSN client,我就把 MSN 跟 Skype 整合了。然而,整合後一個禮拜左右,開始發現用 MSN 登入 Skype 時,看不到 MSN 聯絡人,甚至切換到 Windows XP 用 MSN 軟體登入,一樣也看不到聯絡人,開始產生聯絡人消失的奇怪 bug!雖然可以從其他地方找到聯絡人,但似乎不太方便。


幸運的,可以從 http://people.live.com/ 進去管理自己的 MSN 帳號,包括管理群組、刪除和還原聯絡人,最重要的則是有匯出功能,包括可以備份自己取的代稱等,實在便利。而 MSN 聯絡人不見得問題,則是去還原即可,需留意刪除的聯絡人只保留 30 天喔。