almost 3 years ago

由 AsiaYo 主辦的 UI/UX 分享會,請到紐約資深UI設計師 江孟芝 與大家分享她曾參與合作的《英雄聯盟》遊戲互動設計,及UI Principle的趨勢與發展。
在之前的「好有格」剛好聽過江孟芝的專訪,沒想到這麼快就可以見到本人。對孟芝的印象就是留學紐約,之後在美國發展,得到專業人士綠卡,是個高手。

這次分享主題是「10個設計準則」以及分享之前一些專案的經驗。接下來歸納10個準則:

  1. 「Icon」利用適當的設計,讓 Icon 自己說話,是文字以外的語言
  2. 「Hamburg」將其他物件,收在一個按鈕。類似 Menu 按鈕
  3. 「Rich animation」 避免使用者立刻跳走,比較不無聊,使用時機包括:loading, menu, hovering
  4. 「Flat design」平面化設計,用色彩讓畫面也是擁有立體、層次感,但是遊戲除外
  5. 「Responses design」網頁排版能適應各尺寸螢幕
  6. 「Rich image and video」網頁素材盡量運用照片與影片,可以讓使用者黏著度增加。並且素材要自己攝影拍照,不用現成。
  7. 「Vibrant color scheme」背景用色大膽豐富,但是字色單調,參考 Awward
  8. 「Design with real data」跟實際數據結合,例如跑步的路徑
  9. 「Broken grid layout」 打破框架的設計,讓一些按鈕、文字介於區塊與區塊之間,展現活潑,也讓使用者可以注意。這種設計也可以創造層次感,類似以前雜誌風格。最常見的範例是 google 的加入按鈕。
  10. 「Looking for future: VR」最後孟芝提出 VR 在未來網頁呈現上,很酷炫...
 
almost 3 years ago

想要製作設計一個,藉由設定好區域位置,當離開或是進入時,可以跳出訊息,來提示使用者切換警戒狀態。
例如:當離開家的時候,提醒開啟無人在家模式。或是回到家後,降低警戒層級,減少因為正常活動而觸發的警告。
在早期的 ios 即可使用 CLLocationManager 的電子柵欄做設計,當觸發事件時,再使用 Local Notification 提醒使用者。
這次 ios10 直接新增的一個新的 Trigger 型態「UNLocationNotificationTrigger」,讓你兩個願望一次滿足。
下面是 Apple Develope 的範例:

CLLocationCoordinate2D center = CLLocationCoordinate2DMake(37.335400, -122.009201);

CLCircularRegion* region = [[CLCircularRegion alloc] initWithCenter:center
                 radius:2000.0 identifier:@"Headquarters"];
region.notifyOnEntry = YES;
region.notifyOnExit = NO;

UNLocationNotificationTrigger* trigger = [UNLocationNotificationTrigger
                 triggerWithRegion:region repeats:NO];

再加入文字訊息,搭配上 [addNotificationRequest: withCompletionHandler:] 放入 UNUserNotificationCenter。

xcode 可以利用 GPX 檔案讓程式模擬位置。我使用 New File,選擇 GPX 類型,儲存在個好地方後,就可以在 xcode breakpoint 的那欄,使用 GPS。

遇到問題:

  1. 設定在同一個地點有 notifyOnEntry 與 notifyOnExit,當模擬位置到達時,卻同時彈出「進入」與「離開」

參考文件
https://developer.apple.com/reference/usernotifications/unlocationnotificationtrigger?language=objc

 
about 3 years ago

在關閉一點通以前,多寫幾行字悼念他一下。
剛開始使用 macbook 時,因為內建的注音不是很好用(不好用的點已經忘記...)
當時有朋友推薦了「奇摩注音」,的確很方便,按caps lock可以快速切換中英打,或是在中打的時候,利用shift可以打出英文字。標點符號也是顯示全型的,很喜歡,從此就一直使用下去了。
但是...But...每每按到那個什麼一點通,他就是會有個彈出視窗卡在哪,只能 esc 離開,才能繼續打字,始終不知道那到底要幹嘛。
最近因為使用了 Markdown 的語法,要使用 code block 時就會使用到「`」,突然感覺 WTF 一點通!!

Anyway, 我們來把它關掉吧! 喔,別期待在「設定」有什麼勾勾可以關掉他...
我使用 cmd 的方式開啟 vim ~/Library/Preferences/com.yahoo.KeyKey.OneKey.plist
會看到以下的片段

<dict>
  <key>ShortcutKey</key>
  <string>`</string>
