2014年11月28日 星期五

藍牙輔助通訊


為客人開發的流動應用程式中,因為不知道使用時 WiFi/3G 的接收力為何,於是加入了新構思的「藍牙輔助通訊」設計。

我設計的應用程式中,所有上傳或下載的工作都會有一條專屬隊伍負責。為的是當使用時沒有連線能力時,也能保存數據及繼續使用。當上網能力恢復後,積存在隊伍的工作便會依順序處理。雖然這個設計運作良好,但遇上需要多機同步的時候,便會出現時間延遲現象。自從 iOS 7 加入了 Multipeer Connectivity Framework 之後,方便了在離線環境下透過藍牙來作為潮通的渠道。今次設計是受到《FireChat》的啟發。當斷線時,數據除了會排入通訊隊伍外,還同時發送到在場附近的裝置,使得大家的數據同步一致。萬一其中一台裝置能成功連線,所有積存數據都會立即上傳到服務器;同時從服務器下載回來的資料,亦會發送到在場其他裝置。

今天是客人在全國各地,包括香港舉行 VIP 活動的日子,經過一朝早的監察,運作十分暢順。日後有相類似的應用程式時,也可以繼續使用這個設計。

插圖在 Lucidchart 製作

2014年11月23日 星期日

流動應用程式・第一課


一連兩天到澳門教授《流動應用程式》的開發課程。這是我第一次成為老師角色。今次體驗了「教學相長」的感受,當教導別人時,更能考驗自己,檢視到不熟悉的地方。看到同學們努力學習,更使我傳授更多技術知識。同學們真的很聰明,希望他們能努力學習,應用在機械人操作上。

2014年11月21日 星期五

在 MacBook Air 上安裝 Windows 7

早前在 MacBook Air 上安裝 Windows 7,主要是為了利用 Inventor 來繪畫精準的模型。雖然 Inventor Fusion 有 Mac 版本,但界面及操作都變差了,還是用 Windows 版得心應手。可惜數星期前 Inventor 壞了而無法啟動;重新安裝也沒有改善,唯有將整個 Windows 7 重灌。搞了一個星期也弄不到 USB 版的 Windows 7。後悔當初沒有好好記錄步驟。所以今次要來過記錄。

製作 USB 開機手指
1. 找一台裝有 Windows 7 的電腦
2. 準備好 Windows 7 的 ISO 影像檔
3. 下載 Windows USB/DVD Download Tool
4. 啟動 Windows USB/DVD Download Tool
5. 點選 Windows 7 的 ISO 影像檔
6. 選擇 USB 手指
7. 按「Begin Copy」
8. 等待完成

安裝 rEFIt
1. 下載 rEFIt
2. 雙擊 rEFIt-0.14.dmg
3. 執行 rEFIt
4. 按照指示進行安裝
5. 重啟電腦

安裝 Windows 7
1. 插入帶有 Windows 7 的 USB 手指
2. 重啟電腦
3. 開機後會見到 rEFIt 的選單
4. 點選 Windows 圖示後會從 USB 啟動 Windows 設定程式
5. 跟平常安裝 Windows 進行安裝
6. 如發現「Missing Operating System」則把 USB 插到其他 USB 口再重啟電腦
7. 如發現 Partition 無法進行安裝,可嘗試格式化一次
8. 完成

2014年11月18日 星期二

SMS 推送


接了一個需要推送 SMS 的項目,同事找了一間便宜的。第一次推送完畢,發現推送到國內的 SMS 有一半是失敗了,而且我們還要為失敗的 SMS 付費。於是我們改用另一家聲稱為 Apple iReserve 做推送的公司。她的收費較貴,但有 Apple 作為客戶,信心增加了。為安全起見,還是嘗試發送四個號碼,結果是有四份三成功。比之前那一家有更高成功率,因此轉用新的 SMS 服務商。不幸的是,當我們正式推送時,失敗率卻提升到 40%。

