2016年12月31日 星期六

我對 Team work 的定義

星期四那天,談了我對 Team work 的定義。我的做法是大家對等,不分你我高低;把所有選項曝露出來,然後找個大家都接受的方法,遇到問題一起面對。每個崗位都有各自的難處,只有協商才能找到出路。

而我的 Team work 是對應所有合作伙伴;不只是部門內的手足;不只是公司內的同事;連客戶 Vendor 都包含在內。我不是說我的方法很掂,但我很希望大家不是對立的局面。愛拼才會贏,但我追求的是雙贏。可能這個想法有點天真,但這個世界就是由天真及有能力的人帶領。

2016年12月30日 星期五

把 Mac OS X 當成伺服器


以前在家中建立好的 ESXi 伺服器,由於風扇太嘈,加上沒有多大效用,於是把它關上。後來加入了 QNAP TS-410 用來儲存檔案,方便家中的裝置能共享;用了一段時間,風扇也太吵,於是把它關上。到現在,想有一台電腦能抓取數據、監視家中情況、把網頁放回自己的電腦、重開得到 Apple 認可的 VPN 連線、Facebook Messenger 管家機械人...等等。於是拿了退役的 Mac mini,灌入 CentOS 作多用途伺服器。

CentOS 是裝好了,但缺了網絡卡的驅動程式,在苦無對策下只好放棄,改為用 Mac OS X Server。可是問題又來了,我的復原光碟不翼而飛,硬碟沒有復原的分割,根本無法復原。打算求助其他復原光碟,在公司又找不到,更得知原來復原光碟是跟機,未必能在我的 Mac mini 上執行;就像我拿 MacBook Air 的復原手指一樣,到安裝的一刻說「無法安裝」。幸好,在 iTunes 的「已購買項目」中能重新下載舊的 Mac OS X 版本。我選擇了 Mavericks。至於 Mac OS X Server 則沒有了。於是,我嘗試把 Mac OS X 當成伺服器來建立...。

首先是安裝網頁伺服器程式。原本 Mac OS X 已經有 Apache 裝好了,只要簡單啟動指令便可:
sudo apachectl start
需要留意的是,預設的網頁路徑是「/Library/WebServer/Documents」;我把它改為用戶的目錄下。

2016年12月29日 星期四

修復 Django 的「Error loading MySQLdb module」錯誤


另一個在 Django 上架時出現的錯誤是「Error loading MySQLdb module」。明明已經安裝好了 MySQL-Python 這個模組。原來是 WSGI 使用了 Python 2.7,而程式卻是在 Python 3.5 下執行。雖然我已把 Python 的預設版本設定為 Python 3.5,但在 Apache + WSGI 下卻是另一個設定。最主要要留意 httpd.conf 內關於 LoadModule 時 WSGI 的版本,像是預設值 mod_wsgi.so;而在我的情況卻是用 /etc/httpd/modules/mod_wsgi-py35.cpython-35m-x86_64-linux-gnu.so。

2016年12月28日 星期三

解決 Django 的「Populate isn't reentrant」問題


過去一星期在處理 Django 項目上線的工作,一直掉進錯誤的無限迴圈。處理了一個問題,又到另一個;處理了另一個,又到第二個;甚至乎回到起點。這個「Populate isn't reentrant」是其中一份子。花了半天時間,發現到問題發生的原因,是 Apache 在第一次執行 Django 項目時會載入一些程序,當要再次載入時,由於原本已經有程序在記憶體,便會出現這個錯誤。解決方法是重新啟動 Apache。

2016年12月27日 星期二

解決 Django 的「No module named settings」問題


Django 在開發上有它的優勢,但最近把開發好的項目上線時卻問題接腫而來。

有人說上面的「No module named settings」問題可以透過「sudo pip3.5 install mysql-python」來解決。但這樣做會引伸另一個「ConfigParser」問題。


主要原因是 Python 3 開始把「ConfigParser」改名為「configparser」,如果所使用的組件沒有好好支援 Python 3 的話,便會出現這個問題。我的解決方法是用「mysql-connector」取代「mysql-python」,指令是「sudp pip3.5 install mysql-connector」。

