2015年10月6日 星期二

Tabook?

Phone 和 Tablet 的合體叫做  Phablet,用以定義大尺寸的手機 (例如 6 吋以上),除了可以打電話和傳訊息外,還可以拿來上網瀏覽網頁和看影片,是個高度受歡迎一魚兩吃的產品,特別是在亞洲地區。

那 Tablet 和 Notebook 合體叫做甚麼呢?好像還沒有類似的名詞定義出來,不過把兩個字結合起來的 Tabook 似乎是個不錯的名詞。

上個月的 Apple WWDC 2015 發表會上,Apple 發表了一款 12.9" 的平板 iPad Pro,此款平板的訴求正式向 Notebook 靠攏,亮點有三個:

  1. 整合型 keyboard (結合保護套)
  2. 觸控筆
  3. Microsoft Office 的支援 

從亮點來看,不難發現 iPad Pro 除了想要帶給使用者平板的便利性之外,還要帶來類似 Notebook 的鍵盤和文書處理 (Productivity) 的使用經驗,再加上他的神奇觸控筆 (能感應下筆力道強度的不同) 和軟體之間的高度整合,甚至更甚 Notebook 一籌。 Apple 一旦出手,就不只是產品規格的提升,而是排山倒海的軟體配套和加值服務,還有完美的使用者體驗 (UX)。因此,說 iPad Pro 為 Tabook 始祖應該說的過去吧!

而就在這幾天 (2015/10/6) 又看到另一個消息,指出 Samsung 正在開發一款 18.5" 的超級平板 Galaxy View,到底 Galaxy View 也是同樣瞄準 Tabook 市場的秘密武器還是另有所圖 (或者只是個超級大的呆平板),可能還要繼續的看下去才知道。不過就算是瞄準 Tabook,照之前Apple 陣營和 Android 陣營對新東西的 PK 歷史 (怎麼沒有微軟呢?),恐怕可能還是 Apple 略勝一籌,畢竟使用者想要的是完整的服務,而不是半吊子的支援,這點 Apple 總是做的比別人來的突出。

下圖是擷取自 9to5google 網站的圖,詳細文章出處 http://9to5google.com/2015/10/05/samsung-galaxy-view-tablet-specs/

Galaxy View的規格在跑分網站上被洩漏。
(取自9to5google) 







2015年9月18日 星期五

2015年的網路泡沫?

今天看到了一篇 Inside 的文章,提到近年來 O2O 在大陸的盛行,以及最近大陸經濟衰退下可能造成這些新創公司的大量死亡,文章出處來源如下。

http://www.inside.com.tw/2015/09/16/winter-is-coming-chinese-startups-are-gonna-pass-away 

這讓我回想起了 2001 年的網路泡沫,1995 ~ 2001 年的時候,網際網路正在興起,一堆所謂 .com 的新創公司不斷成立,投資人看到有網站就捧著錢要投資,我還記得當時這些.com 公司都是這麼說的:"只要能夠創造出流量,以後自然能夠獲利"。在當時的氛圍下,只見這些年輕的金童玉女們被媒體和投資人吹捧著,只要網站的來客計數器不斷的增加,獲利模式一點都不重要。這樣的氣氛,隨著 Nasdaq 指數攀到最高點之後開始崩壞,一家家 .com 公司在獲利不佳的情況下紛紛倒閉,終至網路泡沫的結束。

這就是歷史,歷史能夠告訴我們過去發生的事情以及教訓,但歷史終究會不斷的重演。當年的教訓告訴我們,一個找不到獲利模式的 business,儘管流量衝得再高,錢總是會有燒光的一天,終究是無法通過考驗的。過去幾年大陸經濟崛起,熱錢也紛紛流到大陸尋找投資機會,這些大陸 O2O 的公司在投資公司的推波助燃下,撒大錢的透過補貼去擴大他們的經濟規模,看似前景光明的 business,在沒有明確的獲利模式下錢越燒越少了。伴隨著2015年這一波的經濟衰退,投資人的錢也縮手不再砸更多的錢之後,終將會重蹈2001年網路泡沫的覆轍。