我們一直認為推送 SMS 是簡單的事,中間的通路做好了,概念上是一直能用下去。向服務商了解過後,原來失敗的原因有很多。漫遊有可能導致失敗、關機有可能導致失敗、飛線有可能導致失敗、使用聯通有可能導致失敗、八小時內多次推送有可能導致失敗、短訊內容使用 IP 地址有可能導致失敗、短訊內容有敏感字眼有可能導致失敗、同一個短率推送多次有可能導致失敗、電話號碼錯誤有可能導致失敗...。原來在國內做推送會遇到很多問題,今次學到很多知識和經驗。

2014年11月17日 星期一

把 Raspberry Pi 顯示旋轉 90 度


Raspberry Pi 重灌後,又要側頭看我那垂直的顯示器。同樣地,又是忘了如何設置...。


在 /boot/config.txt 可以優先設置 Raspberry Pi。這個檔案內的設定都會在啟動時先行載入後才正式啟動。當中把 display_rotate 選項改為 3 便會把顯示內容旋轉 270 度。與其說是旋轉是有點不對,因為 Raspberry Pi 會按旋轉後的闊高作為畫面,所以我的畫面才會變成直身。

2014年11月16日 星期日

燒錄 OctoPrint 到 SD 卡


無論怎樣試,都無法把「ArrayZ」及「OctoPrint」成功連接。正確來說,連接是成功了,但卻控制不了、打印不了、溝通不了。我在想,會不會是 OctoPrint 的版本舊了?於是乎重新下載、重新安裝。可能是年紀大了,不記得上次是怎樣安裝,唯有重新搜尋。為免重蹈覆徹,還是在部落格記錄一下。

在 Mac 機上使用「ApplePi-Baker」。左手面點選連接好的 SD 卡;右手面選好要燒錄的 Linux 影像檔,點「Restore Backup」,等待完成。把 SD 卡接上 Raspberry Pi 後開機,會彈出啟動選單。最主要是把空間擴展到整張 SD 卡。其他的都按需要設定就可以。

2014年11月12日 星期三

利用 mitmproxy 進行即時修改

Modify Response on the Fly by using mitmproxy

「mitmproxy」的功能基本上跟「Charles Proxy」是一樣。前者沒有圖像介面,支持 Python 指令;後者則簡單易用。我簡單編寫了一個 Python 程序來示範如何利用 mitmproxy 進行即時修改。把上圖的代碼儲存為 apple.py 後,在終端上輸入指令:mitmproxy --host -s apple.py 開始進行即時修改。


如上圖所示,只要遇上是 apple.com 的 HTTP 請求,便會把內容「Bigger」變成「Smaller」,及把「iPhone 6」變成「iPhone 7」。

2014年11月11日 星期二

在 CentOS 下安裝 mitmproxy...

「Charles Proxy」是一套很好用的 MITM 工具,但它是收費的。雖然是很值得,但總想試試其他免費的方案。「mitmproxy」就是其中一個。

試過幾次失敗後,最終都能成功安裝在 CentOS 6。問題是出在 Python 2.6 及 Python 3.4。原來「mitmproxy」在 Python 2.7 才能順利安裝。要是使用 CentOS 7 的話,隨機附送的就是 Python 2.7。安裝「mitmproxy」的步驟如下:

1. 下載 Python 的 PIP 工具
    wget https://bootstrap.pypa.io/get-pip.py

2. 安裝 Python 2.7 的 PIP
    python get-pip.py

3. 下載 Python 的 EZ Setup
    wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py

4. 安裝 Python 2.7 的 EZ Setup
    python ez_setup.py

5. 安裝需要的封包
    yum -y install python-pyasn1 python-flask python-urwid readline-devel gdbm-devel bzip2-devel ncurses-devel sqlite-devel tk-devel gcc python-setuptools python-pip python27-pip newt-python python-devel python27-devel python-pyasn1 pyOpenSSL gcc libxml2-devel libxslt-devel libffi-devel openssl-devel