</dict>

將他的設定值換掉,使用了「換行」

<dict>
  <key>ShortcutKey</key>
  <string>
</string>
</dict>

存檔離開!
我打這篇文章的時候,再也不用擔心按到「`」不會出現了!

BTW,在搜尋這個問題時,看到2008年就有人反應想要關掉,但是設定無法關掉,到現在都2016年,川普都可以當總統了,奇摩還是不願意加這個功能! 莫非是跳出一次「一點通」他們會賺一塊錢?

 
about 3 years ago

雖然 Widget 並不是 iOS10 的新功能,但是因為 iOS10 的 UserNotifiction 的研究所以也想要來試著應用 Widget 看看。
App Extension 在 Today 中稱為 Widgets,用來讓使用者立即取得一些資訊。例如:股市價格、天氣狀況、今日行程。使用者會導向頻繁的開啟 Today,並且預期可以看到他們感興趣的資訊。

加入 Widget 的方式一樣也是透過新增 Target(iOS > Application Extension > Today Extension)的方式
並且要先去 developer center 加入一個 App Group,可以讓 Widget 與原本的 APP 做溝通。


- App extension:就是我們的 Widget
- Containing app:是原本開發的 app
- Host app:是呼叫 extension 的 app,舉例來說,如果是一個照片修改的功能 extension,那 host app 可能就是 camera roll。以我們現在的 Widget 討論,那 host app 就是 Today 頁面。
- Shared resource:我們設定了 App Group 讓 extension 可以存取原本 app 的資源空間。

Design

Apple 對於設計方面,提供許多的「建議」,希望你不要因為錯誤的設計,而流失使用者!

  1. Widget 應該保持輕巧迅速
  2. Widget 應該功能單一
  3. Widget 應該不打擾使用者的情況下完成功能
  4. Widget 不要阻塞了 host app

Programming

1. Widget is a ViewController

Widget 其實也是為 ViewController,可以用 App 開發的觀念來進行處理。

2. Layout

在排版的設計方面,寬度是固定的,我們可以針對高度的調整做設計。
可以使用 Autolayout 或是 preferredContentSize。
還有針對邊界的操作,可以使用 NCWidgetProviding 中的 theWidgetMarginInsetsForProposedMarginInsets:

3. interaction

Extension 與 containing APP 的 interaction

  1. 自定的 framework 共享程式碼
  2. 利用 App Group,使用 NSUserDefaults、NSFileCoordinator、NSFilePresenter,甚至是 CoreData 和 SQLite 來共享數據
  3. 自定的 url scheme 來開啟 containing app 與向 app 反饋數據。

4. Some Tips

  1. 在 containing app 中加入一個 applicationWillResignActive 的事件監聽,並在觸發時儲存需要的資料在 UserDefault
  2. 利用設定 preferredContentSize 來調整 widget 的尺寸
  3. 利用 NSExtensionContext 來與 host app 做溝通。最後需要在 containing app 的 target 裡設置適合的 URL Scheme。
    // 在 Widget 中,
    @objc private func buttonPressed(sender: AnyObject!) {
    extensionContext.openURL(NSURL(string: "simpleTimer://finished"), completionHandler: nil)
    }
    // 然後在 AppDelegate.swift 中,處理打開事件,並檢測計時是否完成,然後做出對應:
    func application(application: UIApplication!, openURL url: NSURL!, sourceApplication: String!, annotation: AnyObject!) -> Bool {
    if url.scheme == "simpleTimer" {
        if url.host == "finished" {
            NSNotificationCenter.defaultCenter()
                .postNotificationName(taskDidFinishedInWidgetNotification, object: nil)
        }
        return true
    }
    return false
    }
    
  4. 在 Widget 沒有被出現的時間,系統會定期呼叫,可以進行一些 API 的詢問,來更新widget。

    // 設定 delegate NCWidgetProviding
    @interface TodayViewController () <NCWidgetProviding>
    // some var
    @end
    func widgetPerformUpdateWithCompletionHandler(completionHandler: ((NCUpdateResult) -> Void)!) {
    // Perform any setup necessary in order to update the view.
    
    // If an error is encoutered, use NCUpdateResult.Failed
    // If there is no update required, use NCUpdateResult.NoData
    // If there is an update, use NCUpdateResult.NewData
    completionHandler(NCUpdateResult.NewData)
    }
    

相關文章
Apple Dev
human-interface-guidelines
iOS 10
http://www.jianshu.com/p/11a68ae3ef7e
http://cdnnn.07net01.com/2016/09/1674260.html
iOS 8
http://www.takobear.tw/2014/06/28/ios-8-sdk-extension-item/
https://blog.hsin.tw/2015/ios-dev-notification-center-widget-app-today-extension-widget/

 
about 3 years ago

iOS 10 讓我更接近了 Android

因為工作需求,摸索了一下 iOS 10 Notification 相關的一些變化,與實作功能的研究,也閱讀了許多網路分享的資料,將心得記錄在此。
由於之前都沒有實際開發過 Notification 相關的功能,所以直接學習 iOS 10 新支援的 framework,有些功能在 iOS8 就有支援,但是採用的 App 似乎不多,因此感覺都很新奇。
除了新功能之外,也有許多的改變勢將過往的功能整合起來,不會像以前一樣零散,至少我覺得學習起來蠻容易上手的。

Apple Developer Doc
Local and Remote Notification Programming Guide
活久见的重构 - iOS 10 UserNotifications 框架解析

被移除的元件

- UILocalNotification
- UIUserNotificationSettings
- UIUserNotificationCategory(UIMutableUserNotificationCategory)
- UIUserNotificationAction(UIMutableUserNotificationAction)
- handleActionWithIdentifier:forLocalNotification:
- handleActionWithIdentifier:forRemoteNotification:
- didReceiveLocalNotification:withCompletion:
- didReceiveRemoteNotification:withCompletion:

初始設定

  1. 加入 UserNotifications.framework
  2. 使用 @import UserNotifications;

向使用者申請權限

// Swift
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) {
    granted, error in
    if granted {
        // 用户允许进行通知
    }
}

// Objective-C
[center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound + UNAuthorizationOptionBadge)
                              completionHandler:^(BOOL granted, NSError * _Nullable error) {
                                  // Enable or disable features based on authorization.
                                  // granted = YES,取得權限
                              }];

向 APNS 要求 token

利用 registerForRemoteNotifications 索取,並且在 didRegisterForRemoteNotificationsWithDeviceToken: 得到 deviceToken。 (這一步與iOS9以前一樣)

// Swift
UIApplication.shared.registerForRemoteNotifications()
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let tokenString = deviceToken.hexString
    print("Get Push token: \(tokenString)")
}

// Objective-C
[[UIApplication sharedApplication] registerForRemoteNotifications];
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken;

Notification 權限檢查

為了避免重要的服務,一定要開啟 Notification,我們也可以檢查看看當前的設定是否正確。

// Swift
UNUserNotificationCenter.current().getNotificationSettings {
    settings in 
    print(settings.authorizationStatus) // .authorized | .denied | .notDetermined
    print(settings.badgeSetting) // .enabled | .disabled | .notSupported
    // etc...
}

// Objective-C
UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter];
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
    //settings.authorizationStatus == UNAuthorizationStatusAuthorized)
}];

Notification Request 基本概念

UNNotificationRequest 包含

  • identifier(標記此request,未來可用於更新、刪除)
  • content,
  • trigger(本地端:TimeInterval、Calendar、Location,遠端只能馬上顯示)

然後利用 UNUserNotificationCenter 發送 UNNotificationRequest

APNS 的格式

{
  "aps":{
    "alert":{
      "title":"I am title",
      "title-loc-key":"XXXXX",  // 搭配多國語言檔使用
      "title-loc-args":"XXXXX", // 可以成為 title-loc-key 的 %@ 變數值
      "subtitle":"I am subtitle",
      "body":"I am body",
      "loc-key" : "GAME_PLAY_REQUEST_FORMAT",   // 搭配多國語言檔使用
            "loc-args" : [ "Jenna", "Frank"]        // 可以成為 loc-key 的 %@ 變數值
    },     
    "category":"saySomething",                              // 對應一個 category 的 identify (按鈕與自定UI需要)
    "sound":"default",
    "badge":1,
    "mutable-content":1                                             // for Service Extension
  }
  "file1" : "https://xxxx"      // 可以作為顯示 Attachment 的路徑
}

取消和更新

利用 identifier(遠端 apns-collapse-id)來針對發送過的訊息進行處理

// 本地端
    // 針對已傳送
    UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: [identifier])
    // 針對等待中
  UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: [identifier])

目前因為公司的 Server 使用 Amazon SNS,而 apns-collapse-id 是在 header,可能需要 Amazon 支援。

對訊息做出對應的動作的 delegate

// Swift
UNUserNotificationCenterDelegate 
    userNotificationCenter(_:didReceive:withCompletionHandler:)
  userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) 

因為涉及打開APP的反應,所以必須在 applicationDidFinishLaunching: 之前就要設定好 delegate。

// 設定 delegate 範例
class AppDelegate: UIResponder, UIApplicationDelegate {
    let notificationHandler = NotificationHandler()
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        UNUserNotificationCenter.current().delegate = notificationHandler
        return true
    }
}

利用 response: UNNotificationResponse 可以接收由訊息來的一些資料。

// 發送時
let content = UNMutableNotificationContent()
content.title = "Time Interval Notification"
content.body = "My first notification"
content.userInfo = ["name": "onevcat"]

// 接收時
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
    if let name = response.notification.request.content.userInfo["name"] as? String {
        print("I know it's you! \(name)")
    }
    completionHandler()
}

Actionable Notification 訊息按鈕

針對有自定按鈕的訊息,需利用 Categories 來做設計。
Local的使用 CategoryIdentifier 來指定,Remote的使用 category 來指定。

透過建立Notification Category來自定一個 Action:

// Swift
UNNotificationCategory(
    identifier:"saySomethingCategory",                                      // 標示
  actions: [inputAction, goodbyeAction, cancelAction],  // 動作設定,此為一個Text Input Action
  intentIdentifiers: [], 
  options: [.customDismissAction]
)
UNUserNotificationCenter.current().setNotificationCategories([傳入UNNotificationCategory變數]);

// Objective-C
UNNotificationCategory* categoryDEMO = [UNNotificationCategory categoryWithIdentifier:@"SomeID" actions:@[Action1, Action2] intentIdentifiers:@[] options:UNNotificationCategoryOptionCustomDismissAction];
[center setNotificationCategories:@[categoryDEMO,categoryDEMO2]];

使用者點選後,觸發 userNotificationCenter:didReceiveNotificationResponse:

// Swift
func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        //response.notification.request.content 可以得到 content
    //                              content.title
    //                              content.userInfo
    //response.actionIdentifier 可以得到 被選擇的Action的identifier
}

// Objective-C
- (void)userNotificationCenter:(UNUserNotificationCenter *)center
didReceiveNotificationResponse:(UNNotificationResponse *)response
         withCompletionHandler:(void(^)())completionHandler {
    NSString* actionIdentifier = response.actionIdentifier;
    DLog(@"Tapped in notification by %@", actionIdentifier);
    // Must be called when finished
    completionHandler();
}

Notification Extension

Notification extension 有兩種:
Service Extension:前者可以在收到 Remote Push 時,可以先做處理(30s)
Content Extension:可以用来自定通知的樣式

Service Extension

當我們想要對遠端訊息做一些操作,例如:加入 attachments、加解密,我們必須先對訊息進行計算的時候,我們可以使用 Service Extension來達到目的。
訊息必須符合:

  1. 需要顯示 alert 的遠端訊息
    1. aps 訊息中包含 mutable-content : 1

利用新增內建的樣板設計步驟如下:

  1. 新增 Target 並使用 Notification Service Extension當做樣板。(當初在這卡很久!)
  2. 即可發現xcode新增好一個資料夾與程式檔案
  3. 新增的Template已經幫你寫好,將title多加一個 [modified]
  4. 在將 push message 加入"mutable-content" : "1"
  5. 原則上就會看到接收到的訊息被改變了!
  6. Push Message 中在 apns:{} 外的值,可以在程式中使用 [xxx.userInfo objectForKey:@"image"]取得 Push 過來的值。

必須要實作的 delegate

didReceiveNotificationRequest:withContentHandler: // 訊息進入後的觸發點
serviceExtensionTimeWillExpire  // 如果在didReceive的執行時間到達限制時,則會啟動這個函式,讓你在顯示訊息前做最後修改。

Info.plist file 會自動建立,基本上不需要多做修改即可使用。以下有兩個比較關鍵的值:
NSExtensionPointIdentifier key to com.apple.usernotifications.service
NSExtensionPrincipalClass key to the name of your UNNotificationServiceExtension subclass

PS. 遇到的問題:

  1. 原本是用 iPhone5 做開發,雖然有出現[modified],但是隨後的修改都沒有效果。 後來改用 iPhone6 來開發,就可以成功了。
  2. 下載的連結檔案需要符合 https
Content Extension

利用 Xcode 的模板建立 UNNotificationContentExtension 的 UIViewController 子類別。
一樣也是利用類似 Service Extension 的建立方式,加入新的 Target。
範例會自動建立兩個method:

- (void)viewDidLoad;
- (void)didReceiveNotification:(UNNotification *)notification;

一樣的也有 Info.plist 但是相較於 Service Extension,Content Extension可以做的變化比較多,有三項如下:

UNNotificationExtensionCategory // 設定 Category 名稱,需要與 aps 中的設定一樣
UNNotificationExtensionInitialContentSizeRatio // 系統在載入時等待畫面,預設的長寬比例
UNNotificationExtensionDefaultContentHidden // 當顯示出 Content UI時,是否要隱藏原本的"title, body"

PS. 如何在 extension 部分做 debug?
在 Run 時,選擇你要跑的 extension,xcode會詢問你要 choose An app,然後再選你的 app,即可有 log 與 breakpoint。
(雖然記得剛開始使用過這樣的作法,但是不成功,可是後來查到這個作法後,的確可行!)

PS. 在 extension 使用 App 現有的圖片資源
可能是因為 Extension Bundle 與 main Bundle 的不同,所以需要設定 Copy Bundle Resource
可以新增一個 Asset Catagory,加入需要的圖片再加入 Bundle Resource

UNNotificationAttachment

讓訊息可以夾帶 聲音檔(Audio 5MB)、圖片(Image 10MB)、影片(Movie 50MB),但是限制使用手機中的檔案。
本地端使用時只要 UNMutableNotificationContent 中的 attachments 設定好物件 UNNotificationAttachment 即可。
遠端的通知訊息則需要靠 UNNotificationServiceExtension 來做下載動作,再放入 attachments。
NOTE:

  1. extension bundle 與 main bundle是不同的!
  2. UNNotificationAttachmentOptionsThumbnailClippingRectKey 設定的預覽圖 UNNotificationAttachmentOptionsThumbnailTimeKey 設定 gif 或是影片的預覽圖
  3. attachments 為一個陣列,但是只會顯示第一個。 在要客製訊息UI時,則可以顯示多個attachment
  4. 在建立 UNNotificationAttachment 時,如果 URL 的檔案還沒有準備好,會直接有 Error (Code:100)
    UNNotificationAttachment
    identifier 物件的ID URL 物件的位置 type 檔案類型

使用 Amazon SNS 做實驗

登入SNS並且完成閒置步驟後(未實際操作過),從
- (void)application: didRegisterForRemoteNotificationsWithDeviceToken:
取得device toen

  1. 在 SNS/Applications/Endpoints 中搜尋出 Toekn
  2. 選擇 Publish to endpoint
  3. 選擇 JSON
  4. 輸入 Message (需要加入 \",不可換行)
    {"default":"This is the default Message","APNS_SANDBOX":"{ \"aps\" : { \"alert\" : {\"title\":\"You have got title.\",\"body\":\"You have got email.\"}, \"badge\" : 9,\"catgory\":\"FF01|25\",\"mutable-content\":1,\"sound\" :\"default\"}}"}
    
    另外一個工具 Knuff Knuff可以使用正常的格式,從 {"aps":"xxxxx"}開始,無需加"\"
 
about 3 years ago

原文閱讀來自 Determine the Root Cause: 5 Whys

在 6-sigma 分析中,透過詢問「為什麼」來找出問題的真癥結,它不涉及數據分割(Data segmentation),假設檢驗(hypothesis testing),回歸(regression)或其他高級統計工具,在很多情況下可以在沒有收集數據之下完成。
透過詢問 Why 讓你一層一層剝開問題,有時候一個問題引發另一個問題,雖然此為 5 whys,但是可能實際使用上,會需要更多或是較少的問題,讓你找出問題癥結。

5 Ways 的優點

  • 幫助你辨認問題的 root cause
  • 定義不同的 root case 間的關係
  • 最簡單的工具之一,不需要統計學

5 ways 的使用時機

  • 當問題關係到人的因素或是反應
  • 當是日常的業務範疇,可搭配 6-Sigma

如何完成 5 ways

  1. 「寫下問題 Problem Statement」將問題寫出來,可以幫助你定義出完整的問題,也可以讓團隊聚焦在一樣的問題上。
  2. 「討論這個問題 為何 Why 會發生」將問題發生的 原因 Beacuse,寫在問題的下方。
  3. 如果提出來的答案,還未能夠定義出原本問題的 root cause,那麼再提出下一個問題,並且討論問題的成因(why/because)。
  4. 循環檢視 1~3 項,直到團隊同意問題的 root cause 已經被定義出來。

5 Ways 範例

問題: 因為收到的商品不符合他們的規格,造成客戶不滿意。
第一個 Why:為什麼客戶收到錯誤商品?
因為 製造出貨的商品,不同於客戶與銷售部門同意的。
第二個 Why:為什麼製造的商品的規格不同於要銷售的?
因為 銷售員直接聯繫製造部主管來加速出貨。在傳達時發生了錯誤。
第三個 Why:為什麼銷售員直接聯繫製造部建立訂單,來取代公司建立的流程?
因為 訂單建立表格需要銷售主管同意,才能繼續後續工作,拖慢了製造的流程(或是因為主管不在辦公室而停滯)。
第四個 Why:為什麼訂單建立表格需要銷售主管同意?
因為 銷售主管需要向CEO持續報告銷售情況

在這個範例中,使用了四次 Whys,指出沒有價值的簽核造成程序效率降低。因此團隊可以針對這個原因來做改善。

魚骨圖一起使用

5 Whys 可以獨自使用,也可以為魚骨圖分析的一部分。魚骨圖分析可以讓你針對一個問題,展開所有的可能性。當所有可能已經建立在魚骨圖後,即可利用 5 Whys 在釐清出問題的癥結。

Take-away Quotation

If you don’t ask the right questions, you don’t get the right answers. A question asked in the right way often points to its own answer. Asking questions is the ABC of diagnosis. Only the inquiring mind solves problems. – Edward Hodnett

 
about 3 years ago

原文閱讀來自 Dr. BJ Fogg's Blog http://www.behaviormodel.org/


Dr. BJ Fogg提出的行為模型,以三個關鍵要點,來決定使用者是否會執行。

  1. Motivation
  2. Ability
  3. Triggers

透過這三個要點,可以檢視自己所設計產品,是否容易吸引使用者使用。
Fogg教授在三大項中,又各自有明確的定義初小項目。

Motivation

pleasure/pain, hope/fear, acceptance/rejection

你讓使用者動機越強,越能驅動他們去做一件困難的事,反之亦然。
由內而外分別是:這件事情帶給人們內心是「充滿希望/充滿恐懼」,在執行的時候帶來「樂意/痛苦」的感覺,最後擴大的社會層面是這件事情讓社會「接受的/拒絕的」。

Ability

Simplicity

使用者的能力是可以被訓練的,但是訓練使用者絕對不是一件容易的事,除非只剩下這一條否則不要這麼做。
因此,Fogg教授推薦以「簡單化」作為增加Ability的方法(Easy to do)。
具體舉例是「時間」與「金錢」。(我想不只這兩個,但是卻是最容易改變的)

Triggers

cue, prompt, call to action, request, and so on...

三種Triggers的形態,分別是 Facilitator, Signal, and Spark。

  1. Facilitator輔助:以FB為例,在你許久未使用之際,FB會主動提醒你,並且有一個大大的Sign In,讓你「輕鬆」的點擊即可。Facilitator使用在「需要高動機、低能力」。
  2. Signal信號:在「需要中等動機、中等能力」的情況。
  3. Spark刺激:在「需要低動機、高能力」的情況。

Triggers的設計必須要考慮將我們預期的行為能夠串連起來。
以FB為例,面對許久未使用的用戶,FB並不只是提供一個方便的「Sign In」,因為對初期用戶看到一個空空的塗鴨牆沒有任何意義。FB提供一連串的從登入、尋找好友、信任好友,以達到使用FB的目的。

 
about 3 years ago

這是第二次參加 UI/UX Taipei。
雖然並非UI/UX的從業人員,但是設計師與工程師畢竟是相輔相成,知己知彼百戰百勝!?

這場其中一位分享者是「UX策略」的譯者,很巧的事幾個禮拜前剛從博客來買來這本書,是目前正在閱讀的書籍。
當初會選擇這本的書的原因是:

  1. 想要進一步了解UX。這本書是歐萊禮出版的,相信應該有他的品質,從介紹中也可以知道作者是實際從業人員。
  2. 這本書才3百多頁,不像其他歐禮萊的都像字典。體積重量好帶,也符合隨身攜帶的需求。 譯者一言以蔽之「UX策略 就是 做產品」。 因為目前我連第一章(討論商業策略、價值創新、實證使用者經驗、殺手級UX)都還沒看完,但是的確是油然而生的覺得這些跟UX有什麼關係。後來想想這好像呼應了做產品的開端。

=================
延伸閱讀一些在會議中相關的資訊:
。商業+技術+使用者經驗:好的產品缺一不可,也同時闡述到,如果身為「技術」者,那麼下一步可以往哪個方面加強之。
。價值儲存: 用戶可以看到實際被幫助了多少。例如:網路流量控制APP中,明顯提示出為用戶阻擋多少次背景使用網路。
。Chatbot interface
。5 whys and root cause analysis #RCA
。Foggbehaviormodel 法格行為模型(http://www.hansshih.com/post/85896187075/%E8%A1%8C%E7%82%BA%E6%A8%A1%E5%9E%8B-behavior-model

 
about 3 years ago

原文閱讀自 5 things I do to keep up with latest iOS development trends

每年的Apple的重頭戲-WWDC,除了新產品發表,也帶來許多技術相關的消息。
作者建議5件事情,讓你保持掌握最新趨勢。

  1. 觀看WWDC影片
    想要了解最新公布的趨勢技術,那就是直接看Apple提供的影片。 通常一段影片約20~60分鐘,需要找個空檔時間消化他們,還有可能要練習英聽就是。
    Apple videos https://developer.apple.com/videos 請用Safari看

  2. 閱讀Blog
    透過閱讀別人的blog可以知道其他開發者的想法、正在做什麼研究,或是知道該怎麼正確的做事。無論自己已經多麼厲害,總是還是有更強的人。
    作者分享兩個blog:
    Ray Wenderlich ios開發技術相關的文章。
    Realm Apple 科技相關的演講影片。
    我會開始嘗試寫部落格,也是希望可以養成閱讀,並且分享的習慣。希望未來我可以在增加一些自己常看的blog在這裡。

  3. 使用Twitter
    剛看到這個標題的時候,嚇了一跳,因為我最近才剛加入Twitter,主要的目的除了使用一下現在全球也是前幾大的社群之外,因為多半都是歪國人在使用,所以想說可以看看一些英文語句。
    如同作者說的,我很久以前有使用,但是沒有任何朋友在上面幾乎,所以又離開了。
    作者分享他的使用心得是:
    。簡短、較頻繁的推文風格
    。關注一些名人,之後你就可以在你的牆上看到許多有趣的事 (嗯,我決定取消關注蘋果日報,因為那跟FB重複太大)
    我想要「關注」關於:工作(ios, android, web)、科普、衝浪、棒球。

  4. 使用Github
    難過的表示,我才剛開始用Git幾個月,因為新公司有使用,而以前都是使用SVN。
    目前換到Git後也算是漸漸習慣,並且可以應付日常操作。那麼,Github更重要的價值,應該就是「open source」吧!
    因此挑選有興趣的、相關的repo或是作者,給他一顆星,追蹤他們,讓自己可以得到最新的消息,也是漸漸要建立起來的。
    目前對repo的經驗還太少,暫時不追蹤任何專案或是作者。

  5. 自己實作
    所謂讀萬卷書、行萬里路,能夠實作一些tiny project,對於你正在學習的新知識,是最有幫助的!
    如果有了tiny的實驗後,也要試著把它放在現實生活中,因為有些問題是要在複雜才能顯現出來的。

 
about 3 years ago

對我來說,這應該是值得紀念的一件事。

國小就有上英語教室、國中~高中都不是太有興趣學習英文,
到了大學一年級必須要分級上課,考到了個F班...最後還是以60分劃過,應該是大學成績最差的一科。

出了社會英文就不是老師逼你的,而是自身不得不加強學習。
一直對「商業、生活實用」英文有興趣(不會也不行),所以在工作期間就試著考考看TOEIC。

2010年的時候,買了一本國際學村的TOEIC實戰題庫,他的內容是標準的考試題型,總共有三回合,並且每題還有詳解,說明一些文法觀念或是如何分析題目。
記得我是用每天早晨,大約30分鐘左右,做做題目練習聽力。


雖然這個分數大概在一個唸到碩士畢業的人不是很好,但是我知道對我自己來說...已經是運氣很好。
當時公司規定,如果是RD主管要650分,我當時年資很淺,離主管還很遠,所以在一般的RD標準中是很好的~哈哈

後來離職,創業,忙忙碌碌過了六年,這期間沒有持續補強英文。直到又「回到」職場,當個上班族,每天有多出些時間可以安排,就想說是不是K一下書,再來考一次TOEIC。
英文這種不會跟時間演進的東西,不像資訊相關的書,可能會推陳出新。因此,我又翻出六年前的國際學村題庫本,當做是練習的工具。因為從確定報名到考試,這次只有一個多月的時間,所以我直接看了兩個回合的試題解說,力求可以記得每一題目所要考的文法、單字或是觀念,心理打著唸多少算多少。最後一週則是完整花了兩個小時,做一次模擬試題。
模擬試題做完,按照分數表計算一下,總共五百多分...我想說看來這次1500元是要浪費了,但是隔天就要考試,也只能以平常心去面對他。
考完後我就沒有太掛心這件事,想說算是先給自己一個評量,之後再繼續學習,再持續考試。
一個月後,成績單寄來,打開前心中已經想著看到5xx的失望準備...


嚇到自己看到的數字,不僅沒有退步比上次差,還越過了700分大關,查了一下730好像是第二級證書的最低分,我想金色證書我是不可能啦,但是能有個藍色好像也不錯!
這次考試的心得:
1. 準備期間不斷的背單字,因為大家都覺得語言最重要的還是單字
2. 文法克漏字力求抓到題目的關鍵點,例如關鍵介係詞、時態,以及對應前後文必定是名詞或是副詞
3. 聽力考試因為是背時間追著跑,所以盡量能在開始唸題目前,看一下已經有選項的單字,以增加自信
4. 閱讀測驗這次也是先做最後一部分的短文閱讀,因為短文需要推敲,如果最後才寫會心慌意亂

閱讀測驗最後填完後,還有回到短文閱讀檢查幾題自己沒有看的很懂得的文章,或許因此救回幾分吧!