2015年4月5日 星期日

人生第一台 NAS - Synology DS215j 與 DiskStation 初體驗


假日閒聊時,發現家人正困惑著資料儲存的問題,四五年前買的筆電、桌機有的硬碟大概才 256GB、512GB 而已,隨著數位相機、手機拍照的盛起,有越來越多資料不知該怎樣處理,甚至許多歷史因素懶得處理 Orz 想著想著,看來是個時機點,買一台 NAS 了!周邊有花錢買 NAS 的,有八成以上有抓 BT 的習慣,少數是本身就是拍照的愛好者,有的甚至就是用外接硬碟來備份,為此也困惑許久,最後就當作嘗鮮吧 XD

至於為何買 Synology ?單純看到前同事用這系列,而型號只是單純買 2015 年的產品。雖然我自己土砲一下要裝個 server 也不是難事,只是時間寶貴啊,花一點錢試試看別人的產品,一台機殼、主機板,算起來跟自己去組一台要花的成本相當,差只差在自己組裝的硬體規格會比較好,可以接的硬碟會比較多,但通常也不會比專門做 NAS 的省電,並且整體空間設計也很難比別人好看。

 

使用心得還不賴!以前也開發過這類產品,例如一個 embedded linux 搭配 Web UI 來提供服務,但直到我試了 Synology DiskStation 的介面,真的輸人輸太多!Synology 真的做得很好 :P 過去開發產品容易執著在技術上,而使用者其實更在意絕對是 UIUX 的部分。

安裝完硬碟且接上網路後,只要是在同一個無線網路 AP 下,直接用瀏覽器輸入 find.synology.com 即可連線到,透過 DNS 的機制 UIUX 做的真的不錯,十分親民。而 Mobile app 也是一樣的道理,下載完專屬的 app 後,可以透過本地網路的瀏覽方可找到機器。而機器的設定全部都走 Web UI ,沒點幾下就都搞定了!



不少服務擴充:





整體上,對我這個產品的門外漢來說,做的真的不錯,分數有 90 分以上 :P 目前使用上都還順利,若真的要挑惕的話,大概是我買的這台是兩顆碟,已備份技術來看,就是會損失一顆硬碟的空間(買兩顆 1TB,一顆備份,真正只能用 1TB空間),另外則是我在 MBP 2012 機器上,透過 FileZilla 走 FTP 傳資料時,若一口氣開 10 個連線,平均 5~10分鐘會出現連線 timeout 的現象,不確定是 MBP 跑不動,還是 NAS 連線數應付不來。

2015年4月3日 星期五

iOS 開發筆記 - 使用 Facebook iOS SDK 4 之處理 FBSDKLoginManager result.isCancelled = true 問題

很久沒用 FB iOS SDK 了,一不小心發現已經進入到 4.0 版本,接著一堆 code 失效 Orz 接著,又來適應一下新板 SDK 的情況。

看著文件刻了一下:

#import <FBSDKCoreKit/FBSDKCoreKit.h>
#import <FBSDKLoginKit/FBSDKLoginManager.h>
#import <FBSDKLoginKit/FBSDKLoginManagerLoginResult.h>
- (void)testFB {
    if (![FBSDKAccessToken currentAccessToken]) {
        NSLog(@"do login");
     
        FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
        [login logInWithPublishPermissions:@[@"publish_actions"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
            if (error) {
                // Process error
                NSLog(@"Process error");
            } else if (result.isCancelled) {
                // Handle cancellations
                NSLog(@"Handle cancellations: %@, %@, %@", result, result.grantedPermissions, [FBSDKAccessToken currentAccessToken]);
            } else {
                if ([result.grantedPermissions containsObject:@"publish_actions"]) {
                    NSLog(@"with publish_actions");
                } else {
                    NSLog(@"without publish_actions");
                }
            }
        }];
        return;
    } else if ([[FBSDKAccessToken currentAccessToken] hasGranted:@"publish_actions"]) {
        NSLog(@"use publish_actions");
    }
 
    NSLog(@"token: %@", [FBSDKAccessToken currentAccessToken]);
}


很奇妙地,無論使用者如何授權此 Facebook app ,永遠都會落入 result.isCancelled == true 的事件中,然後 token 永遠都 null。

