2014年6月21日星期六

6.22 民間全民投票

昨晚於網上投了票。我明白主辦者資源有限,且當務之急為應付中國的網絡攻擊。未能顧及其餘,可以諒解。然而相比往常的投票活動,今次實在有幾個亟待改善之處:
  1. 由於主辦者並非方案的提議人,他們應該要求三個方案的提議者提供網頁,解釋方案內涵,保證網頁內容不變,並於投票網頁附上解釋三個方案的網頁連結。現時,投票網站上解釋方案內容的網頁有附註謂「資料來源: 和平佔中網站」,但不清楚是由和平佔中網站提供資料,抑或是投票主辦者自行詮釋。網頁內容,應由和平佔中網站提供為宜。
  2. 本來就應該開設多個實體票站。電子投票縱然方便,卻排拒了不諳電子產品的選民。我知,資源有限資源有限資源有限吖嘛,但既然係全民投票,就應該盡力令所有人都可以參予。今次安排,我覺得於年齡階層上,會造成很大偏差。
  3. 即使是電子投票,今次的安排也強差人意。投票者必須用智能手機 app,或者可以發出短訊的手機。若我的手機是某些不便發短訊的 feature phone 或老人手機,投票就變得很困難。若能安排用固網電話投票,才算妥善。

又一個 benchmark

從別人的網誌看到一篇做 benchmarking 的論文:A Comparison of Programming Languages in Economics,其中有些令人驚奇的結果。

比較不同程式語言的執行效率,往往引起極大爭議。一來,作比較時,實際上比較的不單單是語言本身,還牽涉了 compiler 或者 interpreter,以及程式庫。二來,各種語言均有其獨特的 features。如何用不同語言來實作同一個算則才算公平,並無定論。幾年前 Google 有人寫了篇 Loop Recognition in C++/Java/Go/Scala,對所涉各種語言,都找來熟悉該語言的工程師,先用最自然的寫法來實作同一個算則,然後再優化程式。照道理這樣做已經很公道,可是還是有工程師事後表示,若早知程式是用來做 benchmarking 的話,寫法就會不同云云。可見無論是再公平的程序,亦說服不了所有人。

三來,許多時於網上見到的都是 micro-benchmarks,它們實作的,往往都是生安白造兼且過份簡單的算則,而非來自現實問題、難度適中的算則。今次這篇論文,和前述 Google 工程師所用的算則,皆有現實背景,既不太難,亦不太易,很適合 benchmarking 用。

我自己寫的程式通常都是做科學計算,用得較多的語言中,我最熟悉的是 Matlab 和 C++,其次是 Python 和 Java,再而是 R。印象中,若計算以矩陣為主(我指的是「矩陣」matrix,不是「陣列」array),則前四種語言的表現皆差不多一樣,原因是除了 C++(但 C++ 也可以)外,Matlab, Python 或 Java 基本上都只是呼叫 BLAS 程式庫。若程式的瓶頸並非矩陣計算,則各種語言分別很大。通常若執行一個 C++ 程式要花一個時間單位,那麼 Java 就要大約 2-3 倍時間,Matlab 不用 Mex 則 6-10倍,而 Python 則時快時慢,但粗略地說,和 Matlab 同級。R 則慢過蝸牛,若講求速度的話,完全不用考慮。

那今次這篇 benchmarking 論文的結果又如何?答案是仍是 C++ 最快。各實作程式所花的時間(以 C++ 為 1.0)如下:

C++ (1.00) < Fortran (1.07) < Matlab, Mex (1.29) < Python/Numba (1.57) < Java (2.10) < Julia (2.70) < Mathematica (3.83) < Pypy (45.16) < CPython (155.31)。

以 C++, Matlab 和 R 來說,結果和我的經驗相符。然而,Julia 和 Python 的表現卻令我意外。如本網誌舊文所說,Julia 這種語法和 Matlab 有點相似的新語言可視為 "a general purpose programming language with a bias towards scientific computing"。其設計者曾於公式網站上,吹噓 Julia 有接近 C++ 的速度,然而網站上的 benchmarks,都不是來自現實問題。因此,今次 Julia 的超卓表現,應有助其宣傳攻勢。

Python 則既慢得意外,也快得意外。PyPy 和 CPython 皆比 C++ 慢了接近兩個數量級,實在始料不及。與此同時,一個我以前未聽過的 Python package,叫 Numba,卻做出 1.57 這個難以置信的結果。若其他範疇的 Python/Numba 程式皆有此表現,何止 Julia 活不了,相信連 Java 及 C++ 皆可殺掉。

