2015年6月27日星期六

狗糧開發記:硬件篇(下)

手機要求
過去編寫 T9 的一年中,我分三次一共買了三款流動裝置:
  • 要測試單人模式,借別人的手機是不行的,因為除蟲並非一次過,必須一機傍身。
  • 測試雙人對戰,需要多一部手機。
  • 最後,為測試有多人對戰時,有玩家離開的情形,需要第三件流動裝置。我本來是想和祖母對玩,因此想買一部平板電腦給她用。
我並非智能手機用家。要測試 T9,用平價手機就夠,不過考慮到將來,我定下以下要求:
  1. 說不定將來會改用智能電話,所以其中一部必須是新的 4G 手機。至於另一部,舊機就可以了。
  2. 舊機最大問題是電池老化,故此我要可換電池的型號。平板電腦好像都不能換電(或電池不容易買),因此要新機。
  3. 有無 Wi-Fi direct, Wi-Fi hotspot 與 Bluetooth LE 並不重要,但必須支援傳統的 Wi-Fi 與 Bluetooth 功能。
  4. 鑑於將來可能會寫其他類型的 apps,我希望各裝置有較多 sensors。基本上現時所有新舊機都有 proximity sensor 和 accelerometer,但其他 sensors 就不是每一款平價機種都有。我的 wish list 包括 Hall sensor(即電子羅盤)與 gyroscope(陀螺儀)。
一般用家揀手機,看的可能是屏幕尺寸,CPU 有幾多 GHz,幾多 cores,相機正唔正之類,所以店家都好像不大清楚 sensors 方面的事情。有次我 window shopping 時,問某手機有無陀螺儀。店主一臉空白,問我「吓?乜嘢叫陀螺儀?」

新手機
我揀了 Moto G 4G。 這部機的相機出名 crappy,儘管我不關心相機功能,但它的相機在網上似乎太出名了,所以我也好奇一試。用後發現果然係名副其實地「廢」,不過它完全滿足我四項要求,足以「袋住先」。

我於一間名為 Sunxxxxx,又名 Xxxshine 的連鎖店看見此機標價 1599 元,覺得合理。過了幾日,到另外幾間舖頭看過其他機種之後,決定「一錘定音」。回到 Sunxxxxx,咦,怎麼價錢變了 1695 元?難道我記錯?點都好,扑錘。過幾日,走過同一路線,才發覺標出這兩個價錢的,是該連鎖店的兩個不同舖位。一店兩價,儘管只係一舊水,感覺卻不好受。兩月前,此機機價已跌至 999 元。執筆時,街邊好像已經無貨。

Moto G 就算本來關了機,一插電源也會自動開機,雖不算 bug,卻十分擾人。此外,傳統藍牙技術採用 master-slave 模式,可是以 Moto G 作 master 連接其他 slave 裝置時,似乎久不久就有問題。我到現在都不清楚是自己程式有錯,抑或是 Moto G 的原因。此機乃 Google 將 Motorola 賣給 Lenovo 之前的最後一批產品。我本來對 Google 很有信心,現在卻有點失望。換了是今年才買的話,我寧願揀華碩的 Zenfone 2

舊手機
我揀了 Samsung Galaxy S3。 它面世時可能是高級機種,除卻 Hall sensor 和 Gyro sensor,竟然還有 barometer(氣壓計;一般手機拿它當高度計用,輔助 GPS 定位)。此機去年底於元朗各舖賣1200 至1300 元。網上有許多關於黑店賣舊機的傳聞,都是說機肉給人換了次貨之類,搞到我心十五十六。

最後於元朗大榮華酒樓附近,看到一間叫「樂信電話」的舖頭標價 1280 元。略貴,但保用一個月,決定試試。此店位於元朗安寧路 19 號,附近有大量流鶯,很易找(我指店舖)。

我於櫥窗只看到手機正面,翻轉才發現佢背面機殼係 Iron Man 版,大概是某年電影推出時的宣傳噱頭吧。早幾日有新聞說某大陸人豪花十幾萬人民幣買入 Iron Man 版的 Galaxy S6。他要炫富我沒意見,不過炫富用的工具也請揀擇一些吧。這位仁兄,我只覺得佢係傻仔。