2016年12月22日 星期四

如何在 macOS 連接 ESXi 的虛擬機?


我在家中設定了一台伺服器,它運行的是 ESXi。裡面分別有 Windows XP, Windows 7 及 CentOS。要設定 ESXi 內的虛擬機,需要一個客戶端的軟件。之前遇到一個問題是,這個軟件只支援 Windows。現在找到了支持 macOS 的方法。比起 Windows 版本,雖然很不方面,但還是可以。

「VMware Remote Console」軟件支援 macOS。先下載並安裝好。在 ESXi 伺服器的頁面,有一個「Open the VMware Host Client」,點擊後會開出登入頁面。輸入帳號資料成功登入後,會在畫面左方看到 ESXi 內的虛擬機。在這個畫面可以修改虛擬機的設定。如要看虛擬機的畫面,只要點選虛擬機,在畫面右方點「Console」內的「Launch remote console」就能控掣虛擬機。

2016年12月21日 星期三

Merry X'mas


是日冬至,很多公司都會放早,而我的公司則在下午舉行聖誕聯歡會,還有抽獎環節。一共有十九份禮物。早前,人事部向同事收集禮物的意見,沒想到當中有四份是我的主意。包括:Apple Watch, iPod nano, HTC RE 相機, 宜家傢俬禮券。可惜,我一份也沒抽中。

回想過去五年的創業歷程,沒資源搞聯歡會,沒有抽獎活動,同事交換禮物還是有,但總覺得欠了甚麼。我喜歡在聖誕節對同事作出感謝。現在打工,錢比以前更不見使,沒甚麼錢可以買禮物給同事,只能物輕情義重。於是我買了一打日本版樽裝可口可樂,貪它的花球設計當成禮物,希望大家感受到我的小小心意。

2016年12月20日 星期二

自訂 Base64 碼表 PHP 程式

有些時候,為了避開中文字或符號而導致整爛資料的情況,我會用編碼方法去做。其中最常用的是自訂 Base64 碼表。同時,這個做法會感覺安全一點。我每個程式用的碼表都不同,為了省下構思碼表的時間,於是寫了以下程式:
<?php
//----------------------------------------------------------------------------------------
//  Generate Custom Base64 Mapping
//----------------------------------------------------------------------------------------
//  Platform: CentOS7 + PHP + Apache
//  Written by Pacess HO
//  Copyright 2016 Pacess Studio.  All rights reserved.
//----------------------------------------------------------------------------------------

header("Access-Control-Allow-Origin: https://home.pacess.com");
header("Access-Control-Allow-Methods: POST");

header("Content-type: text/html");
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Tue, 10 Mar 1987 00:00:00 GMT");

date_default_timezone_set("Asia/Hong_Kong");
mb_internal_encoding("UTF-8");
ini_set("memory_limit", "-1");
set_time_limit(0);

//----------------------------------------------------------------------------------------
$default = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
$mapping = str_shuffle($default);

//----------------------------------------------------------------------------------------
//  Mapping output
echo($mapping);

?>

2016年12月16日 星期五

AGM 周年會議


今日是公司的周年會議,簡稱 AGM。我是第一年參加。由於公司有點規模,有不同的部門,但各自的工作範圍也不太了解。很多同事可能認得出對方的面孔,可是名字卻不太清楚。於是透過 AGM 去加深大家的認識。負責同事選了公司附近的無敵海景會議室,感覺開揚。

老闆問我以前的工作中有否 AGM。我第一個印象是公司的管理階級大會,於是回答了「有」。但細心一想,Gameone 當時沒有這樣的思想,沒有類似的大會;Lakoo 則會租用日營,管理人員出席腦振盪會議;U1 則曾到中山及台灣,同樣是管理人員出席的會議。沒有一家是全體員工出席。主要原因是三家遊戲公司的規模細,部門少,同事已經互相認識。我也在想,他日創業成功時,是否也應該有 AGM?而我目前的答案是「否」。我會選擇公司 Team Building 旅行。不過,相信再創業也不會有太多員工,空想一下而已。

