2020年1月21日 星期二

[開箱] EZCast Ultra 與 Chromecast Ultra 比較

EZCast Ultra 01

不知為何手邊多了這產品可以體驗一下。大概是年節將近,不知該帶什麼伴手禮 (誤)

EZCast Ultra 02

包裝盒上有六國語言,有繁體中文!

EZCast Ultra 03

內容物有 EZCast Ultra 主體一個、一條 USB <-> Typc-C 線(供電)、一條 HDMI 公對公。因此 EZCast Ultra 已經跟主流產品一樣,採用 Type-C 接頭供電了。對比三年前在 2016 年底出產的 Chromecast Ultra 還在採用 Micro-USB ,也算是一時之選吧?

EZCast Ultra 04

開機畫面還滿精美的,這灣好眼熟,不曉得是不是義大利的?

EZCast Ultra 05

接著下載 EZCast app ,掃螢幕上的 QRCode 有引導設定,還可以透過藍芽設定 EZCast Ultra 對外網路,滿方便的。

EZCast Ultra 06

最後,提一下跟 Chromecast Ultra 主要差別,因為我剛好是 Chromecast 重度使用者 XD

EZCas tUltra and Chromecast Ultra

  • 外觀上不會差太多,Chromecast Ultra 用 Micro-USB 接頭供電;EZCast Ultra 用 Type-C 接頭供電
  • 兩者都支援 4K 輸出
  • Chromecast Ultra 要求一定要有對外網路的使用環境;EZCast Ultra 沒有對外網路時,一樣可以使用,如透過 DLNA 協定,把區網內的 NAS 拉影片來播放
  • Chromecast Ultra 有支援 DRM,看 Netflix 必備的環境;EZCast Ultra 支援 MIRCAST/AirPlay/DLNA 常見標準協定,支援很多作業系統,若沒有在觀看 DRM 保護的數位影音,應當都還非常方便
  • Chromecast 閒置時可以播放個人照片;EZCast Ultra 則是有動態風景桌布可看
  • Chromecast 跟 EZCast Ultra 都有支援音控服務,但 Chromecast 是天生跟 Google 生態完美整合,如 Android / Chrome 都可方便投放,像常用 Spotify 就可以很方便的叫 Chromecast 或 Google Home mini 播放音樂
EZCast Ultra 有其跨 OS 優勢跟特色,補足 Chromecast Ultra 先天設計的限制,都是很不錯的產品,希望哪天 EZCast Ultra 可以補齊 DRM 就完美了!

據說很多公司想跟 NETFLIX 談 DRM 都不是很順利,大多要求 Android-based 類的產品,如何能取得 NETFLIX 公司信任,真是一門學問。

2019年12月31日 星期二

[眾籌] Puffin OS - Mobile Phone

Puffin OS Phone

這是一間規模已經大到破億 Mobile User 的公司,恰好一堆高手朋友都在裡頭發展著。

記得第一次接觸是 2009 還 2010 年,下一刻就 2013 年,再下一次就 2018 年。2018年底用著硬體廠的角色互動著,當時略知其發展,一年後就蹦出了這成品了。

此刻,依舊想著 server side rendering 的 remote browser 的需求是否強到持續養著一間公司呢?就像想著經濟學閒書所提,GDP 成長率差的國家,藉由新技術輸入,一口氣就躍進許多,而實力中等的國家隨著通訊技術的進步步調,通信品質的提升也不會慢太多。

無論如何,期待這間又猛又有夢想的公司,繼續茁壯著

2019年12月24日 星期二

[韓劇] Search: WWW / 검색어를입력하세요WWW / 請輸入檢索詞WWW


今年為了研究串流平台先後繳了學費給 NETFLIX、SPOTIFY和愛奇藝。在 NETFLIX 上看了一齣韓劇和台劇,在愛奇藝看了一部韓劇跟日劇,而大概快半年了,中午都用 SPOTIFY 聽聽別人講英文。

聊聊這次為何會在愛奇藝上看這部 Search:WWW ,主因是雙11才剛買了一年份 XD 其次是被這戲名給吸引到,看了下去才發現根本是跟自身領域高達七成相關,包含學生時代就在 Search Engine 的實驗室成長著、出了社會管了信箱就得處理離職人員信箱課題,在工作上除了負責網站服務外,近兩年又兼了流量變現任務,也體會了網站改版與流量變現議題的衝突。