我買的 Galaxy S3 有個很怪的毛病,它就算關了機 (power off),不知何解貨每日仍會唔見三分一左右的電量,好恐怖。我起初以為是電池老化,但買了一塊原廠新電池,依舊如是。有想過安裝 cyanogenmod,但不肯定手機的 sensors 和藍牙仍否正常運作,有點騎虎難下。

賣平七百文的平板電腦
平版電腦,我在網上睇啱幾款較舊的,但係都無用,因為市面無貨。新款的縱合乎要求,價錢卻太貴。無計可想之下,唯有到鴨寮街碰運氣。我相中了 Samsung Galaxy Tab S 10.5。以我的 budget 來算,但此機相當昂貴。當時豐澤賣 3900 元,元朗、天水圍抑或鴨寮街的小店,就算是水貨亦只低至 3500 元。正當我想放棄,卻一連發現鴨寮街有兩間舖頭都標價 3200 文。點可以平咁多?此時我又想起黑店故事了。例如網上盛傳某格價網最高 ratings 的某兩三間店舖都是黑店。我會不會誤進黑店?抑或那是水貨價?

兩間標價 3200 文的店舖中,我揀了一間兼售電子零件的舖頭。我見此店本來是專售電子零件,後來才轉型加售電話的。既然有一定歷史,大概會顧全商譽,不是那種騙完人立即遠走高飛的黑店吧。由於其他店舖的水貨價都在 3500 元樓上,我決定,若老闆說這 3200 文是行貨價,就是騙人。

「老闆,呢個價係水貨嗎?」
「點會係水貨?我等只賣行貨嘅!你睇…」(好,立刻走人。)
「…呢度寫住送三百文超市現金卷…」(唔聽你講啦,撇!)
「…要到官方網站登記先攞到,點可能係水貨?」

咦咦咦咦咦咦咦咦咦?

長話短說,我在該店貨銀兩訖,最後證實買的是行貨,它還附送一張 San Disk 的 16GB micro SD card,百佳現金卷也登記、到手兼用光了。儘管標價是 3200 元,扣除贈品之後,實際卻是 2900 文樓下。

這是今年一月底的事。當時 Samsung 正在做宣傳,所以送禮卷。其他舖頭也有標明這點。執筆時,宣傳優惠好像已經取消,天水圍一帶店舖此機行貨價仍高踞 3600 文。先前買兩部手機行霉運,今回終於行好運了。

我幫襯的舖頭為「栢力電子公司」,位於深水埗鴨寮街 210 號。不知此店賣其他機種也是否同樣便宜或老實,不過我自己相當滿意。

狗糧開發記:硬件篇(上)

寫一個天九 app 有幾難?起初我認為不會太難,因為我起碼有三批讀者已經分別寫出自己的天九 app。然而我忘了自己寫程式只是九流,與現代科技又脫節,結果意外頻生。單人模式尚好,四個半月經已完工,還累計試玩了幾千局。我之前未用過智能手機,更從未寫過任何手機應用程式,自問這個進度都算合格。誰知一寫藍牙多人對戰就到處碰壁。知道趕不及於今年農曆年初上架之後,就再提不起勁了。到上月見這個 project 雪藏得太久,才重新打開電腦,斷斷續續再寫。直至上週才完工,前後竟然用了一年,可見我寫 program 有幾水皮。

本系列文章是我的天九遊戲軟件 T9 的開發回憶錄。假若你如我般與現代科技脫節,寫程式又好似我咁流,但係又因為某些原因,而好想投入一個寫手機 app 的 personal project 的話,那我希望我所寫的,對你會有一點點用處。若然你無我咁 out,本身寫 program 又很在行的話,就不用讀下去了。

本篇先談硬件。

手提電腦
既然是 personal project,就要公私分明,而就算是私人工作,我也盡量不想帶回家。故此就需要一部手提電腦當 development machine,寫程式就去圖書館。

起初我以為日後有機會將軟件移植到 iPhone,所以買了一部 13 吋的 MacBook Air。事後看來,純粹就這點而言,我實在太蠢了。原來要在 Apple 的 App Store 將收費軟件放上架,你一係開真名,一係要有一間有限公司。前者要暴露你的個人資料,後者就算搵間會計師樓幫你一腳踢搞掂,每年都要花費幾千文。「寫 app 發達」的年代早就過去,如今九成九的 apps 連回本都成問題,有 running cost 就更不用提了。