6. 安裝 pyOpenSSL 0.14
    easy_install http://pypi.python.org/packages/source/p/pyOpenSSL/pyOpenSSL-0.12.tar.gz

7. 啟動 IP 地址及接口轉發
    sysctl -w net.ipv4.ip_forward=1
    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 8080

8. 生成自簽的 CA 證書給 SSL 監聽之用
    openssl genrsa -out ca.key 2048
    openssl req -new -x509 -key ca.key -out ca.crt

    ... No need to fill out optional fields ...
    Common Name (eg, YOUR name) []:*.google.com (domain you want to MITM here)
    ...

    cat ca.key ca.crt < ca.pem

9. 執行 mitmproxy
    mitmproxy --cert=ca.pem -T --host

2014年11月10日 星期一

ArrayZ: 挑戰 OctoPrint


在購買 ArrayZ 之前已經試過用 OctoPrint 遙距操作。十分好玩。現在有了 ArrayZ,也想設定 OctoPrint。一來可以在公司也能控制家中的 ArrayZ,隨時打印;二來所有模型檔案能直接無線上傳,不用再煩複地又插又駁 SD 卡及把 .gcode 抄進去,十分方便。

OctoPrint 是安裝在 Raspberry Pi 中;嘗試過用 USB 線運接 ArrayZ 及 Raspberry Pi,並為 Raspberry Pi 接上網線。這樣做的好處是開啟 ArrayZ 時 Raspberry Pi 也會同時亮起。後來發現 Raspberry Pi 會無法正常運作,還是要獨立外接電源。其實 ArrayZ 用的是電腦火牛,帶多條 12V 輸出,只要加裝 12V 轉 5V 的變換器,也能達到相同效果。

參考過 https://www.octobox.org/setup/ 知道連接埠是 /dev/ttyACM0,速度是 115200 bps。按連接後狀態成功轉換成「Operational」。上傳 gcode 也十分快速方便。可是溫度監測沒有數據傳回。而 XYZ 軸則只有 Z 軸能接受指令。至於打印方面也沒有反應,未知是哪個部份出現問題,有待找出成因。

2014年11月9日 星期日

ArrayZ: 解決塞頭問題


昨天跟朋友外出吃晚飯,離家前開始打印一年要花三小時的模型。回家後發現 ArrayZ 在空轉,沒有物料被擠出,因為耗材線打結了。

把耗材線理順後再次打印,物料還是沒有被擠出,原來負責推送耗材的馬達早已把耗材線磨成兩段,只好拆下馬達把打印頭那段清除,並把耗材線重新注入。可是,物料還是沒有被擠出。從注入耗材線的深度來看,卡著的地方剛剛是打印頭上方的柱狀位置。

打印頭似乎被物料塞住了。我把溫度調高至 190 度後手動插入耗材,希望能打開堵室了的通道。還是不行。這時想起 Chris 說過為免耗材向上溶解,特意在打印頭的散熱區加裝兩把風扇來加速降溫。我想這是導致打不通的原因。然而,在主選單中找到了設定風扇轉速的設定。把數值由 200 改到 0,風扇真的不轉了。再次把溫度調高至 190 度,手動插入耗材。今次成功了,終於把堵室了的打印頭打通了。

2014年11月8日 星期六

ArrayZ: 消除波紋效果

ArrayZ: Waviness Elimination

我的 ArrayZ 之前因 X 及 Y 軸卡住問題無法自行解決,於是找了它的父親 Chris 幫忙。昨天修理完成後第一時間取回家中,安頓好後嘗試再次打印。效果良好。


頂圖左面是之前的打印,右面是今次的打印。今次同時改善了之前打印時出現的波紋效果(左面)。那是由於軸底承托部件產生的副作用,把它拿走不會影響打印工程,又能消除波紋效果,所以順便把部件拆下來。

2014年11月7日 星期五

創富媒體 12:密食當三番


文章刊登於「創富媒體