一整個完完整整的就是工作縮影,而沒體驗到的大概是劇中都在開海神叉的車 XDD 人生啊...

不過 Search Engine 這話題基本上都已經算是15年前甚至20年前的故事了,而這戲的女主角們也都是略有年紀的,也稱得上是另一種老人回憶模式...

若時間往前轉到 15 年前、20年前,那一批當時隨網路服務蓬勃的前輩們,推論抓住機會的的確都開得起海神車,或是已經取得不少資源,可以做更多純興趣的投資了呢

2019年12月2日 星期一

FB 廣告投放筆記

FB廣告投放

2018 年夏天跑去聽了一門泰國老闆的經商之術,2019年秋天尾則是看到FB廣告大神的臨時加開課程就衝了一發 XD 本身不算這個領域的,但每次衝去接觸就有新的感觸,真的不錯!

這算是我第二次廣告投放聽課,上一次是在新創內部課程,距今大概 5 年了吧。聽這課程還滿不錯的,花個短短的四小時複習一下有哪些新東西,跟哪些容易遺忘的東西。剛好近兩年在搞流量變現,現在把思維反過來用。

這門課採用實務教學方式,過程沒有投影片,而是一頁頁瀏覽器直接操作 FB 廣告投放的後台,有許多一言難以道盡的心得,條列式如下:
  • FB User 興趣、地理位置、社群互動資訊,依舊是強項,這是 Google Ads 難以對抗的項目。消費產品的電商就是靠 FB Ads 啦
  • Online-Merge-Offline (OMO) 廣告投放早已很成熟,店家透過 Point of sale (POS) 店頭機系統可以將線下活動資料匯入到 FB 廣告後台,即可做到上線線下整合,例如對到店用餐的客戶投放線上購物的資訊,這兩者是互補而非互斥,例如實體餐飲店的體驗轉換成線上購買新式甜點等。而線下為了收集到客戶的 Email 和手機幾乎無所不用,辦個優惠/贈品活動都是(想起來那些送化妝贈品要留姓名電話的過程嗎?)
  • 不要期待自流量帶來的交易,且在 3C 產業不要再對已購買的再行銷。對既有客戶再行銷屬於耗材類的商品才有意義。
  • 不需太強調 A/B Test 的策略,實際上運作就會不斷追求更佳文案,自然會演化到最佳的路線(就像寫程式不見得一定不用靠 framework ,久了為了好維護就會自成 framework 的)
  • FB 為了用戶體驗也會評分你的文宣,依照評分機制評估該讓你的文宣給多少受眾觀看。鼓勵多和用戶互動,別人分享或留言都可以去按讚,大概可以參考蝦皮/全聯/政治/眾籌等其他小編文章,一樣有滿滿的互動。
  • 粗略引流成交的成本約 300-800 台幣,商品利潤有這等水準就該試試 FB Ads 買流量導購電商
  • 電商領域上,不要過度陷入到曝光價格/點擊價格的競局,重點還是訂單成交跟獲利
其中,我覺得最重要習得的策略是評估廣告文案的狀態。評估一則廣告文案是靠受眾佔比數量,若在條件中受眾的數量是 10萬,那實務上大概也只能接觸到 50% 而已,在接觸到 50% 之前,大概 5-10% 時就可以評估文案跟受眾的互動成績,以此決定是否要換文案或受眾。

這些評估策略的經驗還滿寶貴的,著重的不在廣告投放時間,而是更精準的受眾互動數據。

講師也提到一些概念,也驗證過去自己猜測的方向:
不要以為廣告一直打,用戶可能哪天想起會買
也就是廣告不是一直擺在那邊花錢,接著催眠自己哪天用戶會想起的。

實務上,有效的廣告投放可能一天內(最遲七天內)就會看到成效。而重複對一個用戶打廣告的方式也是用不同文案,永遠要避免同一個文案被一個用戶重複觀看,重複觀看可是傷了自己的荷包。

跟這類似的本業領域大概就是數據收集,不認真思考數據收集的目的/情境,就全部說收,殊不知網路儲存要費用、數據運算的算力也是要費用,搞到最後所有的收集就跟沒收集一樣,隨著時間而逝。當然也有反過來的,就是拼命想規劃情境收集,沒有明確的評鑑用途就淪為八卦資訊,數據價值又隨著時間衰減而無意義。

