2017年6月14日 星期三

gsutil + cronjob 自動下載 Google Play 報告

替客人開發的應用程式上架快將一個月了,同事每隔天便需要把最新的下載報告交給客戶;而這個報告目前只有我才能拿到手。為免同事因為我在忙而無法準時提交報告,於是很想把事情自動化。利用 Crontab + gsutil 可以達成!

首先編寫了一個 Bash 程式,原因是 gsutil 是 shell 指令,它能從 Google Cloud Storage 下載報告到本地;而我又想把這些報告以電郵附件方式傳送出去,這個部份會以 PHP 程序執行,能把這些東西揍在一起的,最好是用 Bash 了。

有了 Bash 程式,之後就是設定 Crontab 按時執行:

這裡遇到一個問題,當我 SSH 進入伺服器,手動執行 download.sh 時是一切正常;但當用 Crontab 執行時,卻出現「401 Anonymous users does not have storage.objects.list access to bucket 」錯誤。努力除錯後,發現「HOME=/root」是解決問題的關鍵,需要格外留意。

2017年6月11日 星期日

初試 Core ML + ResNet 50 模型

今日繼續研究 iOS 11,選了 Core ML。將 Apple 的一個示範程式修改,加入已訓練好的 ResNet50 模型。準確度不是百份百,卻已很不錯。WWDC 影片中關於 Machine Learning 部份都是以 Swift 為例子;我用的是 Objective-C,網上找不到相關的資料,只好自行轉換。


還好,難度不高,花一點時間便完成。

2017年6月10日 星期六

把景深數據轉換成 PNG 圖像


在 iOS 11 下利用 iPhone 7 Plus 拍攝了數張帶景深數據的相片,很想看看數據呈現的模樣,於是寫了以下程序:
CVPixelBufferRef depthDataMap = depthData.depthDataMap;
CIImage *ciImage = [CIImage imageWithCVPixelBuffer:depthDataMap];
CIContext *context = [CIContext contextWithOptions:nil];
CGImageRef imageRef = [context createCGImage:ciImage fromRect:CGRectMake(0, 0, CVPixelBufferGetWidth(depthDataMap), CVPixelBufferGetHeight(depthDataMap))];
UIImage *uiImage = [UIImage imageWithCGImage:imageRef];
NSData *data =  UIImagePNGRepresentation(uiImage);
UIImage *pngImage = [UIImage imageWithData:data];
UIImageWriteToSavedPhotosAlbum(pngImage, nil, nil, nil);
CGImageRelease(imageRef);
白色是近,黑色是遠。


2017年6月9日 星期五

iOS 11 帶有景深資料的圖片


自 iOS 11 開始,用 iPhone 7 Plus 雙鏡頭拍攝的照片會帶有景深資料。如果將平面的相片加入數據轉換成立體時,便會有這樣的效果!這樣,要把 iPhone 7 Plus 變成一台立體掃瞄器應該是可行了。

以下是另一個示範:

2017年6月8日 星期四

初試 iOS 11 ARKit


WWDC 每天的演說都會隨即公開,第一天便有 ARKit 的介紹,於是立即看看。上一年,我拿 MacBook Pro, iPhone 6 Plus 及 Apple Watch 來試 Beta 版本,換來經常出現問題;所以今年還是不要把重要的裝置升級。但我又很想嘗試 ARKit,於是下載了 Xcode 9 Beta 及把 iPad Pro 升級為 iOS 11 Beta。還好,iPad 可以用 OTA 來升級,不然我的 MacBook Pro 一定沒有足夠的空間讓我去達成這個想法。

根據教程,只要用 Xcode 9 建立新的項目,選 ARKit 範本,及以 SceneKit 作為渲染的引擎,然後 Build 就可以。果真如此。本來以為 ARKit 要用到 iPhone 7 的鏡頭才能做出穩定的 AR 影像,結果 iPad Pro 單鏡頭也做得很好。看來將會很好玩!

2017年6月1日 星期四

在 Raspberry Pi 2 安裝 Google Assistant(二)


今天帶了 Raspiberry Pi 2 回公司,找來 USB 咪高峰,正式運行 Google Assistant。

這時咪高峰沒有驅動程式而無法運作,於是我輸入「startx」跳進圖形介面,再在設定中加入咪高峰。事成後退回到 Console 畫面;測試輸入及輸出功能。輸入「speaker-test -t wav」理應有聲音輸出,聲量也校得很大,還是沒聽到甚麼。想到可能是 HDMI 畫面會連同聲音一起輸出,於是執行「raspi-config」看看:



把聲音強制由耳機埠輸出。再次執行「speaker-test -t wav」;今次有聲了,但還是很細小。

接著是「arecord --format=S16_LE --duration=5 --rate=16k --file-type=raw out.raw」錄音測試。錄好後以「aplay --format=S16_LE --rate=16k out.raw」播放,成功!

