Pages

Sunday, February 27, 2011

聯合航空的 Premium Service

http://www.unitedps.com/
Tim Brown 享譽國際的創新設計公司 IDEO 執行長在 Design Thinking 書本裡面提到一個體驗航空的服務。Tim Brown 經常在舊金山和紐約之間很頻繁飛來飛去,但是它很享受這趟旅程。不過曾經坐過飛行變種必須忍受的苦差事。老舊飛機、狹隘的座位和不好吃的食物以及很爛的育樂設備,加上不方便的飛行時刻和冷淡的服務,完全讓這趟飛行一點都不好玩。

聯合航空在 2004 年,於 『舊金山 - 紐約』這條航線上引進了 p.s. 服務 (Premium Service) 的心服物企圖解決飛行不好的體驗。聯合航空也因為靠這次的出擊,一舉領先了其他競爭者。他們做了哪些優化,將座艙椅子都改成商務座椅,因為這條路線商務人士居多。伸腿的空間大許多,增加了寬敞的感覺。引進好吃的食物和優質的 DVD 播放讓旅客欣賞。

最讓 Tim Brown 印象深刻的是增加地板的空間,不但可以有足夠的空間擺放行李不會擋到其他乘客,還可以把從登機到起飛當種輕鬆休閒的時刻,多了社交的體驗,因為寬敞舒適多,大家不再煩躁推擠,取而代之的是變成好心情和鄰座有機會聊天認識。而這只是剛開始,因為飛機尚未開始起飛呢!這種造成旅行的興奮感和期待感,不只連結了旅客的行程表,還連結了情感。

當我們在坐飛機,在雜貨鋪買東西,或者在旅館辦理住宿登記,不只是單一功能完成就了事,這過程也是一種體驗。如果我們沒有拿出好的專業工程師對待產品、好的建築師對待房子謹慎態度來設計功能的體驗,將會使原本的用心的功能都變成折扣,這是體驗設計的概念。

您是否也有在做一個服務或是開發一項功能產品呢?市面上有沒有競爭廠商,他們帶給客戶的體驗是什麼?有沒有讓使用者遭遇挫折。如果我們多想一些,改善了那些,讓使用者在使用服務或是產品同時,增加體驗,何嘗不是一個好的方式。

Premium Service 官網有在做介紹展示,設計的相當的漂亮,搭配輕鬆鋼琴配樂,當我們在光顧嘗試瞭解他們網站會帶給我們怎麼樣的舒適?有哪些服務?美食和方便資訊,已經迎造了很棒舒適享受的氣氛了。

Saturday, February 26, 2011

NSUserDefaults customize behavior to match a user’s preferences

NSUserDefaults class 提供了一個介面來方便跟系統預設儲存的值互動存取。Default system 允許我們開發的 iPhone app 可以來客製化管理使用者喜歡設定。舉個例子,我們可以幫使用者辨別多少數量要預設顯示,有多少檔案要自動化儲存。

應用程式會紀錄指派值給參數儲存進入使用者預設的資料庫。而這參數是可以用來參考使用者辨別系統起來狀態或者要顯示的預設狀態。

在程式運作 Runtime,我們可以用 NSUserDefaults 物件來讀取出來使用,NSUserDefaults 會幫我們 caches 資訊避免每次要資料都要開開關關資料庫,裡面有 synchronize method 可以自動的幫我們確保記憶體裡面 cache 有和 user default 資料同步。

NSUserDefaults 提供了非常方便的 method 可以來取得 floats, doubles, integers, Booleans 和 URLs。如果想要儲存其他類型的物件,我們要把它用 NSData 來 archive 起來。

Defaults database 會自動的幫每位使用者建立,NSUserDefaults 物件是 thread-safe  的。

Friday, February 25, 2011

Load more

假設今天 iPhone app 想要跟 Server side 查詢我們有興趣的資料,Server side 開放 Web service 且透過 API 查詢,我們給了適當的查詢條件後,就可以查符合使用者要的資料回來。

在 iPhone app 呈現是,一開始畫面載入進來查詢前面 20 筆,如果畫面滑到底部可以呈現『載入更多』多 10 筆的按鈕,這時候可以持續透過網路查詢更多的資料來呈現。如果畫面滑動回到畫面最上方,提供可以下拉放開重新整理,可以將整個頁面全部重新整理。這樣的使用者體驗不論在查詢 feeds 或者任何有興趣想看到的訊息,這種方式蠻常呈現的。

