原本想透過智慧運動裝置來獲取步數與距離,可惜遲遲等不到韌體開發完成,只好暫且透過HealthKit獲取步數與距離!因為iPhone本身就有運動感測器,會自動算出步數與距離,然後寫入HealthKit,想做運動健康相關App,於是有數據來源可使用。
iOS 10開始之後要在info.plist設定Privacy。
原本想透過智慧運動裝置來獲取步數與距離,可惜遲遲等不到韌體開發完成,只好暫且透過HealthKit獲取步數與距離!因為iPhone本身就有運動感測器,會自動算出步數與距離,然後寫入HealthKit,想做運動健康相關App,於是有數據來源可使用。
iOS 10開始之後要在info.plist設定Privacy。
從大三(2009年)加入臉書至今,已邁入第十年!臉書已成為我獲取資訊的重要來源之一,特別是聯繫親友人脈關係,更是離不開這個平台。今年我展開下一個偉大的嘗試,就是開設臉書粉絲團「逍遙遊 Happy Tour」,有興趣的朋友可以來共襄盛舉按個讚喔~
連結網址:逍遙遊 Happy Tour。
大概從2018年3月開始,我嘗試貼些動態,比如:文字、圖片、影片、連結甚至直播,還將臉書粉絲團鑲嵌在部落格的右邊欄位。我觀察到觸及人數每天可以有近千人,雖然參與互動的人數很少啦XD~看來要多貼些有梗的圖文並茂!
最近可能會陸續邀請原本在臉書上的朋友,多些「讚」會更好看,至於未來想要發展成什麼類型的粉絲團,基本上就是偏向我個人的娛樂旅遊吧!人生就是要勤奮工作後逍遙玩樂呀:)~
最後來看一下我臉書粉絲團洞察報告 (Facebook Fan Page Report)~
有機會我想當個超級有影響力的網紅!在當網紅前我會是個成長駭客!
因為被臉書收購的Move App要「收攤」,我必須在2018年7月30日前備份我1206天的追蹤紀錄,讓我最近發現一個更好用且詳細的工具,是關於記錄人生歷程的平台Gyroscope (陀螺儀)。這個平台有Web、iOS App、Android App,還串接許多第三方來源的資料,比如:Apple Health、Instagram、Twitter、Fitbit、Strava、RescueTime等等。我發覺Gyroscope做得很符合我的需求,就將Move導出來的資料全數匯入Gyroscope。
因為介面做的實在太吸引我,讓我很想要寫篇文章來推薦。首先我要介紹思維導圖 (Mindmap)。
2013年8月,和草本生活的朋友們一起到花蓮兩天一日旅行。
來到花蓮一定要遊山和玩水,我想最有名的應該就是七星潭風景區,來到這麼美的海邊,真的會讓人海闊天空呢!
這張相片是180度全景,可以點開來看,如臨其境呢!
三個月前「臨危受命」,還好5月10日~13日沒有安排「娛樂節目」,難得公司可以為出差,而且是到從未去過的國度-廈門,我當然要把握機會去「邊工作邊旅行」,增廣見聞隨時提升自我!
不過由於老闆有點晚跟我說,我的舊式台胞證過期,想要在10天內辦理完拿到手,可就要送急件2300元。好在阿弟老婆有在做此業務,就相信她能為我準時辦理完成!我也就先去萊爾富拍大頭照,將所需文件準備好。新式台胞證卡超級方便,可以直接放皮包,用感應的方式通關~
原本老闆想安排台北直飛廈門,可惜時間不恰當且費用較高,於是我們就選擇在松山機場搭立榮航空到金門,再轉搭小三通到廈門。於是,我才知道20年前所謂的小三通,原來是這樣子的呀:)~
相信這一趟Business Trip會充滿美好且意猶未盡的回憶!
「看不到的不代表不存在~」,寫程式也會遇到這個現象!我在比較日期字串時,發現明明兩者都是2018-07-17,卻被判斷出不一樣!?
好在透過取得字串長度,才發現真有看不見的字元「\0」!
(lldb) po firmwareVersionLabel.text.length
32(lldb) po newVersionLabel.text.length
10
實際上2018-07-17只有10個字元,而韌體回傳卻有32個字元,於是知道後面看不到的字元共有22個。
先前已寫過[iOS] 列出資料夾裡的檔案名稱 (List Contents of Directory),然而現在想要以最後修改時間列出檔案名稱 (List Contents of Directory By Last Modification Date),直接來看程式碼:
/**
Theme: List Contents of Directory By Last Modification Date
IDE: Xcode 9
Language: Objective C
Date: 107/08/02
Author: HappyMan
Blog: https://cg2010studio.com/
*/
+(NSArray *)listFileAtPathSortedByModificationDate:(NSString *)folderPath
{
NSError* error = nil;
NSArray* filesArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderPath error:&error];
if(error != nil) {
NSLog(@"Error in reading files: %@", [error localizedDescription]);
return @[];
}
// sort by creation date
NSMutableArray* filesAndProperties = [NSMutableArray arrayWithCapacity:[filesArray count]];
for(NSString* file in filesArray) {
NSString* filePath = [folderPath stringByAppendingPathComponent:file];
NSDictionary* properties = [[NSFileManager defaultManager]
attributesOfItemAtPath:filePath
error:&error];
NSDate* modDate = [properties objectForKey:NSFileModificationDate];
if(error == nil)
{
[filesAndProperties addObject:[NSDictionary dictionaryWithObjectsAndKeys:
file, @"fileName",
modDate, @"lastModificationDate",
nil]];
}
}
// sort using a block
// order inverted as we want latest date first
NSArray* sortedFiles = [filesAndProperties sortedArrayUsingComparator:
^(id path1, id path2)
{
// compare
NSComparisonResult comp = [[path1 objectForKey:@"lastModificationDate"] compare:
[path2 objectForKey:@"lastModificationDate"]];
// invert ordering
if (comp == NSOrderedDescending) {
comp = NSOrderedAscending;
}
else if(comp == NSOrderedAscending){
comp = NSOrderedDescending;
}
return comp;
}];
return sortedFiles;
}
以我的範例取得:
<__NSArrayI 0x137459190>(
{
fileName = “2018-08-02 10:17:20~2018-08-02 10:19:20.ecg";
lastModificationDate = “2018-08-02 02:19:24 +0000″;
},
{
fileName = “2018-08-02 10:11:32~2018-08-02 10:13:32.ecg";
lastModificationDate = “2018-08-02 02:14:48 +0000″;
},
{
fileName = “2018-08-02 10:09:28~2018-08-02 10:11:28.ecg";
lastModificationDate = “2018-08-02 02:11:31 +0000″;
},
{
fileName = “2018-08-02 10:06:47~2018-08-02 10:08:47.ecg";
lastModificationDate = “2018-08-02 02:08:50 +0000″;
},
{
fileName = “2018-08-02 09:02:28~2018-08-02 09:04:28.ecg";
lastModificationDate = “2018-08-02 01:04:30 +0000″;
},
{
fileName = “2018-07-31 23:40:03~2018-07-31 23:42:03.ecg";
lastModificationDate = “2018-07-31 15:42:07 +0000″;
},
{
fileName = “2018-07-31 14:43:38~2018-07-31 14:45:38.ecg";
lastModificationDate = “2018-07-31 06:45:40 +0000″;
},
{
fileName = “2018-07-31 14:40:58~2018-07-31 14:42:58.ecg";
lastModificationDate = “2018-07-31 06:43:01 +0000″;
}
)
我所使用的整合開發環境是Xcode,每年更新都會釋出新的功能,來幫助開發人如我者更有效率地工作!2018年Xcode即將邁入第10版,這裡我想要來介紹主線程檢查器 (Main Thread Checker)。
回想2012年我還是個初學者的時候,還不知道主線程的重要性,以致於有時候發生不預期的反應,實在摸不著頭緒!基本上要記住,改變畫面的動作要在主線程實現,不然會發生什麼事?有時候有反應,有時候沒反應,這種狀況debug超級困難呢!
好在Xcode已經能從語法分析來得知,哪些程式碼會跑到非主線程,若改變畫面的元件在非主線程操作,Xcode就會有紫色的提示。上圖表示Label一定要在主線程使用 ([UILabel text] must be used from main thread only)。
HappyMan・迴響