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,我決定留待週末重灌一次...。

2017年5月23日 星期二

有 SSL 就足夠?


今天收到一家我經常幫襯的旅行社的電郵,叫我安裝他們的流動應用程式。最近也光顧了,所以安裝一下說不定能方便到自己。

安裝完畢,進入程序,發現登入選項,能用網頁上的帳號。好奇之下,監察自己的個人資料有沒有好好被保護。在這個時代,應用程式跟服務器溝通用 HTTPS 是必須的。這個他們做到了。可是,碌開 SSL 之後又如何呢?我最近的一個應用程式便用上了三層加密方法,萬一 SSL 被解開,至少數據不是「純文字」方式赤裸地呈現。不過,這個應用程式沒想得周到,不知道是費用有限、技術不足、經驗不夠、還是以為 SSL 很安全,解開 SSL 後全是沒加密的內容,密碼赤裸地流動著。這可以是一個很嚴重的問題!有不同的方法蹺過 SSL,保安不是想像中的安全。所以,大家在使用應用程式時,最好有各自的密碼,而且不要跟重要的密碼使用相同的內容。

2017年5月20日 星期六

自製 Mac 版本的 OBS Datetime 插件

除了用 OBS 來進行 Facebook Live 錄影之外,我也會用它來拍下 USB 鏡頭畫面,就像閉路電視一樣,用來監察家中的情況。

用了一段時間,認為在畫面中加入時間會記錄得更好。在網上找到一個 Datetime 插件,它只有 Windows 版本;我這個 Mac 人沒有份兒,只好自行開發。看過網上的文件,要搞一大輪才做到簡單的 Datetime 插件,而且 Mac 版 OBS 真的不支援;本想放棄,但看到可以載入網頁作為訊號源,靈機一觸,要是用 Javascript 開發 Datetime 插件倒是十分容易,於是寫出了以下程式:
<!-- ----------------------------------------------------- -->
<!--  OBS Datetime Overlay                                 -->
<!-- ----------------------------------------------------- -->
<!--  Platform: Javascript + OBS                           -->
<!--  Copyright 2017 Pacess Studio.  All rights reserved.  -->
<!-- ----------------------------------------------------- -->
<html>
   <head>
      <title>OBS Datetime Overlay</title>

      <style>
         html  {
            margin: 0px;
            background-color: #000000;
         }
         body  {
            margin: 2px 0px 0px 10px;
         }

         #datetime  {
            color: #ffffff;
            font-family: "Serif", "Arial";
            font-size: 10px;
         }
      </style>
   </head>
   <body>
      <div id="datetime"></div>

      <script>
         function updateTimestamp()  {
            var currentDate = new Date(); 
            var year = currentDate.getFullYear();
            var month = currentDate.getMonth()+1;
            var day = currentDate.getDate();
            var hour = currentDate.getHours()
            var minute = currentDate.getMinutes()
            var second = currentDate.getSeconds()

            if (month < 10)  {month = "0"+month;}
            if (day < 10)  {day = "0"+day;}
            if (hour < 10)  {hour = "0"+hour;}
            if (minute < 10)  {minute = "0"+minute;}
            if (second < 10)  {second = "0"+second;}

            var datetime = year+"-"+month+"-"+day+" "+hour+":"+minute+":"+second;
            document.getElementById("datetime").innerHTML = datetime;
         }

         updateTimestamp();
         setInterval(updateTimestamp, 1000);
      </script>
   </body>
</html>

2017年5月15日 星期一

使用 MySQL CASE

正在開發的一個手機應用程式,預計會有數十萬人使用;而程式內的獎品,有可能會吸引程序員暴力衝擊。為了減輕問題的發生,除了使用三層加密外,還想到限制 IP 的執行次數。但怎樣做才好?IP 地址儲存到檔案,可能會產生大量檔案;多人在線時,寫入順序會否受到影響;儲取時的 I/O 處理又會否太慢...等等問題,都是值得測試及細心研究。最終,我選擇了用數據庫。

利用 MySQL 的 CASE 可以令事情變得簡單:
//  10 seconds before
$secondBefore = date("Y-m-d H:i:s", time()-10);

$query = "UPDATE `".$this->tableName."` SET".
         " accessCount=CASE".
         " WHEN lastModifiedAt>='".$secondBefore."' THEN accessCount+1 ELSE 1 END".
         ", lastModifiedBy=CASE".
         " WHEN lastModifiedAt>='".$secondBefore."' THEN lastModifiedBy ELSE '$createdBy' END".
         ", lastModifiedAt=CASE".
         " WHEN lastModifiedAt>='".$secondBefore."' THEN lastModifiedAt ELSE NOW() END".
         ", userAgent='$userAgent'".
         " WHERE ipAddress='$ipAddress'".
         " AND createdBy='$createdBy'";

$resultArray = $this->sqlDatabase->query($query);
$affectedRows = $this->sqlDatabase->affected_rows;

2017年5月12日 星期五

第一次拍攝產品 360 度影片


為「一口好茶」製作了 60 張海報後已經有點厭倦,得想點新點子、新嘗試。想到拍攝產品 360 度影片。選擇影片,是因為在 Facebook 上的貼文,十個有九個已經是影片類,看來影片在社交平台上較受歡迎。臨近母親節,「一口好茶」推出的「母親節限定優惠」也快將結束;如果有一條影片,說不定能增加銷售。

在公司借來了一支腳架、一支燈架、一個轉盤、兩支 LED 燈。


設定如上,利用電話座支撐 iPhone 7 Plus 及調校角度。以 4K, 30fps 拍攝。完成後在 AfterEffects 進行後期加工,加入文字,把影片速度調快便完成了下面的成品:

2017年5月7日 星期日

一口好茶:母親節限定優惠


過去的一個月,不如意事加上工作繁忙,令我完全失去研究的心情。整個月都沒有學習到甚麼新事物。特別是人工智能方面的事更需要時間學習、訓練、嘗試。

一直反對內子的生意。因為來貨要特別處理,看舖也很耗時;如不能固定時間開檔,客人摸門釘一兩次便會降低購買慾;最致命的是貨源問題根本上無法做大,收入還要兩個創辦人分,頂多只能糊口。錢掙不到多少,卻犧牲了家庭時間,枉費了本來全職培養女兒的目的;我也背負更多的揍女時間及家務時間,因而少了研發的時間;是一個四輸的事情。不過,內子想做,作為外子的只能支援。我認為照顧女兒是件很愉快的事情;看著女兒快樂成長、變得懂事,也令自身成長。女兒再大一點便會有自己的世界,到時會有很多時間做研究。

母親節將近,內子想嘗試推出優惠看看反應;於是我設計出上面的海報。一直追求簡約的我,滿意這張海報;但卻總覺得欠了甚麼,可以設計得更好。但怎麼想也想不出哪裡不足,如果你知道,請告知我一聲。謝謝~