在查詢 API 方面我們會希望可以多上了 limit 和 offset。這兩個用法跟我們來查資料庫的資料概念一樣。Limit 來決定每次 iPhone 跟 Server side 要多少資料筆數,例如 limit=10 就是跟 Server side 要 10 筆即可。太多資料不是我們希望看到的,不但 Server 端要處理比較久,且透過網路傳輸和呈現,太大太肥的資料不是我們希望看到的。Offset 是用來告知要忽略多少筆資料,例如已經查過了第 1~10 筆資料,那麼第二次跟 Server side 我們會希望從第 11 筆開始,這時候就可以讓 offset =10 ,搭配 limit 如此一來即可做到像我們系統表單上幾筆到幾筆點閱一樣。

規劃 Data Model ,這支負責傳入要查 API 的 URL ,裡面負責透過 API 進來,加上一些附加的條件來決定資料回傳筆,再將資料陣列回傳給 Data source 來呈現。開設一個 function 叫做 load more (boolen),透過傳進來告知是否是查詢更多或者僅是重新整理。在這個 load more 的 function 去決定 limit 和 offset 要組合的值。

Saturday, February 19, 2011

UIActivityIndicatorView 告知使用者請稍候

我們在寫 iPhone app 時後,如果碰到像是網路傳輸 networking 時候,速度是不固定的,有的地方載入會快速,但是有些地方就會變得很慢,這要看收訊好不好。所以如果我們程式有用到網路,如果碰到傳回來很慢,但是卻要告知使用者請稍候我們可以怎麼做呢?我們可以做一個 UIAlertView,裡面搭載訊息加上轉圈圈,提升更好的使用者體驗。

我們拿 UIAlertView 來使用,它會出現在畫面最上層,我們可以定義 Title 為請稍候 Please wait,接者讓它 show 顯示出來。另外在使用 UIActivityIndicatorView,在初始化的時候有幾種 Style 可以挑選:UIActivityIndicatorViewStyleWhiteLarge, UIActivityIndicatorViewStyleWhite, UIActivityIndicatorViewStyleGray。這邊我們選擇 UIActivityIndicatorViewStyleWhiteLarge。再來我們定義他要出現的位置,中央是哪一個點,最後開始跑圈圈,並且掛載到我們前面的 UIAlertView 上。

那怎麼停止呢?另外開一個 method 叫做 performDismiss 讓裡面可以停止該 alert 的程式碼即可。

最後將兩個 methods 搭上線。如果程式有用 Cocoa delegate pattern 可以透過某個事情結束 callback 回來執行是一種方法,這邊先以固定秒數結束來看範例。

Monday, February 14, 2011

從 MKReverseGeocoder 解析更多地理資訊

MKReserseGeocoder class 提供了可以將座標 (經度、緯度) 轉成關於座標的相關資訊,像是哪一個國家、都市哪一條街名。Reverse geocoder 是一個和網路類的地圖服務查詢關於該地點的資訊。在 MipKit framework 使用 Google 的服務來查詢地圖資料。在 Google 使用條款裡面有定義說使用 reverse geocoding 服務必須搭配使用 Google map。所以我們在設計應用程式使用者介面時候,要注意這點。

每一個 Map Kit 的應用程詢問 reverse geocoding 服務是有限量的,所以我們在使用這時候要節制,使用時候在最有效的情況下使用:
  1. 使用者操作時候謹詢問一次地理位置。
  2. 如果使用者想要多重操作牽扯到地理位置,而且是同一個地理位置,那麼我們就要重新利用之前查出來的資訊,而不是一味的回到 service 去詢問。
  3. 當想要自動化更新地理位置,例如使用者移動,僅當使用者在合理的時間尖隔確定移動了一段距離再詢問。所以情形來說,我們不會是每分鐘就詢問超過一次地理資訊。
  4. 在使用者沒有馬上要知道地理結果前,不要去詢問 reverse-geocoding。

使用此功能 iOS 裝置必須有連到網路,才能取得資訊。而 Reverse geocoder 透過實作 delegate 物件回傳資訊,而這物件必須加入 MKReverseGeocoderDelegate protocol。如果無法取得資訊,那麼會回報錯誤給 delegate 物件。

