2017年1月28日 星期六

爆丈海報


習慣早起,大年初一醒來想到內子的「一口好茶」應該要做一張新年海報,於是想了一想,便開始製作。

「一口好茶」部份產品是試管形狀,跟爆丈的外型相似;我捉住了這個概念去構圖。而杞子紅紅的,看起來也像火屑,於是就用它來代替燃點時的效果。本來想拿一條繩做引,可惜家中沒有合適的,唯有真空。成品有葯引的話應該更好,現在看起來還算可以吧。

2017年1月24日 星期二

一台伺服器、兩個 Django 項目

最近開發的 Django 項目是利用 Apache + mod_wsgi 來連接。它的設定像是:
<Virtualhost *:443>
   ServerAdmin server@pacess.com
   ServerName sita.pacess.com:443
   DocumentRoot /home/www/sita.pacess.com

   SSLEngine on
   SSLProtocol all -SSLv2 -SSLv3
   SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
   SSLCertificateKeyFile /home/www/sita.pacess.com/ssl/domain.key
   SSLCertificateFile /home/www/sita.pacess.com/ssl/2017a/domain.crt
   SSLCertificateChainFile /home/www/sita.pacess.com/ssl/2017a/intermediate.pem
   SSLHonorCipherOrder on

   WSGIDaemonProcess sita python-path=/usr/lib/python3.5/site-packages
   WSGIProcessGroup sita
   WSGIScriptAlias / /home/www/sita.pacess.com/sita/wsgi.py

   Alias /django-static/ /home/www/sita.pacess.com/sita/static/
   <Directory /home/www/sita.pacess.com/sita/static>
      AllowOverride All
      Order Allow,Deny
      Allow from All
   </Directory>

   <Directory /home/www/sita.pacess.com/sita>
      <Files wsgi.py>
         Order Allow,Deny
         Allow from All
      </Files>
   </Directory>
</VirtualHost>

Django 需要一個 Process 名去綁定一個目錄。所以,要在同一台伺服器運行兩個 Django 項目,就要在 Apache 設定檔中加多一個 Process 名,如:
   WSGIDaemonProcess pacess python-path=/usr/lib/python3.5/site-packages
   WSGIProcessGroup pacess
   WSGIScriptAlias /pacess/ /home/www/sita.pacess.com/pacess/wsgi.py

2017年1月21日 星期六

學習使用燈光

內子剛開始營運她的生意,我在背後作技術性的支援。替她的產品拍影片、執相、設計、排版。除了編程之外,創意及美術也是我的強項。對於沒有燈光知識的我,認為加上燈光的幫助可以拍得更好,也能提升作為 Full Stack Developer 的能力。幸好,我有朋友是燈光方面的專家,可以向他們學習。


這件不是《一口好茶》的產品,而是一件用櫻花茶製作的成品。內子想客人知道花茶除了能以茶的方式出現外,還能製作成甜品。她用燈泡盛載著櫻花啫喱,我用它來進行打燈拍攝。分別試過兩組燈光。一組是西南黃燈,東北白燈加反光板;另一組是西北黃燈,北白燈,再在東南。加上不同的快門及曝光,相片出來有光明與黑暗兩個感覺。


利用這點,我設計了左上及右上兩款海報,然後在 Facebook 做了 A/B 測試。所有人都選左上那張。當然也有一些意見,也有一些新靈感。我歸納後設計出左下及右下兩款。個人喜歡右上的感覺,不過對於一件食品來說,暗黑風格不是太好,還是明亮的有信心。最終選了右下版本正式使用。

2017年1月20日 星期五

初嘗百度大腦


百度大腦剛對外開放。跟 Microsoft Machine Learning Studio 一樣,提供免費的接口呼叫額度;而這個額度足夠開發的需要。因此,我也立即申請了一個帳號。

簡單地建立了應用程式,得到 App ID, App Key 及 App Secret。這些都會呼叫百度大腦接口所需的資料。
<?php
//----------------------------------------------------------------------------------------
//  Baidu Machine Learning API Test Program
//----------------------------------------------------------------------------------------
//  Platform: CentOS 7
//  Language: PHP 5
//  Copyright 2017 Pacess Studio.  All rights reserved.
//----------------------------------------------------------------------------------------

require_once "../nlp.php";

//----------------------------------------------------------------------------------------
const APP_ID = "123456";
const API_KEY = "abcdefghijklmnopqrstuvwxyz";
const SECRET_KEY = "abcdefghijklmnopqrstuvwxyz";

//----------------------------------------------------------------------------------------
//  Init NLP
$nlp = new nlp(APP_ID, API_KEY, SECRET_KEY);