追了一下,原來還要設定 AppDelegate 太久沒用都忘記了,啊 FB iOS SDK 文件上也沒提醒 Orz

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [[FBSDKApplicationDelegate sharedInstance] application:application
                                                          openURL:url
                                                sourceApplication:sourceApplication
                                                       annotation:annotation];
}


如此一來,有幾種情境就都能抓到了:
  • 使用者不想授權此 app => Handle cancellations
  • 使用者授權此 app ,但不想給 publish_actions 權限 => without publish_actions
  • 使用者授權此 app ,並給予 publish_actions 權限 => with publish_actions

2015年4月2日 星期四

Android 開發筆記 - 嘗試取出 WebView Javascript console.log @ 小米2S Android 4.1.1

原先 Android 4.4 已經有漂亮的解法:Debugging Web Apps,但是,對於其他版本的就 糟糕了。

所幸小米2S的系統還算 ok,只需啟動開發者模式,並播打電話 *#*#717717#*#* 後,即可開啟完整的開發者模式,透過 adb 連線。

$ adb devices
...至少要看到小米2S機器

$ adb logcat com.android.chromium:* | grep 'WebViewerFragment'
...
D/WebViewerFragment(25584): onScroll:192.34418
D/WebViewerFragment(25584): onScroll:344.65582
D/WebViewerFragment(25584): onFling:-4593.181
D/WebViewerFragment(25584): onScroll:-71.85919
D/WebViewerFragment(25584): onScroll:-183.00793
D/WebViewerFragment(25584): onScroll:-61.014893
D/WebViewerFragment(25584): onScroll:-77.11798
D/WebViewerFragment(25584): onFling:5177.8477
D/WebViewerFragment(25584): onScroll:-42.316345
D/WebViewerFragment(25584): onScroll:-70.78821
D/WebViewerFragment(25584): onScroll:-89.440186
D/WebViewerFragment(25584): onScroll:-105.551575
D/WebViewerFragment(25584): onScroll:-117.46338
D/WebViewerFragment(25584): onFling:8612.66
...


如此,簡易版搞定 :P 上述訊息是 javascript console.log。另一外提的是,我把小米2s系統預設瀏覽器改成 chrom browser ,不知使用系統預設 browser 是否一樣,以及我安裝的 app 可能是 debug 版本,有一說 release 版本可能看不到。

2015年3月29日 星期日

大隱隱於市



下午跟家人一起看電視時,剛好看到節目在介紹一位在上海的畫家,主持人很好奇他怎樣在這樣的環境下創作,於是乎畫家就說了這句話: 「大隱隱於市...」

搭火車時,突然想起查了一下典故,看來像是個俗語似的,本意是說厲害的隱者不必到清幽的環境才能修煉,而更完整的句字:
大隱隱於朝;中隱隱於市;小隱隱於林
還滿不錯的意境。

更有一則相關詩句:中隱(白居易 唐詩)

大隱住朝市,小隱入丘樊
丘樊太冷落,朝市太囂喧
不如作中隱,隱在留司官
似出復似處,非忙亦非閑
不勞心與力,又免飢與寒
終歲無公事,隨月有俸錢
君若好登臨,城南有秋山
君若愛游蕩,城東有春園
君若欲一醉,時出赴賓筵
洛中多君子,可以恣歡言
君若欲高臥,但自深掩關
亦無車馬客,造次到門前
人生處一世,其道難兩全
賤即苦凍餒,貴則多憂患
唯此中隱士,致身吉且安
窮通與豐約,正在四者間

2015年3月26日 星期四

搭配 CyanogenMod 銷售的手機 - OnePlus One


前陣子跟友人閒聊起這個牌子,想說 2013 年買了小米2S送人,今年就換另一品牌吧!

OnePlus One 的特色就是搭配 CyanogenMod (CM) 作為預設的操作環境,若真的要說的話,有點像另類的 Nexus 系列,畢竟 CM 在 Android 刷機門派中早有一席之地,在 2013 年底也開始搭配實體機器來銷售了。

至於好不好用?我也不知道,因為要拿來送人 XD 我單純就 OnePlus 的路線來看,至今的確走得挺精彩的,把持著品牌路線、CP 值,以及手機質感,但不是走機海、海撈使用者和瘋狂搶佔市佔率模式。

這走法讓我對軟體服務業也有了一番省思。