輸入「source env/bin/activate」啟動先前設定好的執行環境後,輸入「google-assistant-demo」便能啟動。

2017年5月30日 星期二

在 Raspberry Pi 2 安裝 Google Assistant


自從教識了網友到誠品書店購買這期 MagPi 後,到我自己到誠品購買,才得悉全香港已經沒有貨,也不會補貨。唯有想想其他辦法,包括託朋友在上海、澳洲及台北誠品購買,結果也是購買不到。雖然買不到,還是可以自行製作,於是拿出 Raspberry Pi,按照 Google Assistant 網頁的指示進行安裝。


不過,也不是很順利;出現了上圖的錯誤。後來我用 sudo apt-get upgrade 後再來一次便成功了。輸出用的喇叭有,但輸入用的 USB 咪高峰則欠奉,沒有得試...。

2017年5月28日 星期日

B 型企業


從老闆 Kenny 的臉書看到「B 型企業」這個名字。公司買了兩本相關書籍,老闆也鼓勵我們借閱。

我在 2017 其中一個計劃是讀 12 本書。如今五月,沒讀完一本。剛好對「B 型企業」有興趣,決定借來一看。找了幾天公司的書櫃,也找不到書的蹤影;後來在 CRM 部門主管的桌上找到,得到他的同意,我借了回來。

「B 型企業」的宗旨很有教會的感覺,主張大愛,關心及照顧組織內的各個單位。對此,我是認同的。不過,在現實的世界上又如何能做到?又如何能永續經營?就是我希望在書中找到的答案。

書中列舉了十大好處去吸引老闆們成為「B 型企業」。出發點是好的,但我認為如果是為了利益而成為「B 型企業」,有違本意,倒想知道有幾多個能堅持下去。其中有一個好處是指當競爭對手不是「B 型企業」時,身為「B 型企業」的公司便會更有先機。我很想反問,那大家都是時又會如何?書中說的那個很艱難才會得到的認證,說得白一點,其實只不過是「自 High」的玩意。至於說吸引人才,我相信物以類聚,人以群分;沒有指哪一種方法最好;百米養百人,合則來不合則去;不存在只有做好事的企業才有好的人才。書中根據每一條規則作出解釋,雖然能讓讀者明白,但感覺很沉悶。我支持「B 型企業」為大眾著想的心意,但一切還是需要發自內心。原本以為企業能以利益而成為「B 型企業」,看過當中的規矩後,便覺得沒有出心出力,也很難得到「B 型企業」這個資格。

看畢仍沒找到我想知的答案,書中不斷重覆一兩個好處,沒看到實實在在永續經營的例子;只看到不斷地遊說入會。看來答案要自己尋找...。

2017年5月27日 星期六

刷新 Nvidia Jetson TK1 的經歷


今日急不及待地把昨天拿到手的 Nvidia Jetson TK1 刷新 JetPack 3.0。要做這個步驟,首先得有 Ubuntu。在 Mac mini 的 VirtualBox 安裝好 Ubuntu 16.04.2 LTS 並進行刷新,等了一個小時,還是卡在 Making system.img...。當中 Mac mini 曾經關掉了顯示訊號,以為這樣影響了 USB 運作,於是重頭來過;等了兩小時,仍然卡著。在網絡上得知最理想是用 Ubuntu 14.04 LTS,於是重灌一次;又等了兩小時...。放工回家,在舊的 Mac mini 上再做,結果一樣。原來很多人指用虛擬機器會有這樣的問題,得用實機。

找來了一台 Fujitsu Lifebook,安裝 Ubuntu 64-bits 無法繼續,只好安裝 32-bits 版本。到安裝 JetPack 時才發現它只支援 64-bits!頂,又要再來過。於是找來一台退役了的 MacBook Air,把本來 Windows 的分區安裝成 Ubuntu 14.04 LTS。今次卒之成功了,不再卡著!但整個安裝過程等了又等,共花了三至四個小時...。還把本第 Macintosh 的啟動區也破壞了,無法啟動到 macOS,又要重灌 macOS 一次...。花這麼多功夫才成功刷新 Jetson TK1,真是很辛苦呢...。要是我家中沒有這麼多台後備電腦,相信會是很麻煩的事。

2017年5月25日 星期四

Nvidia Jetson TK1


朋友轉工,放在公司裡的 Nvidia Jetson TK1 由於家裡沒有空間,於是問我是否接收。

Nvidia 是 Machine Learning 必會接觸的品牌,這台 Jetson TK1 支援 OpenCV 及 Tensorflow,我二話不就就回答「好」了。今晚我們在太子地鐵站內碰面,除了把 TK1 交給我之外,也閒聊幾句。回到家後,急不及待地接上電視,確認成功啟動。可是畫面邊緣部份都走出可視範圍之外;而且朋友說只用過數次,想必系統需要更新到 JetPack 3,我決定留待週末重灌一次...。