//  Testing 分詞
$resultArray = $nlp->wordseg("你好陳僖儀");
echo("Word Segment: ".json_encode($resultArray)."\n\n");

//  Testing 詞性標注
$resultArray = $nlp->wordpos("你好陳僖儀");
echo("Word Pos: ".json_encode($resultArray)."\n\n");

//  Testing 詞向量
$resultArray = $nlp->wordembedding("你好陳僖儀", "");
echo("Word Embedding: ".json_encode($resultArray)."\n\n");

//  Testing 短文相似度
$resultArray = $nlp->simnet("你好陳僖儀", "你好世界");
echo("Similarity: ".json_encode($resultArray)."\n\n");

//  Testing 中文 DNN
$resultArray = $nlp->dnnlm("陳僖儀是個非常出色的歌手");
echo("DNN: ".json_encode($resultArray)."\n\n");

//  Testing 情感分析
$resultArray = $nlp->commentTag("陳僖儀唱的歌很好聽,是一個很有愛心的人");
echo("Comment Tag: ".json_encode($resultArray)."\n\n");

?>
以下是測試結果:
測試結果不是太好。不清楚是否繁體中文的緣故。六個測試中,只有「詞向量」做得不錯,能從「你好陳僖儀」分出「你好」及「陳僖儀」。而中文 DNN 算是可以,能從「陳僖儀是個非常出色的歌手」分出「陳, 僖, 儀, 是, 個, 非常, 出色, 的, 歌手」。

2017年1月19日 星期四

Sita 學會了煮餸?


我的私人機械人助理 Sita 除了每天替我下載電腦書籍外,今日加入了新技能。她能根據我的指示,給予我最多三份相關的食譜。看起來雖然很利害,但其實很初級。我只是用了「關鍵字」搜索去達成。

首先,我當然要搜集到食譜及相片,並輸入資料庫。程式根據我輸入的文字中,找出指定的關鍵字後,再以關鍵字相應的文字在資料庫中進行查詢,把最多三個結果,以 Facebook Messenger 的卡片方式呈現。用這個方案是因為簡單,而且也能避免有大量錯誤的結果。例如關鍵字「雞」會很容易搜尋到「雞汁」或「雞粉」。以上兩種調味料都會在很多菜式中出現,包括沒有「雞」的餸菜。所以,我才用雙重關鍵字方式去避免。

最近接觸到 Microsoft 關於機械學習方面的 API,相信有部份能加進 Sita 內,能改進關鍵字搜尋法,提升她的理解能力。

2017年1月18日 星期三

尋找合適的 QR Code 尺寸


我要將 QR Code 打印在很細小的空間,技術上是沒有問題。當用 iPhone 掃瞄時,很快便能掃到碼中的內容;而用 Android 手機時,則視乎牌子及型號而定;有些掃瞄了很久才掃得出內容,一般來就都比 iPhone 慢很多。有見及此,我要盡量把 QR Code 的內容縮到最小,打印的面積放到最大;亦即是就每個黑白點能放得最大,方便掃瞄。

於是我得測量一段內容到甚麼長度時會令 QR Code 的體積變大一個碼。在電腦世界中,嘗試二的次方是明智之舉。由於內容有一定長度,所以用最短能容納的空間開始。我用了 32 字符及 33 字符進行測試,發現 32 字符(左面)時是一個尺寸、33 字符(右面)是另一個尺寸。意味著我要把內容保留在 32 字符之內。有了這個基數,便能繼續設計之後的步驟。

2017年1月17日 星期二

在 Python 讀取 Yahoo Finance 數據


早前寫的股票數據導入機械人每天都為我索取香港藍籌股份的數據。原來在 Python 下要讀取 Yahoo Finance 數據真的易如反掌。只要利用 PIP 安裝 yahoo_finance 包:
pip install yahoo_finance
便能在 Python 內輕易得到收市價及 EMA 等值。除了美股數據外,港股數據也能用相同方法得到。十分方便。

2017年1月14日 星期六

FastText 可以解讀傳統中文嗎?

FastText 是由 Facebook Research 研發的文字分類程式。顧名思義,會有很快速的效能。我試過 IBM Watson, Google Cloud API, Facebook FastText 三個當中,最快的是 FastText,真的很快。初試時隨手拿英文的數據來測試,沒有試過傳統中文,今次就試一試。

首先要自行準備中文數據。每行第一個字是「標韱」,後面跟著「文字」:


再把數據轉變為 FastText 的格式。主要是為「標韱」文字加入「__label__」字頭;而「標韱」與「文字」間以空白符號隔開:


準備好數據,便是訓練步驟。以 skipgram 訓練「單詞特徵」:

可惜出現「std::bad_alloc」錯誤,我找不到解決辦法。

於是試一試「Supervised」文字分類訓練:
今次訓練得非常之快,看似成功;但理應在訓練完成後會產生 .bin 及 .vec 檔,卻只有 .bin 存在,不見 .vec。拿訓練成功的模型測試一下,結果 P 值及 R 值都沒有數字,訓練失敗了...。

2017年1月13日 星期五

解決 FastText 組譯問題


正在研究一個查詢機械人項目,很想加入意語理解的能力。早前認識了 Facebook 的 FastText 項目都沒有時間測試,今次是一個好機會。把 FastText 下載到伺服器進行組譯時出了問題。經過一輪發掘,知道問題是由於 GCC 版本不夠新的緣故。於是按照以下步聚把 CentOS 6.8 的 GCC 升級:
sudo rpm --import http://ftp.scientificlinux.org/linux/scientific/5x/x86_64/RPM-GPG-KEYs/RPM-GPG-KEY-cern
wget -O /etc/yum.repos.d/slc6-devtoolset.repo http://linuxsoft.cern.ch/cern/devtoolset/slc6-devtoolset.repo
sudo yum install devtoolset-2
scl enable devtoolset-2 bash
gcc --version


再次組譯,問題沒有再發生了。

2017年1月11日 星期三

解決 MySQL 表格預設值的問題


今日遇到了 MySQL 的問題。在把一個項目連資料庫從 A 網頁寄存供應商的伺服器,拷到 B 網頁寄存供應商的伺服器後,項目無法順利執行。查過連接的設定沒有問題,唯有在代碼中加入除錯的程式。發現原來是表格結構出現問題。當中一些 Not Null 的欄目在舊伺服器沒問題,來到新伺服器就不行,需要一一加入預設值。

問題是表格及欄目眾多,工序很花時間,得找一個簡單快捷的方法。原來在 MySQL 設定檔 my.cnf 中有一行 sql_mode。如果當中包含 STRICT_TRANS_TABLES 便需要指定預設值;只要把它移除,重啟 mysqld 就能變成不需要預設值。

2017年1月9日 星期一

確認電郵的錯誤


很久沒有看樂壇頒獎禮,已經過了這個年紀好一陣子了。今年難得有全程直播,於是打開電視。這是我最期待的頒獎禮。不過,以經較我作為歌迷時代的那個沉悶很多,歌曲也不合口味。但我始終都喜歡創作歌手。比起光環,我更喜歡憑自己努力獲得認同的歌手。聽過「你是你本身的傳奇」覺得不錯,於是購買了這首歌。

今天收到 iTunes 購買的確認電郵,發現出了一個錯誤。SFDiskplayableKind.song.one 應該是一個鍵值,現在沒有出現值,卻出現鍵。不知道為何 Apple 沒有知道。

2017年1月6日 星期五

掃瞄網頁漏洞


今日找到一個可以掃瞄網站漏洞的網頁。拿了其中一個自家製項目來測試。不需要任何證明,便能開始測試。到結果出爐後,才需要證明自己有網頁的控制權。當然,證明後才能得到測試報告。本來以為很安全的網頁,也被找出六個問題。雖然是小問題,還是得安排時間處理及修正。

2017年1月4日 星期三

解決「ERR_SSL_OBSOLETE_CIPHER」問題

為 Mac mini + Mac OS X Mavericks 建立的網頁伺服器加入免費的 SSL 證書後,出現以下畫面:


單看「ERR_SSL_OBSOLETE_CIPHER」意味著是 SSL 方面關於加密的問題。看看 httpd-ssl.conf 內的設定沒問題,加密算法的設定又是 gethttpsforfree 那邊給出的,應該沒問題吧!

後來把 SSLCipherSuite 的值修改,重啟 Apache 就沒事了。
SSLCipherSuite ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5

2017年1月3日 星期二

在 macOS Mavericks 安裝 MySQL

PHP 本身在 macOS 上已經安裝好,繼 Apache 後,下一個便是最常用到的 MySQL。按照 Installing MySQL on OS X Using Native Packages 的指示下載並安裝好 MySQL;


打開系統設定會看到多了 MySQL 圖示:
點擊它並啟動 MySQL 服務。在 Terminal 輸入:
export PATH=/usr/local/mysql/bin:$PATH
mysql_secure_installation

進行設定工作。之後便能正式使用。

參考網頁:
https://jason.pureconcepts.net/2015/10/install-apache-php-mysql-mac-os-x-el-capitan/