其中 A/B Test 就有那麼一點點味道,因為所有文案/策略都有時空背景,不見得訓練出某個經驗就可以一直沿用,搞到最後就是不需 A/B Test,永遠真槍實彈上場,心中自成一把尺可以評估該文案到底能不能再進步,因為久了就該略知哪些 CTR / CPC 是合理的、是可以再進步的。

這行業也是令人小抖,例如好不容易找到了高價值受眾,結果這款商品銷售完後,就得再打起精神再找下個受眾,這種沒完沒了的生活... XD 其實跟新創差不多,在時間限制下看誰先搶下市場。搶下市場或得資源後,就開始進入資本主義的保衛戰,建立更高的市場跨入門檻,一日復一日。這時就覺得當個投資人是多麼幸福的事,靠分散風險錢砸下去就好,不用浪費自己的青春年華啊。

2019年11月27日 星期三

[Go] 透過 Golang 操作系統內建 WebView @ macOS, WKWebView

最近在幫同事想想,到底有沒有什麼更方便的環境去協助同事分析網頁的組成。再加上自己想順便了解一下 golang 是如何跨平台的,就隨意找了這套:github.com/zserge/webview ,看了看,學到不少東西。

心得一:所謂的跨平台,是別人幫你做完所有苦力

在 webview.h 裡頭就定義清楚在 Windows / Linux / macOS 上所使用的 WebView 元件為何,超佛心的幫你串好常見的用法

心得二:macOS 的 WKWebView 就跟 iOS 內的沒啥兩樣

簡稱想要做到更細的東西,都得靠 hack ,黑來黑去好累啊。像是想要追蹤一個網頁形成過程到底用了哪些 resource ,於似乎想要追蹤所有 request ,接著又要想想該如何向 UIWebView 那麼方便查看,接著又要想想是不是要用 WKURLSchemeHandler ,又該怎樣把系統內定的 http/https 黑回來 NSURLProtocol 處理等等,還是要搞個 proxy mode 追蹤?

想著想著...啊不就換套 CEF 就好 XD

於是乎,我就放棄 zserge/webview 在 macOS 上操弄 WKWebView !不過也趁這個機會我練了一下怎樣從 C call ObjectiveC 或者說從 Go 怎樣操作 ObjectiveC,也是總緣份吧

這次操弄 zserge/webview 大概玩了:

- 欣賞 zserge/webview 大大怎樣提供跨平台呼叫瀏覽網頁的元件

- 從 C 操作 WKWebView 物件,接著再呼叫它的 methods 換掉 User-Agent 資訊

WEBVIEW_API void webview_set_user_agent(struct webview *w, const char *user_agent) {
  // https://developer.apple.com/documentation/webkit/wkwebview/1414950-customuseragent?language=objc
  objc_msgSend(w->priv.webview, sel_registerName("setCustomUserAgent:"), get_nsstring(user_agent));
}


- 從 C 操作 WKWebView 物件,接著再呼叫它的 methods 添加監聽 didStartProvisionalNavigation 和 didFinishNavigation

static void wk_webview_didStartProvisionalNavigation(id self, SEL cmd, id webView, id navigation) {
  // https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455621-webview?language=objc
  webview_print_log("at wk_webview_didStartProvisionalNavigation");
  //id absoluteString = objc_msgSend(objc_msgSend(webView, sel_registerName("URL")), sel_registerName("absoluteString"));
  webview_print_log( get_webview_current_url(webView) );
}

static void wk_webview_didFinishNavigation(id self, SEL cmd, id webView, id navigation) {
  // https://developer.apple.com/documentation/webkit/wknavigationdelegate/1455629-webview?language=objc
  webview_print_log("at wk_webview_didFinishNavigation");
}

// ...

  Class __WKNavigationDelegate = objc_allocateClassPair(
      objc_getClass("NSObject"), "__WKNavigationDelegate", 0);
  class_addProtocol(__WKNavigationDelegate,
                    objc_getProtocol("WKNavigationDelegate"));

// ...

  class_addMethod(
      __WKNavigationDelegate,
      sel_registerName(
          "webView:didStartProvisionalNavigation:"),
      (IMP)wk_webview_didStartProvisionalNavigation, "[email protected]:@@");
  class_addMethod(
      __WKNavigationDelegate,
      sel_registerName(
          "webView:didFinishNavigation:"),
      (IMP)wk_webview_didFinishNavigation, "[email protected]:@@");


收工!