MBA 相當好用。起初我非常擔心它屏幕不夠大,卻忘了家中那陳年 LCD monitor 儘管有 15 吋,解像度卻只有 1024x768。相比之下,MBA 尺寸較小,解像度卻有 1400x900;打開文字編輯器,它能夠顯示的程式行數,比我那陳年老 mon 還多。

電池方面, Apple 網站說 13 吋 MBA 可用十二小時,我卻未試過能用得那麼久。將屏幕調至最暗,純粹上網的話,可用接近十一個鐘。寫程式兼上網,則可連續用十小時。不過,一旦做一些稍為吃力的工作,電量眨下眼就會大跌,若要貫徹「就算是私人工作也不帶回家」的宗旨的話,這是必須留意的。舉例說,我起初未買智能手機,所以是用 Android 本身的 emulator 來測試程式的,可是 Android emulator 非常食電,除非你帶備電線(屏山的公共圖書館,容許讀者申請將手提電腦接上館內電源,不知其他公共圖書館是否一樣),否則你就算週六或週日有空,也無法整天窩在圖書館寫程式。用實際手機測試或除蟲的話,由於手機一經 USB 線接上電腦就會自動充電,因此也是食電的。

最厲害的一次,是我早幾日完成了整個程式之後,用 iMovie 剪接示範片段。明明本來是充滿電的,四個幾鐘就玩完。

重量方面,MBA 初上手感覺超輕,用耐咗我就依然嫌重。網上有人話寫程式用 11 吋 MBA 就夠,我到豐澤睇過真品,11 吋似乎太細了,給那些很中產於 StarBucks 或海邊懶悠閑地寫一兩小時的開發者用就可以,給我在圖書館自閉一日就不行了。

MBA 的鍵盤不過不失,trackpad 則超好用,就好似舊時 IBM Thinkpad 的鍵盤和 pointing stick (即 red dot)咁,令人印象深刻。

硬件配置方面,當時 MBA 的基本配置是 Intel Core i5 + 4GB RAM + 128GB SSD,我則改為 Intel Core i7 + 8GB RAM + 256GB SSD,價錢因此變得很貴。MBA 的記憶體是焊死的,無法升級,所以我揀了最高級的配置,這點我依然認為無錯。CPU 和硬碟則可能是揀錯了。寫 app 其實毋需很快的 CPU,我也不是搞多媒體的,硬碟根本不用那麼大。

我去年買的 MBA 有兩個 USB ports。今年 Apple 推出了一款新的 12 吋 MBA,但只得一個 USB port。若你要寫藍牙多人遊戲的話,就要考慮這會否不便了。

講到軟件……果粉一向主張蘋果電腦比其他電腦貴,是因為它內置了許多應用程式,不過我這一年來用得著的,只有 Finder, TextEdit, Calculator, Safari, XCode 和 iMovie 而已。前四類無論是 Linux 或 Windows 都有大把免費的代替品,只有 iMovie 算是幫了忙。

因此,對我來說,MacBook Air 唔算物有所值,不過我又唔覺得佢貴得太離譜。就算搭時光機返到舊年,我都係會買佢,因為當時無其他平價而功能相若的產品。換了是今年,我就可能會揀行 Linux,2015 年版的 Dell New XPS 13 Developer Edition,用最基本配置(Core i5 + 8GB RAM + 128GB SSD)加配原廠外置電池。

2015年6月24日星期三

天九:哈勞德的狗糧

刊登於本網誌的天九系列文章與天九牌例,業已成為事實上 (de facto) 的標準。現時幾乎所有於 Android 或 iOS 系統運行的天九遊戲軟件,都是部份或全部參照在下所編的牌例而成。