2016年12月11日 星期日

互動 Facebook Live 留言


再次製作新的互動 Facebook Live 示範程式,已經是第四個。今次是播放 .mp4 影片,並在影片上添加飄雪效果。Facebook 反應一如以往地實時顯示在影片內;而在影片間會顯示即時的留言訊息,可以給用戶傳達愛意。

2016年12月10日 星期六

利用 Bash 程式下載 Packt 免費電子書及以 LINE 作為通知


八月時寫的「利用 Bash 程式下載 Packt 免費電子書」一直在公司都運作暢順;本來每天在下載後會自動上傳到 GitLab 及發送電郵通知給我;可是早幾天開始沒有收到電郵。除了因為公司的網絡不穩導致下載失敗外,原來 Google 把發送通知的電郵封鎖了。於是我改用 LINE 通知,把程式稍為修改一下:
#!/bin/bash

##----------------------------------------------------------------------------------------
##  Packt Free eBook Downloader
##----------------------------------------------------------------------------------------
##  Platform: CentOS7 + bash
##  Written by Pacess
##  Copyright 2016 Pacess Studio.  All rights reserved.
##----------------------------------------------------------------------------------------

##----------------------------------------------------------------------------------------
##  Update History:
##----------------------------------------------------------------------------------------
##  2016.08.25  Version 1.00
##  - Added auto commit to GitLab
##
##  2016.12.10  Version 1.10
##  - Removed download
##  - Removed auto commit to GitLab
##  - Removed email alert due to blocked by Google
##  - Added LINE alert
##----------------------------------------------------------------------------------------

##  Variables
userID="your@email.com"
password="password"

timeOut=5
noOfRetry=3
sleepTimeBetweenRequest=1

userAgent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36" 
downloadDirectory="/var/www/"
log="packt_free_ebook.log"
cookie="cookie.txt"

##  LINE-Bot related
lineUser="Uee8ff21b9d850419330cb5446fe66c9a"

##----------------------------------------------------------------------------------------
function PHLog  {
   echo "$1"
   echo "$(date '+%Y-%m-%d %H:%M:%S') $1" >> "$log"
}

##----------------------------------------------------------------------------------------
##  Program start
echo "$(date '+%Y-%m-%d %H:%M:%S')"
echo "-----------------------------------------------------------"
echo "--  Packt Free eBook Downloader Version 1.10             --"
echo "--  Written by Pacess                                    --"
echo "--  Copyright 2016 Pacess Studio.  All rights reserved.  --"
echo "-----------------------------------------------------------"
echo ""

##  Move to app directory first
cd /var/www/

##  Remove previous temp file
rm -f $cookie packt*.html

##----------------------------------------------------------------------------------------
##  Website login
PHLog "Logging in $userID..."
curl -s --retry $noOfRetry -m $timeOut -A "$userAgent" -b "$cookie" -c "$cookie" -d "email=$userID" -d "password=$password" -d "op=Login" -d "form_build_id=form-73ba86bbfb2a50719049129632c84810" -d "form_token=2f1d586bf7df196b77d0761709d03199" -d "form_id=packt_user_login_form" https://www.packtpub.com
errorCode=$?;  test "$errorCode" -ne "0" && { PHLog "curl exit error code: $errorCode";  exit; }

curl -s --retry $noOfRetry -m $timeOut -A "$userAgent" -b "$cookie" -c "$cookie" https://www.packtpub.com/packt/offers/free-learning > packt_daily.html
errorCode=$?;  test "$errorCode" -ne "0" && { PHLog "curl exit error code: $errorCode";  exit; }

##----------------------------------------------------------------------------------------
##  Extract claim URL
claim=$(grep -oE "freelearning-claim/[0-9]+/[0-9]+" packt_daily.html)
PHLog "Claim URL: $claim"

##  Extract book title, trim and remove invalid characters
title=$(grep "dotd-title" -A 2 packt_daily.html | tail -1 | sed 's/^[^0-9A-Za-z]*//;s/[\t ]*<\/h2>$//')
title="$(echo -e "${title}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e 's/[^A-Za-z0-9 ._-]//g')"
PHLog "eBook Found: $title"