有句話說得好,海水退潮後就可以看出誰在裸泳。2015年的經濟衰退就是海水退潮時,屆時裸泳的 O2O 公司會紛紛的被放大檢視,到底你的身材是有料還是無料。無料的的就會被當變態而踢出海邊出局,有料的還要看看是不是有人要繼續投資你幫你買一套新的比基尼泳裝。從 2001 年網路泡沫的經驗來看,雖然有許多的公司破產倒閉,但卻是一個健全體質的好機會,諸位可以看到在網路泡沫之後留下的如 Yahoo / eBay / Amazon,或之後成立的公司 Google / Facebook 等等網路公司是多麼的蓬勃發展。那麼,在 2015 年這波 O2O 公司的泡沫化寒冬之後,迎接的會是溫暖的春天,屆時大陸的新創網路公司可能會邁向一個嶄新的里程。

2015年7月14日 星期二

初識 Container

自從 Docker 問世之後,開始炒熱 Container 這個話題,我也跟著開始研究起來。2003 年在 .COM 泡沫化之後,離開軟體服務業轉入嵌入式系統和手機產業,轉眼也已十二個年頭了, web service 的變化早已不是以前的 Free BSD/Linux + CGI 了,Python / Json / 等新東西越來越多,面對這麼多新奇的事物,我也只能拿起書本從頭開始研究起。

我自己的第一個問題是,到底甚麼是 container 呢?他好像是虛擬機器但他又不是虛擬機器,Docker 說他跟虛擬機器不一樣,幾乎沒有 overhead。為了一探究竟,我先看看 iThome 上的說明:

一般常見的虛擬機器和 Container 最明顯的差別是,虛擬機器需要安裝作業系統(安裝Guest OS)才能執行應用程式,而Container內不需要安裝作業系統就能執行應用程式。Container技術不是在OS外來建立虛擬環境,而是在OS內的核心系統層來打造虛擬執行環境,透過共用Host OS的作法,取代一個一個Guest OS的功用。Container也因此被稱為是OS層的虛擬化技術。

但看了之後還是有看沒有懂,虛擬機器 (Virtual Machine) 的概念還蠻好懂的, host OS 透過軟體完整模擬出一個硬體系統,包含指令集、BIOS、中斷處理、I/O等等,讓執行在 host OS 上的 guest OS 以為他真的執行在一個專屬的硬體上,某種程度來說,host OS 和 guest OS 沒有太大的關連,host OS只是出租一塊空間給 guest OS。container 的概念是和 host OS 共用,透過 kernel level 的共用技術打造出的虛擬化技術。但這樣的說明還是無法解決我的疑慮,看來我需要比較技術性的說明,而不只是抽象的描述...