Friday, February 11, 2011

Rubywarrior has climbed to the top of the tower

繼上篇 Rubywarrior for the beginner 介紹,Ruby warrior 是一款設計來教學 Ruby 程式語言,透過互動規劃 AI 來過關的娛樂遊戲。我們扮演一名戰士要爬到高塔的位置取得珍貴紅寶石。每一層樓我們要寫 Ruby script 來建構控制我們的戰士來對抗敵人,解救俘虜,取得階梯。我們每層樓開戰以前可以得到一些線索可循,但是不知道開戰後會發生什麼事情。我們必須要寫足夠的 AI 技巧來讓我們的戰士足夠應付每一關。

在 Beginner 的塔有 1~9 關,每一關會發生什麼事情我們不會知道,僅知道這關會長什麼樣子,戰士可以用哪些技能來搭配破這關,當 Ruby script 跑下去就見真章了。在這過程我們除了要學寫 Ruby ,我們還可以在過程學到了什麼呢?

AI 分析能力,練習預測與判斷,列出會發生的狀況,這過程好比我們在開發程式前,先把 Functional Spec 先確定,再寫程式碼。好幾關我都是必須要先把白紙拿出來,畫了幾個狀況,才能規劃出我的邏輯判斷式。

程式碼不是拋棄式的。每一關的戰士是來自上一關,一層一層往上爬,所以戰士判斷能力是會接續的。當知道這點我們就不會亂寫我們的程式碼,或者硬寫只是為了過上一關。因為每過一關,進入到下一關,我們是必須要接收來自上一關的程式碼,寫出更好維護與增加擴充的程式碼。

Refactoring (重構)的練習。破該層樓是最終目標,所以能打敗敵人過關是最基本條件,這樣分數未必高分,所以我們如果以可以破關進入下一關為跑出來結果為對前提,再求 我們的分數要高,所以程式碼改寫求更好是必須要的。例如俘虜忘記解救,誤判誤殺,或者休息過多浪費回合數,這些都是可以破關但是可以改進的空間。

Wednesday, February 9, 2011

Rubywarrior for the beginner

Ruby warrior 是一款設計來教學 Ruby 程式語言,透過互動規劃 AI 來過關的娛樂遊戲。我們扮演一名戰士要爬到高塔的位置取得珍貴紅寶石。每一層樓我們要寫 Ruby script 來建構控制我們的戰士來對抗敵人,解救俘虜,取得階梯。我們每層樓開戰以前可以得到一些線索可循,但是不知道開戰後會發生什麼事情。我們必須要寫足夠的 AI 技巧來讓我們的戰士足夠應付每一關。

如果您有興趣,在先安裝 gem,再來下 gem install rubywarrior。如此一來在 Terminal 下 rubywarrior 即可展開冒險與學習 Ruby 語言之旅。一開始會讓我們選擇要 Beginner / Intermediate,我們就先從 Beginner 開始。

關卡介紹。

Beginner 關卡是一維,透過 x 軸移動前進後退,這邊為每一關卡開戰錢的樣貌,各個符號意思為,> = Stair, @ = Warrior, s = Sludge, S = Thick Sludge, C = Captive, a = Archer。
Level 1 - |@      >|
Level 2 - |@   s  >|
Level 3 - |@ s ss s>|
Level 4 - |@ Sa S>|
Level 5 - |@ CaaSC|
Level 6 - |C @ S aa|
Level 7 - |>a S @|
Level 8 - |@ Cww>|
Level 9 - |>Ca  @ S wC|

敵人介紹
Sludge : 12 HP, Attack 傷害 3, Attack 距離 1 space ,殺死可以得到 12 分。
Thick Sludge: 24 HP, Attack 傷害 3, Attack 距離 1 space,殺死可以得到 24 分。
Archer :  7 HP, Shoot 傷害 3, Shoot 距離 2 space,殺死可以得到 7 分。
Wizard : 3 HP, Shoot 傷害 11, Shoot 距離 2 space,殺死可以得到 3 分。

俘虜介紹
Captive :  1 HP ,解救可以得到 20 分。

Sunday, February 6, 2011

The Kindle 3G Wireless Reading Device

The All-New Kindle 3G Wireless Reading Device, smaller, lighter, faster, with 50% better contrast.