我一直都幻想有朝可用手機和祖母打天九,這樣就算是只得兩個人的時候,也可以有兩個電腦玩家「戥腳」了,可惜市面沒有 Wifi 或 Bluetooth 多人對戰的天九 app,於是乎……我把心一橫,自己寫了一套。遊戲版本 1.0,代號「哈勞德的狗糧」(Harald's Dog Food)。先放一個 icon 讓大家先睹為快。


這個版本代號當中,「哈勞德」所指的是十世紀的丹麥和挪威國王「藍牙哈勞德」(Harald Bluetooth),如今電腦或流動裝置的藍牙技術,就是以其命名(故此 Bluetooth 是藍牙,不是藍芽)。至於「狗糧」,當然是來自俚語 "Eat your own dog food" 了。

所謂「自己狗餅自己吃」,可我並非智能手機用家,而是仍離不開我那部黑色流線型 2G 蜆殼 feature phone 的怪胎。今次為了開發給自用狗餅,我買了一部手提電腦,三部流動裝置(要測試藍牙對戰,有些地方是需要最少三部機的),再加其他雜項(USB 線、SD card),不計燈油火蠟,一共使了近 19,000 文。這塊狗餅可算是我自出世以來所擁有最昂貴玩具了。

現在軟件已經完成,於 Google Play 的 deployment 手續亦做得七七八八,只餘一些最後測試和 screen shots,就可以推出市面了。為了收回成本,這個軟件不會是免費的,但我仍希望大家多多支持,這樣才可以繼續開發下去。多謝各位。

Update: The game is now available on Google Play!

Get it on Google Play

2015年6月15日星期一

大憲章

From Online Etymology Dictionary:

Magna Carta
also Magna Charta, 1560s, Medieval Latin, literally "great charter" (of English personal and political liberty), attested in Anglo-Latin from 1279; obtained from King John, June 15, 1215.

2015年6月11日星期四

Survival bias

話說,三間大學就 2017 年行政長官選舉方法所作的聯合滾動民意調查公布了新一輪結果,支持與反對通過所謂政改方案的比率剛好都是 42.8%。公民黨湯家驊議員接受一眾傳媒訪問時表示,「我聽到這個消息,都有點驚訝,因為從數學上來看,真是剛剛找到雙方的人數都是完全對稱一樣,其實我相信那個機會是幾百萬分之一也說不定。

湯議員這個奇異的觀點,很快就受到不少網民質疑,其中有一名為 Andrew Wong 的數學老師於 Facebook 刊登了一封公開信,反駁湯家驊的說法,而湯議員亦頗有風度地於自己的 Facebook 轉載了該信件,並大方認錯。

不幸地,儘管湯家驊的觀點的確是錯的,但 Andrew Wong 的反駁本身也搞錯了。至於前者因為後者錯誤的反駁而承認自己真的犯錯這個做法對不對,我就不清楚了。

無論如何,姑且簡略看一看 Andrew Wong 的反駁有何錯處,以及湯家驊的想法實際有甚麼謬誤。

不幸的反駁

文抄公一下,Andrew Wong 的論點如下:
三大民調的樣本數目, 大約為1100人, 如果只計贊成和反對的人數, 每次均為900多人. 那麼每天公佈結果時, 可以出現贊成和反對的組合, (由1:899, 2:898, 3:897.....數到899:1), 就只有900多個, 加上贊成和反對的比例長期維持35-50%上下, 從未離開過這個範圍, 即有可能出現的結果只有一百多個, 每個結果只有約1/150的機會出現, 絕非閣下認為的幾百萬份之一.

政改民調由四月至今公布了逾30次, 加上近幾日支持度下降反對度上升的趨勢, 在結果符合趨勢的情況下, 碰上今天出現兩者打和的局面, 在數學上絕不是罕有現象, 我希望你如果明白我以上解釋的話, 可以公開澄清一下.
湯家驊誤以為今次正反雙方的人數一樣,而 Andrew Wong 似亦如是想。實際上,今次這個 42.8% 是按香港人口的年齡、性別和教育程度分布加權之後計算出來的。換句話說,儘管正反比率都是 42.8%,受訪者中,雙方實際人數卻可以不同。

就算不理會加權,如 Andrew Wong 那樣,略去沒意見的人,假設有 900 名表明贊成或反對的受訪者,並假設贊成的比例必然介乎 35% 與 50% 之間,那樣的確只有大約 150 個結果(實際有 136 個),可是我們卻無任何理由認為「每個結果只有約1/150的機會出現, 絕非閣下認為的幾百萬份之一」。

舉例說,假設有三名受訪者,回答一條民調問題,三人皆只答「贊成」或「反對」。這樣就有四種結果:三人贊成、兩人贊成、一人贊成、無人贊成。然而,四種結果出現的機會,都是 1/4 嗎?

假設每人都有一半機會贊成,一半機會反對,而我們稱三人為 A 君、B 君與 C 君。這樣,按(A,B,C) 的順序排列三人的回答,會有八種組合:
  • (反對,反對,反對)→ 無人贊成
  • (反對,反對,贊成)→ 一人贊成
  • (反對,贊成,反對)→ 一人贊成
  • (反對,贊成,贊成)→ 兩人贊成
  • (贊成,反對,反對)→ 一人贊成
  • (贊成,反對,贊成)→ 兩人贊成
  • (贊成,贊成,反對)→ 兩人贊成
  • (贊成,贊成,贊成)→ 三人贊成
每種組合的出現概率,都是 (1/2)×(1/2)×(1/2)=1/8。故此,無人贊成的概率為 1/8,一人贊成為 3/8,二人贊成為 3/8,三人贊成為 1/8。四種結果出現的概率,都不是 1/4。

有 N 種結果,並不表示每種結果出現的機會率必然大致一樣。

高考的數學

回到前述 Andrew Wong 有 900 人必答,而只承認贊成比率介乎 35% - 50% 的例子。設
  • p = 每位受訪者回答「贊成」的概率 (0.35 ≤ p ≤ 0.5),
  • y = 結果剛好有一半人(也就是 450 人)贊成的概率。
那麼 p 和 y 的關係為何?香港未廢除高考之前,這只是高考應用數學的基礎課題。用二項式分布的常態分布逼近公式,可計算如下:
$$y\approx\frac{\Phi(450.5,\mu,\sigma)-\Phi(449.5,\mu,\sigma)}{\Phi(450.5,\mu,\sigma)-\Phi(314.5,\mu,\sigma)},$$
其中平均數 $\mu=900p$,方差 $\sigma=\sqrt{900p(1-p)}$,而 $\Phi$ 是常態分布的 cdf。

好了,Andrew Wong 說「贊成和反對的比例長期維持35-50%上下」,若 p=0.5,亦即每人有一半機會贊成的情況下,調查出來的支持度 y 為何?按上述公式,答案約為 0.0725,即 1/14 左右,遠高於 Andrew Wong 認為的 1/150。

若 p=0.35,y 又為何?這個有點麻煩。用上述逼近公式來計算的話,答案是 practically zero,完全不管用。唯有老老實實真的用二項式分布計算。算案是:1/(5.2×1019),即大約五千萬兆分之一。這又何止幾百萬分之一?

然而,Andrew Wong 的論點的最大問題,並非他計錯數,而是他不明白何謂「合理」的數字。

「合理」之疑惑

 從上述例子可以看到,若你本來就相信 p≈0.5 的話,那麼你自然傾向相信有一半人贊成的結果「有約1/150的機會出現」。反之,若你如湯家驊般,根本心裏認定 p 遠低於 0.5,那麼你自然相信「那個機會是幾百萬分之一也說不定」。

問題是,我們不知道實際上 p 是幾多。

我們要做民意調查,正正是因為我們不知道 p,所以才用統計推算。用心目中的 p 來否定計算出來的 y,豈不是本末倒置?

(或者套用 Bayesian inference 的語言來說,無論是湯家驊抑或 Andrew Wong,都是在沒有一個可信的 prior distribution 之下,強行評論 posterior probability 是否合理。)

湯家驊的觀點的真正問題,是他單單因為發生某項觀察結果的概率只有幾百萬分之一,就認定該結果有「蠱惑」。

只因某觀察結果的出現概率低,而認為這個結果特異,是一種稱為 survival bias 的邏輯謬誤。已故著名物理學家(稱為物理巨星亦不為過),諾貝爾獎得主 Richard Feynman 就曾經用以下文字來凸顯 survival bias 如何不合理:
You know, the most amazing thing happened to me tonight. I was coming here, on the way to the lecture, and I came in through the parking lot. And you won't believe what happened. I saw a car with the license plate ARW 357. Can you imagine? Of all the millions of license plates in the state, what was the chance I would see that particular one tonight? Amazing!
將 Feynman 的例子本土化的話,可以如此:
尋日我去換領成人身份證,發現 ID 是 K125633。幾百萬個身份證號碼裏面,只有一個是 K125633,咁都畀我攞到,你話係咪好神奇?
換另一個例子。執筆時,上一期六合彩開彩結果為 7, 12, 16, 17, 20, 25 + 31。參考湯家驊的說法,「我聽到這個消息,都有點驚訝,因為從數學上來看,開出這個組合,我相信那個機會是幾千萬分之一也說不定。」

確實如此。不過呢,這樣令人驚訝的現象,是每星期都會發生的。唔通馬會個個星期都造馬?