(圖片來源http://jenkins-cookbook.cloudbees.com/docs/jenkins-cookbook)


虛擬機器是提供一個獨立運作的硬體環境,代表的意義是要做甚麼事都是你 guest OS 的事情,擁有非常大的空間,甚至你可以在 Host OS 上藉由 VM安裝多的不同的 guest OS (例如:同時安裝 Windows 和 Ubuntu),上圖中的 hypervisor 就是建立虛擬硬體的系統。

Container 既然是從核心層所打造的虛擬環境,自然在 kernel level 會有相對應的支援功能,主要是由 Linux kernel namespace 和 Control group 兩種主要技術所建立的系統,目的是藉由 kernel 的支援,為 process 建立虛擬的獨立空間,既然他的目標是 process,可想而知所針對的是應用程式,而非像 VM 一樣是完整獨立的虛擬硬體。因此,本篇先針對 container 在 kernel 層的支援做探討,以了解他的運作原理和差異。

Linux kernel namespace

Namespace的目的是要為 LWP (Light Weight Process, 輕量級行程) 建立虛擬空間,意思就是要將每個 LWP 隔離出一個獨立的空間,這樣不同 container 之間的 process 就不會互相干擾。

目前支援以下的 namespaces
  • mnt (mount points, filesystems)
  • pid (processes)
  • net (network stack)
  • ipc (System V IPC)
  • uts (hostname)
  • user (UIDs)
  • security namespace
  • security keys namespace
  • device namespace
  • time namespace.

Control groups

Control groups (cgroups) subsystem  是一種資源管理系統,用以對一組 process 做資源的控制,這裡所提到資源可包含 CPU / memory / disk IO / network 等等。透過資源管理,可以設定每個 container 的應用程式能分配到多少資源,讓每個運作在 container 裡的服務都能夠依據其等級得到適當的資源。Cgroups 主要功能有以下幾點:


  • 資源限制 (resource limitation) - 例如:你可以控制 /usr/bin/prog_a 的 記憶體使用不得超過 500 MB。
  • 優先權控制 (prioritization) - 例如:你可以控制 /usr/bin/prog_a 的 CPU resource 為 20%。
  • 帳戶管理 (accounting) - 每個 container 可以視為一個帳戶,透過帳戶管理你可以了解每個 container 的資源使用狀況,甚至可以當作收費的依據。
  • 執行控制 (control) - 你可以為 process 設定檢查點 (checkpoint),然後可以暫停或重新執行他。



結論:

透過 namespace 和 control groups 的支援,host OS 可以打造出一個獨立運作的空間讓應用程式執行,並對此獨立空間的程式提供資源的管理,如此可讓不同的獨立空間的程式皆能夠被分配到資源。使用虛擬機器的每個獨立空間皆須重新安裝一個完整的作業系統,硬碟空間 (安裝作業系統需要大量的硬碟空間) 和系統資源上 (特別是 CPU and memory) 的額外需求是非常大的,因此對比虛擬機器,container 能夠大大的節省上述的 overhead 的支出,在同樣的硬體環境下能夠提供比虛擬機器更多的服務。 然而,這並不是 container 的唯一好處而已,之後會針對 container 在執行佈署上的優點再研究討論。





2015年7月10日 星期五

我看紅色供應鏈


根據WIKI上的描述:

供應鏈是由一連串供應商和採購商組成的團隊,以接力賽團隊的模式,完成從採購原材料,到製成中間產品及至最終產品,然後將最終產品交付用戶為功能的,由一系列設施和分布選擇形成的網絡。

用白話來說,供應鏈是指一個產品的製造過程中所需的各種原料、半成品、零件等等的供應商和採購商所組成一條鏈結。舉個例子來說,一個筆記型電腦製造商生產筆記型電腦的過程中,小至螺絲、螺帽,大至如機殼、電池到包材;便宜如電容、電阻等,貴者如CPU、記憶體、硬碟等,整個BOM表上的大大小小元件可能成千上萬個,其中所需要的供應上可能會數十個到上百個。也因此,供應鏈管理對廠商來說一直是非常重要的課題,除了品質管理上的考量外,對成本的降低來說是非常重要的一個關鍵課題。

一般來說,一個國家或區域的產品發達,通常會看到該產品在當地所產生的產品生態系統,也就是供應鏈。原因非常簡單,就地取材設計、試產、製造生產,才能降低研發溝通成本和生產製造成本。過去台灣在 PC 和 NB 這兩種產品的供應鏈系統,放眼全球無人能敵,也因此造就了台灣在這兩種產品上的全球地位,培養了非常多的零組件供應商。

從九零年代開始,為更進一步降低成本而到中國大陸另闢生產基地,也跟著把生產製造所需的產品供應鏈也轉移到大陸,一直到近年來,中國大陸的供應商也隨著技術的精進而逐漸了取代了台灣的供應商,也就是近年來所說的紅色供應鏈。到目前為止,台灣在 PC 和筆記型電腦上還是握有主導的地位,即便 Lenovo 已經成為一方霸主,但還是仰賴台灣的代工廠(但Lenovo也正在逐步提高自製率)。

手機方面,雖然在2000年初為 MOTOROLA 的代工(華寶通訊,目前已併入仁寶電腦)有著輝煌成績,但爾後MOTOROLA的沒落也導致功能手機代工產業的衰敗。隨後智慧型手機時代,台灣的宏達電的從代工到 HTC 自有品牌雖然異軍突起風光了幾年,但在 Android 市場上又被三星所擊敗,以及近年來更被大陸廠商打的節節敗退。這其中我們可以看到幾個現象:

1. 大陸手機零組件供應商的崛起,從上游到下游的垂直供應整合,廣東深圳、到四川重慶成都,由西海岸到東內陸都有蓬勃發展的零組件供應商。

2. 關鍵零組件廠商對大陸市場的重視,紛紛轉戰大陸對大陸廠商提供更好的價格和支援。或者直接和大陸廠商合作,如 Intel 15 億美元入股紫光展訊,高通(Qualcomm)、中芯、華為及IMEC針對14奈米製程技術合資成立新技術研發公司。

3. 大陸自有品牌崛起,除了本土大陸市場外,也紛紛佔領海外市場的前十名榜單,華為、中興、小米已是世界級大廠,另外還有 LenovoOPPO、One Plus 等中小廠商的崛起。

上述這幾點都在在告訴大家,大陸廠商在智慧型手機產品上的供應鏈系統早已站穩全球市場,不論是從代工製造生產到自有品牌,台灣已全無機會,殊不知台灣廠商手機製造的BOM cost就已經是大陸廠商的零售價格了,怎麼打得過呢!然而,真的只有這麼簡單嗎?最近我買了一款大陸手機,雖然它的外觀和軟體設計還是一樣山寨Apple,但她的品質和細膩度早已不是三五年前的大陸山寨機的概念了。令我訝異的是,他在軟體上的設計和調教,早已令台灣廠商難以望其項背,紅色供應鏈所代表的已是軟件和硬件上的高度整合了。

傳統在看供應鏈的時候,看的是零組件供應商。然而讓我更擔憂是,紅色供應鏈在軟件和硬件上的高度整合的實力。傳統 PC 和 NB 上的軟體供應商是除了微軟外沒有第二家,然而 Android 系統是由 Google 提供手機作業系統的基礎,最終產品系統的整合和調教是靠手機廠商高度的軟硬體整合。台灣過去就是因為過度依賴微軟而忽略了產業供應鏈上的軟體供應商,導致在智慧型手機產業的供應鏈戰略上,始終缺乏完整的方案而終至失去了市場。

因此,我們在看待一個產業的供應鏈時,必須拋開以硬體的思維,必須以軟硬體整合的角度來思考。展望未來,雖然台灣在智慧型手機產業摔了一跤,我們應該記取教訓,放眼另外一個山頭,物聯網 IoT 的時代雖然尚未來臨但已經開始萌芽。台灣廠商在戰略思惟上切勿再以硬件的思維,如何建立軟硬體系統整合的供應鏈,才是未來成功的關鍵!















2015年6月24日 星期三

談願景和企業文化 (Vision and Culture)

從出社會工作到現在已經十多載,經歷了幾家公司,也看盡公司的起起落落。有些公司 business model 一直抓不到,一直在找尋機會如何 break even。有些公司曾經非常的成功,但大環境的變遷導致市場巨變,原本的勝利方程式變成了毒藥。或者是公司的產品沒跟上市場脈動,與消費者漸行漸遠。

這篇先不談複雜的問題,例如領導階層的問題,創新能力,市場分析等等...
我只想從這幾年的心得來談談兩個主題:
  • Vision 願景
  • Culture 企業文化
Vision 願景

Vision 的中文是願景,我覺得願景又分趨勢願景和積極願景

趨勢願景就像是你預期 10 年後將會是什麼樣的世界?根據這樣的變化你可以做甚麼樣的事情或產品來迎接未來的市場

積極願景是你希望10 年打造出什麼樣的世界讓未來更美好?這個層次是比趨勢願景更高一等級,他代表的是創造!

為什麼要有 Vision?先回想一下你看戰爭片或警匪片的時候,狙擊手通常是在什麼樣的位子?當然是在制高點把目標物看的一清二楚,才能夠在扣下扳機之後一槍命中。當一個領導就像狙擊手一樣,必須站在制高點才能看的遠,去看十年之後的方向在哪,到達終點的路途有哪些障礙物。如果站的不夠高就無法看的遠,只能夠一路跌跌撞撞的摸索,或者看著其他成功者所開闢出來的道路尾隨。

因為站的夠高看的夠遠,才能知道前方的路要怎麼走,有哪些障礙物,才能依據所看到的情報規劃出 roadmap。例如你在亞馬遜森林中迷路了,想要找到一條出路,首先你必須先找到一個高台或爬上一顆高大的樹,看一下四周環境,例如太陽的方位,附近是否有河流或村莊,亞馬遜河在哪裡,

要如何規劃思考願景?其實是一個大哉問。以近代企業來說,似乎只有賈伯斯是個能看穿未來世界,一手規劃從 iPod 到 iPhone /iPad,建立行動市場的生態 (App Store)。但是,難道必須如強者賈伯斯之超人才能去做願景規劃嗎?其實非也!任何企業都需要願景,也必須投入資源去探索願景,雖然我輩之流不能像賈伯斯一樣登高一呼叫大家 Follow ME!但透過持續的探索和持續的修正,也能為企業找出一條血路出來,就算不是康莊大道,也能是個到達目的地的崎嶇小徑。

我想強調一個重點,沒有多少強者能夠一開始就能準確預測未來的三五年的市場趨勢,因為現在已經是全球化的世界,任何國家或市場的脈動都可能會影響未來的發展。唯有透過不斷的探索,才能找到那條崎嶇小徑,如果只是佇在那裏不動等人家搶灘頭堡後再去 Follow,那只是不斷地採別人的足跡撿拾剩餘的價值;又或者是亂槍打鳥毫無章法的淺嚐即止,不願意認真的深入研究嘗試,員工只會被你搞得頭昏腦脹、筋疲力盡。


Culture 企業文化

剛畢業投入社會的時候,對於企業文化這個名詞完全沒有概念,當時很流行 HP Way 這樣概念的東西,只覺得好像是一家大公司的 slogan,用來提升自己形象的廣告詞。隨著工作打滾多年之後,漸漸的對企業文化這個 term 有了比較深入的了解,原來他可以不是 Slogan,他應該是企業組織裡的 DNA,去驅動每一個單位裡每一位員工。

其實每一個公司都有他的企業文化,差別只是在於和他的 Slogan是否相符而已,台灣一些公司還是和以前反共復國時期一樣,以為只要把標語寫在牆上事情就會成真。DNA是騙不了人的,就好像是偷生的小孩用DNA就能驗出真假一樣,把自己公司說的天花亂墜,但DNA是騙不了人的。企業文化通常是由創辦人在建立公司的過程當中,內斂萃取出來的特質所形成的。

企業文化之重要在於他決定了企業做事情的態度,例如:Amazon 上自創辦人兼 CEO Jeff Bezos,下到 Engineer / service staffs,所奉行的企業文化就是 "Customer Centric",所以 Jeff可以為了一個客訴而親自對客戶溝通。一家企業能不能夠屹立不搖,就在於他能不能夠有效的建立企業文化,去驅動自己、去改革自己。企業文化不需要是艱深的道理,重要的是他是不是深植在企業組織的 DNA 裡,而不只是那牆上的標語而已。



自己從工作到現在總共待過大約三家公司,有幾家是大企業,有一家是startup的小公司,好像都經歷了由盛到衰的歷程(是自己帶衰嗎?),回想過去這些企業的歷史,似乎都和願景及企業文化有蠻大關聯。隨著全球化浪潮,科技業也正面臨新的工業化時代,許多產業正處於破壞式創新。要如何在新的工業化革命中不被消滅,我認為積極的探索願景和良好的企業文化,絕對是這場革命浪潮中迫切需要的救生圈。


Android BLE App Development


Bluetooth and BLE

BLE standards for Bluetooth Low Energy, which is standardized as Bluetooth 4.0. It doesn't intended to replace or enhance classic Bluetooth (2.0/3.0). It is designed with a new protocol stack for the specific services/applications which required much lower power consumption for getting much longer lifetime. 



BLE defines following roles in GAP from the perspective of BLE .
- Peripheral device
The peripheral device broadcast
- Central device

I think you can find a lot of more information in the other public websites. Therefore the detail about BLE is not introduced here. The major focus here is to let you know BLE programming for Android.

BLE Working Flow

Generally the BLE programming on a smartphone or table works as a central device. It scans the peripheral devices and then connect to it. The connection then will be used to access the peripheral device's attributes/characteristics or wait for the notification from peripheral device. You can refer to the profile document to know more detail about how to access the attributes/characteristics.

Below I divided a complete BLE session into following pieces from the role of a central device.

1.      Scan BLE device
2.      Connect to a device
3.      Read/write BLE attributes (characteristics)
4.      Receive GATT notification (optional, based on the need of profile)

BLE Permission Declaration

Before starting the BLE programming, you have to declare enough permissions for  BLE operations on an Android device. Below are the permissions you should add in your App.

Declare the Bluetooth permission(s) in your application manifest file.

<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>


If you want to declare that your app is available to BLE-capable devices only, include the following in your app's manifest:

<uses-feature android:name="android.hardware.bluetooth_le" android:required="true"/>


Android BLE API

Android starts to support BLE since 4.3 (API level 18). It introduced the Bluetooth LE related functions as below:
BLE scanning function was added in the existing class “BluetoothAdapter” which works originally for the traditional Bluetooth (2.0/3.0). More classes were also added to support BLE features  

Since Lollipop (API level 21), a new package “android.bluetooth.le” was introduced to address the BLE device scanning and advertising. The class “BluetoothLeScanner” is used to replace the Bluetooth LE scanning function

Device scanning:

(BluetoothManager) getSystemService(Context.BLUETOOTH_SERVICE);

API level 18 ~ 20
BluetoothAdapter = BluetoothManager.getAdapter()
BluetoothAdapter.startLeScan()

API level 21 or later
BluetoothAdapter = BluetoothManager.getAdapter()
BluetoothLeScanner = BluetoothAdapter.getBluetoothLeScanner()
BluetoothLeScanner.startScan()

Device Connecting

To setup a connection, you need to create a service to receive the response of a service request.
Use bindService to bind this service with your activity. After it, the connectivity is managed by the event (intent) for connection, profile attributes, characteristic

That’s why we need to do 2 things before really starting the connecting.
-          Bind Service
-          Register Receivers to register all intents in the activities from the BLE service you bind.

ACTION_GATT_CONNECTED                          connected to a GATT server.
ACTION_GATT_DISCONNECTED                     disconnected from a GATT server.
ACTION_GATT_SERVICES_DISCOVERED                discovered GATT services.
ACTION_DATA_AVAILABLE                              received data from the device. This can be a result of read or notification operations.

BluetoothDevice = BluetoothAdapter.getRemoteDevice() // by giving device address
BluetoothGatt = BluetoothDevice.connectGatt()

Speedup the reconnection
BluetoothGatt.connect()


Read/write Attributes

-          After connecting to the remote GATT server, you can request to get the service
BluetoothGattService = BluetoothGatt.getServices()
-          When you get the service, you can use it to get its characteristic to read or write according to the definition in the profile.
BluetoothGattCharacteristic = BluetoothGattService.getCharacteristic()

Here I use the diagram below to illustrate the relationship of the classes.




Receive GATT notification (optional)