Kindle 是 Amazon.com 這兩年來銷售排行榜的第一名,它是大家最希望收到擁有的禮物,且得到 Amazon 上面評價五顆星,這新一代讓它變得更好。高解析度使用 E Ink 螢幕強化閱讀、可以在大太陽下閱讀不會反光、變得更輕薄、如果在沒有開網路情況下可以使用上一個月、可以容納 3,500 本書、可以在任何時間任何地方下載書、買了 3G 無線版可以免費使用不用綁約、內建 Wi-Fi 強化上網速度等等。

曾經我想要買一本原文書,上了 Amazon 書店找到了該本書,而且擁有特價非常吸引我,但是加入購物車要結賬時候,算算運到台灣運費,這價格就要破表了,一點都沒優惠了。逛回國內線上書店,找到了該本書,但是價格未必這麼好,但是比一下價格還是有點優惠,還是下單結賬了。

當一人自己住在外面,搬過家就會很清楚的知道,我到底有哪些資產,佔了前三名種類的是:書、衣服、小傢具。沒錯書佔了第一名,當初搬家因為必須要搬,書本只好在痛惜之下,捨棄掉了一些,剩下部份跟隨著我。現在看著自己的家,前三名的種類還是有書,如果再搬一次家,那這些書的後果也會遭到這些命運嗎?如果我聰明一點,可以提早上網拍賣掉一些、或者捐出去不會再跟隨我的書,那麼試想想看那些書的生命週期。

當我朋友有買了 Kindle 3 ,我拿來借閱讀,並在搭配 iPad 來閱讀比較了一番,瞭解彼此的優缺點,再回到前面的故事,我知道我要什麼了。我想要看原文書、想要書本可以拿來畫重點摘錄筆記、想要能靜下心長時間閱讀 (我們很需要養成長時間閱讀的習慣,現在 Social network, instant message, smart phone 即時短暫消息佔據了我們的生活)、最後可以讓這本書可以有折扣的購買,最後可以跟著我久久。於是我買了 Kindle 3!價格比一副太陽眼鏡還便宜。

但是 Kindle 沒有觸控螢幕一點都不炫!這點我也一直很納悶。但是當我看了 Amazon Founder Jeff 座談會才恍然大悟,因為加了觸控螢幕,那麼螢幕跟觸控中間會需要一層的觸控面板,工程技術上可行,而這面板勢必會造成使用另種解析效果,造成無法可以清晰舒適閱讀。這是一個取捨。

但是 Kindle 沒有彩色僅有黑白也不炫!這點我也想過,但是當想到它可以待機這麼久,最重要適合閱讀。我們看書通常是白底黑字,我們看報紙是白底黑字,這才能適合貼近我們長時間閱讀的習慣。

但是 Kindle 還是跟實體書不同,無法像書本翻越紙張,在上面畫畫螢光筆。這是目前科技產品還無法可以模擬做到,但是很多功能做出來已經可以貼近這些習性了。Kindle 閱讀上可以用指標移動來畫底線,可以將佳句加上註解分享出去,可以加入書籤等等達到提醒自己的作用。這些無法像真的書的閱讀習慣,但是它卻帶來其他更多的好處,薄好攜帶好收藏,不需要用到紙,另外一種環保。

Amazon Kindle 是一個可以方便攜帶電子書的閱讀器,但是更明確一點,它是包含軟體、硬體以及網路平台的環境,讓我們喜歡閱讀的人可以瀏覽、購買、下載、閱讀電子書或者報紙和雜誌。

最後我看完了 Founder Jeff Bezos discusses the All-New Kindle 座談會,我學到了很多。今天 Amazon Kindle 不是要擊敗誰而做,非零的結果,也不是跟隨觸控式螢幕像 iPad 這樣的產品做出一個 me too product,而是希望可以專注研究 Reading 做出讓使用者做個而外選擇而挑選的閱讀裝置商品,Amazon 花了將近六年的時間做研究,包含第一版 2007 年上市前做了三年的整個研究。也為什麼 Kindle 願意花時間在技術上整合智慧型手機 Blackberry, iPhone 和 iPad 或者 Mac 等等裝置,Amazon 希望消費者可以 Buy once, read every where. 如果您有興趣了解更多,可以觀看這個非常有意義 40 分鐘的影片。