不過話說回來,這個 benchmark 未必公正。從它的源程式所見,瓶頸位似乎是二維陣列的 array access。然而用各語言實作時,作者似乎一律假設二維陣列為 column-major 的。這樣就對 Fortran, Matlab 和 Julia 有利,卻不利使用 row-major convention 的 C++ 與 Python 了。無論如何,benchmark 只能作參考,不能一概而論,但今次 Julia 和 Python/Numba 的表現均相當優秀,值得關注。

2014年6月18日星期三

中國央視的鍵盤戰士新聞

有線新聞報道,中國中央電視第一、四、十三頻道皆用了不少時間,報道日前於立法會大樓的示威,不過,為甚麼立法會大樓是下列截圖中的建築物?立法會新大樓都啟用了三年了,舊最高法院大樓亦早已交回法院使用。做新聞,引述外電很正常,但自己重新包裝播出前,起碼應該搞清楚基本事實吧。


話說回來,甚麼叫「衝擊」?我不是扮懵,而是真的不明白這些共產中文詞彙。示威就是「示威」;不准你進入,你偏要進去,就是「硬闖」;若造成許多不必要的破壞,就是「大肆破壞」。乜叉叫「衝擊」?若我去示威,踢倒路旁的垃圾桶,算不算「衝擊垃圾桶」?

2014年6月14日星期六

民許警治 Policing by consent

原文連結

按《資訊自由法》所釋文件

來自:內政部
牘歷:2012年12月10日發佈

25060

我們接獲以下按照《資訊自由法 2000》作出的要求:
請閣下清楚界定內政大臣所謂「民許警治」的意思;可能的話,並輔實例。
我們於2012年12月3日發放下列資料

內政大臣提及「民許警治」時,所指的是一套有悠久傳統的英國警治思想,通稱為「卑利的九條警治原則」。(譯註:卑利 Robert Peel, 1788-1850,曾任英國內政大臣。他在任其間,創立位於蘇格蘭場的倫敦警察廳,是現代英國警隊創始人。卸任後,卑利曾兩任英國首相,中環卑利街即以其命名。)然而,這套思想並無上溯至卑利的證據,它很可能是由倫敦警察廳兩位首任廳長(Charles Rowan 與 Richard Mayne;譯註:他們聯袂出任首任廳長)所擬。從1829年起,發給每名員警的《通例》中所載的原則為:

  1. 除了用兵力和嚴刑來鎮壓,預防犯罪與騷亂也是一個辦法。
  2. 要經常明白,警察履行職務的權力,繫於公眾對警隊的存在、行動、舉止,與警方取信於民、維持信任的能力之認可。
  3. 要經常明白,取信於民,維持公眾信任與認可,亦意味著為求大家守法,須促使公眾自願合作。
  4. 要經常明白,要民眾合作的難度,與為求達到警務目的而動用武力及強迫手段的必要性成正比。
  5. 要公眾青眼有加而不減,並非靠迎合公眾輿論,而是靠經常絕無偏私地維護法紀,完全不受政策左右,毫不考慮個別法律條文為義或不義,隨時為社會上任何人提供個別服務,伸出友誼之手,而不論財富或地位;隨時表現禮節與友善良好的幽默;隨時為保護生命而自我犧牲。
  6. 只有當勸喻、建議與警告仍不足以令公眾合作到一個地步,令公眾守法與恢復秩序時,方可使用武力,而且只能是在該場所實現治安目的所需的最低程度武力。
  7. 要時刻保持與公眾的關係,使「警為民,民為警」的歷史傳統保持現實。警隊只是民眾中唯一的受薪成員,全職履行每位公民都義不容辭,關乎社會福祉與存續的職責。
  8. 要經常明白,有需要嚴守警權,避免僭用或者令人覺得僭用了司法機關報應個人或國家的權力,或者以權威身份定罪與治罪的權力。
  9. 要經常明白,罪行與騷亂之缺少,而非對付它們的警方行動之顯眼,才是對警察效率的測驗。
Essentially, as explained by the notable police historian Charles Reith in his ‘New Study of Police History ‘in 1956, it was a philosophy of policing ‘unique in history and throughout the world because it derived not from fear but almost exclusively from public co-operation with the police, induced by them designedly by behaviour which secures and maintains for them the approval, respect and affection of the public’.(譯註:此段的長句太難譯。投降。)

留意它所指的警權,乃來自公眾共同認許,而非國家權力。此非由個人認許。沒有個別人士可以撤銷他或她對警方或者一條法例的認許。