跟一個認識的人閒聊。說是認識,是因為她是朋友的朋友。我們未曾見面,但通過數次電話,了解比認識的層次高一點。她是做網頁製作生意,教了我一點心得。

她一直都很忙,朝九晚十二。經常有數個網頁項目在做,數個在傾。她正在為一個項目的死線,尋求支援。十四年前科網炒作熱熾,能寫點 HTML 碼便能賺到可觀的金錢。科網爆破後,加上越來越多人懂得製作網頁,價錢已經跌到四位數字。我認識的世界中,只有講求創意、講求設計、講求體驗,甚至是整個活動配套一起包辦的項目,才能達到六位數字的價錢。原本以為網頁開發生意沒有得做,她卻能以「密食當三番」一招勝出。每個項目三至五萬,兩個月內起貨,同時做兩個項目。搞的都是帶點簡單程式的網頁;前台盡量簡化,後台管理介面盡量繼承以往項目的元件,減少開發時間,增加利潤空間。對我來說,這些是沒有挑戰性的工作,但多勞卻是多得。還有其他副作用。價錢較低,客動較容易下決定;由報價到落手落腳開工的時間亦比大項目來得短;開發完成後的意見修改也較為少。

曾上過朋友開辦的「搵銀」課程,當中有一句說話特別深刻「簡單的事重複做」,十分認同。我曾嘗試把這個理念應用到手機程式生意。四年前編寫了一個以地方風景為主題的「找錯處」手機遊戲。同一個程式,換了不同風景,成為獨立一個遊戲。最後推出了以香港、日本關西、歐洲、全球,共三個版本。當時花了一個月時間開發遊戲。三個遊戲帶來的收入不算好但是不錯,似乎驗證了以上說法。可惜好景不常。當時研究出「付費>免費>付費」戰術也居功不少。收到外國律師信稱遊戲名稱太接近她們註冊的「Photo Hunt」而被迫下架。雖然把遊戲改名「TravelHunt」後重新上架,但累積了的排名算法經驗值卻一舖清袋。

「簡單的事重複做」在現任公司也曾經推動過,但客戶委托開發的手機程式都很不同,能繼承的主要都是後台為主,省下的時間不多;而自行開發的應用又不想千篇一律,能繼承的更少。說穿了其實「自 High」居多,所以也做不出甚麼成積。不過,目前還沒有這個打算;假若碰到機遇,還是想再次實踐。

2014年11月4日 星期二

創富媒體 11:機械人兵團


文章刊登於「創富媒體

香港正值多事之秋,很多年青人正在為香港的未來而抗爭。社會的動盪令我想到戰爭。戰爭的觸發是在雙方勢均力敵時,或者是一方有著顯著的進步並為另一方帶來壓力時出現。

近年四翼機大為流行,而價錢亦一直打滑。現時淘寶一架帶定位系統的四翼機大概為 HK$4000 左右;十架即是 HK$40,000;百架才是 HK$400,000。四十萬是一個不少的數目,足夠在日本買層樓做業主;但花得起的人也很多。要是有一百架四翼機到一地點作出攻擊,一定有點成效。就算沒有武器,單憑飛行速度及高度,以十幾公里十幾層樓的高度下墜,很難不造成人命傷亡。若配備武器更加不堪設想。

機械人技術也越來越受到學生歡迎。兩年前,網上大學 Coursera 只有創辦人 Andrew Ng 一個教授關於人工智能的課程,現在卻有八個相關的課程,相信日後會越來越多。意味著機械人技術越來越普及。若遇上有資金在手的金主,兩者合作便能開發出小型軍隊。雖則要比人類優勝還有很長的路要行。但比起人類軍隊,精準度高及費用低卻是它的賣點;而且還能無限複製,以量取勝。然而,中國軍方已經想到這一情況,並開發出以雷射激光為主的反無人機技術。聲稱以 30 架無人機作測試,能 100% 擊落半徑兩公里內的低空無人機。每架最多鎖定五秒便能被擊落,看來是很精準的反無人機系統。似乎,第一次機械人大戰快將發生。