##  Extract book ID
bookID=$(echo $claim | sed "s/.*\/\([0-9]*\)\/.*/\1/")
echo "";

##  Claim ebook now
curl -s --retry $noOfRetry -m $timeOut -A "$userAgent" -b "$cookie" -c "$cookie" -H 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' -H 'Accept-Encoding: gzip, deflate' -H 'Accept-Language: en-US,en;q=0.5' -H 'Connection: keep-alive' -H 'Host: www.packtpub.com' -H 'Referer: https://www.packtpub.com/packt/offers/free-learning' "https://www.packtpub.com/$claim"
errorCode=$?;  test "$errorCode" -ne "0" && { PHLog "curl exit error code: $errorCode";  exit; }

##----------------------------------------------------------------------------------------
##  Send LINE alert
PHLog "Sending LINE alert..."
curl -X POST -H 'Content-Type:application/json' -H 'Authorization: Bearer s8zJezZGperi5WKRaTaQViB3jXNAgJxkDu+JxlEOfUt2jkRg/EILEZhm2oH1famWe3/kiQu95DlOIQ0zF4sr9vaycPSik63B9UW5gsBCccANZ/eg4DztSr2/7sZVgL/tfskAH2Ni+kwdB04t89O/w15fpcyilFU=' \
-d '{"to":"'"$lineUser"'",
    "messages":[
        {
            "type":"text",
            "text":"A Packt ebook ['"$title"'] have been redeemed to '"$userID"'.  Thanks!"
        }
    ]}' https://api.line.me/v2/bot/message/push

##----------------------------------------------------------------------------------------
PHLog ""

2016年12月4日 星期日

有生意係咪真係唔做?

過去兩個月,有些事情一直卡在心內。其中一樣是:究竟有生意係咪真係唔做?

站過老闆的崗位,可以說,只要計過有錢賺,又不是傷天害理的工作,只要信心過半,我是一定會做。唔理是不是公司的方向、唔理是 Product 或是 Project。還是會接了後再解決。有時甚至為了客戶關係、未來利益、面子工程,蝕本也要做,輸少有時真係當贏。曾經,我也很理直氣壯地認為,不是公司方向的不接、賺果雞碎的不接、客人麻煩的不接。既然選擇 Product 的道路,應該要破斧沉舟,專注一點。當時我沒有出錢,只出力,話說得特別輕鬆,特別容易。問題是,甚麼都不接,人工開支從哪裡來?除非是有更好的機會,或是千幾萬未開頭,錢可以慢慢地燒。否則,還是要乖乖認命。我被合作的拍檔薰陶了。是我向現實低頭嗎?是我成熟了嗎?我找不到答案...

2016年12月3日 星期六

Facebook Live 遊戲(二)


繼上星期開發的 Facebook Live 遊戲 後,今日再編寫多一個以「抽獎」為題的互動 Facebook Live 遊戲。加入其餘兩個負面的反應,不過所有反應都只有相同動作,就是轉動輪盤。效果不錯,很期待有商戶使用。

2016年12月2日 星期五

Pacess Studio 臉書專頁


幾個月前在 Facebook 建立了一個專頁。專頁以我第一次正式掛牌賣 apps 的公司名稱命名,叫「Pacess Studio」。它是我用過的公司名稱中感覺最好的一個。最近才開始貼文,也邀請了部份朋友關注,得整理得成熟一點。我需要一個正式見得人的商標。過去兩星期學習了一點 Illustrator 的畫法,因此用它製作出 Pacess Studio 的商標。以往我用 Photoshop 來達成,但商標圖案還是用 Illustrator 畫的才夠銳利。

原本圖案如下。後來想給人一點關於「Digital」數碼的感覺,所以才加了線路板的線紋。我很滿意現在的版本,看上去帶點日式味道;而且設計可愛,帶點瑪利奧的感覺,更有點像機械人,非常配合我的範疇。


但看了又看,太多黑白位置,於是把花盤變成紅色。也不錯。夠搶眼,我喜歡: