2017年6月30日 星期五

正確安裝 Python 模組的指令


感冒及腸胃炎連環發生,連續兩晚充裕的自療後能消除感冒,但第一次得到腸胃炎,還未感覺到身體能擊退病毒的方法。今天唯有去見醫生,吃過幾劑藥,腸胃未見好轉,但精神已經恢愎,可以繼續研究。

停了一輪的 Machine Learning 是時候重拾學習的階段。我一直想開發出一個能分辨中文留言是否正評的模型;這個應該算是初級難度。說是應該,是因為英文的有很多,中文的卻一個也沒有;初級之餘,動手做的比較多,但又不是太過困難,所以應該是初級。然而,在我家中的 Mac mini 安裝 Python 模組,就算用 pip3 也會把模組安裝到 Python 2.7 的目錄下,實在奇怪。找了很久,才發現有人指最確切的做法是用「python3 -m pip install module」指令;畢竟 pip3 有可能被捷徑影響而變成 Python 2.7 的 pip。試過後果真有效。

2017年6月28日 星期三

「Sita 陳僖儀」Facebook 專頁的數據

今日編寫了一個小程序去讀取「Sita 陳僖儀」的 Facebook 專頁,嘗試找出一點啟發。

截止目前為止,整個專頁有 662 個貼文。


留言共 26,496 個。即平均每個貼文有 40.02 個留言。


留言最多的貼文有 17,926 個留言,大家估到是哪一個吧 (T_T)。


有 15,667 人留過言,即平均每個貼文有 23.67 個人留言;而留言得最多的粉絲是:


我同時也有拿反應數據,總共有 40,121 個,即平均每個貼文有 60.61 個反應:


有 12,455 人給過反應,即平均每個貼文有 18.81 個人有反應:


而各反應最多的是「讚好」,那是因為 Sita 離開後一段時間才出現「讚好」以外的反應:

以下是根據貼文時間以小時為單位,可以看出 Sita 最愛貼文的時間為:

2017年6月24日 星期六

用 LINE-Bot 下載 musical.ly 高清影片


女兒近兩個月來愛上玩 musical.ly 這個應用程式,拍了很多音樂影片。作為爸爸,很想保留她的成長片段,於是研究了一下。

試過用 Charles Proxy 作為中間人觀看影片流量,想從中找出影片的路徑;也是過把 iPhone 連接 iTunes,希望應用程式能把下載的影片分享到 iTunes,可惜沒有;用了好幾個方法也找不到。後來發現 musical.ly 自帶的分享到電郵功能,不過片中會加入帳號名字,且影片比原來的小,變成 480x852;但如果分享到 LINE 或 Copy Link 的話,則會是轉介到網頁畫面,內裡的影片沒有帳號名字之餘,解像度達 540x960。

要找出影片檔案,只要在網頁上的影片位置點擊滑鼠右鍵,選「Inspect」後會彈出視窗,反白了的文字。下方能發現影片的 MP4 地址:

於是我把女兒的影片,一個一個地分享到 LINE,慢慢地找出 MP4 地址,再一段一段地貼到瀏覽器的地址列並下載。

可是,這個方法太慢,女兒有些影片轉頭便刪了,就算的得到地址也無法下載。於是,我想到把下載影片的工作自動化;只要分享到 LINE 入面,我之前寫好的 Sita LINE-Bot,她便自動為我下載。要達到這個目的,得找出影片地址的方法。在 Chrome 中打開開發人員工具,觀察載入地址,會發現「https://www.musical.ly/rest/v2/musicals/shareInfo?key=Mzg4MTEyND...」這個連線;key 後面的就是影片分享地址中的 HTML 名字。觀看這個連線內容,看到 MP4 的實際地址:

於是我把 LINE-Bot 收到訊息的程式改了一下,只要是 musical.ly 的地址,便假設是影片分享,把地址的 HTML 名字解拆出來,然後加在「https://www.musical.ly/rest/v2/musicals/shareInfo?key=」後面,繼而讀取新地址內容;再把新內容的 JSON 解開,根據 videoUri 的地址進行下載。結果非常成功,以後我只要把影片地址分享到 LINE-Bot,Sita 便會自動下載影片。

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」便能啟動。