無聊筆記: 公農曆轉換法 #2

從上文可見,公農曆轉換計算簡單,但所需的數據甚多,當中包括每年有否閏年,以及每個農曆月的天數。以上兩組數據也可以用計算方法算出,但非常複雜,故此多以查表方式得出數據。
最直接方法就是如此儲在數據。如 2012 年可存為:

[30,29,30,30,29,30,29,30,29,30,29,30,29,4]

Vector (或 array/tuple )頭十三位是每個農曆月日數,最後一位是閏月。如沒有閏月可存為 0 。但市面上見到的數據表,大多是在 liblunar 抽出來,而那數據表如此。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[
    0xF0EA4, 0xF1D4A, 0x52C94, 0xF0C96, 0xF1536, 0x42AAC, 0xF0AD4, 0xF16B2, 0x22EA4, 0xF0EA4,  # 1901-1910
    0x6364A, 0xF164A, 0xF1496, 0x52956, 0xF055A, 0xF0AD6, 0x216D2, 0xF1B52, 0x73B24, 0xF1D24,  # 1911-1920
    0xF1A4A, 0x5349A, 0xF14AC, 0xF056C, 0x42B6A, 0xF0DA8, 0xF1D52, 0x23D24, 0xF1D24, 0x61A4C,  # 1921-1930
    0xF0A56, 0xF14AE, 0x5256C, 0xF16B4, 0xF0DA8, 0x31D92, 0xF0E92, 0x72D26, 0xF1526, 0xF0A56,  # 1931-1940
    0x614B6, 0xF155A, 0xF0AD4, 0x436AA, 0xF1748, 0xF1692, 0x23526, 0xF152A, 0x72A5A, 0xF0A6C,  # 1941-1950
    0xF155A, 0x52B54, 0xF0B64, 0xF1B4A, 0x33A94, 0xF1A94, 0x8152A, 0xF152E, 0xF0AAC, 0x6156A,  # 1951-1960
    0xF15AA, 0xF0DA4, 0x41D4A, 0xF1D4A, 0xF0C94, 0x3192E, 0xF1536, 0x72AB4, 0xF0AD4, 0xF16D2,  # 1961-1970
    0x52EA4, 0xF16A4, 0xF164A, 0x42C96, 0xF1496, 0x82956, 0xF055A, 0xF0ADA, 0x616D2, 0xF1B52,  # 1971-1980
    0xF1B24, 0x43A4A, 0xF1A4A, 0xA349A, 0xF14AC, 0xF056C, 0x60B6A, 0xF0DAA, 0xF1D92, 0x53D24,  # 1981-1990
    0xF1D24, 0xF1A4C, 0x314AC, 0xF14AE, 0x829AC, 0xF06B4, 0xF0DAA, 0x52D92, 0xF0E92, 0xF0D26,  # 1991-2000
    0x42A56, 0xF0A56, 0xF14B6, 0x22AB4, 0xF0AD4, 0x736AA, 0xF1748, 0xF1692, 0x53526, 0xF152A,  # 2001-2010
    0xF0A5A, 0x4155A, 0xF156A, 0x92B54, 0xF0BA4, 0xF1B4A, 0x63A94, 0xF1A94, 0xF192A, 0x42A5C,  # 2011-2020
    0xF0AAC, 0xF156A, 0x22B64, 0xF0DA4, 0x61D52, 0xF0E4A, 0xF0C96, 0x5192E, 0xF1956, 0xF0AB4,  # 2021-2030
    0x315AC, 0xF16D2, 0xB2EA4, 0xF16A4, 0xF164A, 0x63496, 0xF1496, 0xF0956, 0x50AB6, 0xF0B5A,  # 2031-2040
    0xF16D4, 0x236A4, 0xF1B24, 0x73A4A, 0xF1A4A, 0xF14AA, 0x5295A, 0xF096C, 0xF0B6A, 0x31B54,  # 2041-2050
    0xF1D92, 0x83D24, 0xF1D24, 0xF1A4C, 0x614AC, 0xF14AE, 0xF09AC, 0x40DAA, 0xF0EAA, 0xF0E92,  # 2051-2060
    0x31D26, 0xF0D26, 0x72A56, 0xF0A56, 0xF14B6, 0x52AB4, 0xF0AD4, 0xF16CA, 0x42E94, 0xF1694,  # 2061-2070
    0x8352A, 0xF152A, 0xF0A5A, 0x6155A, 0xF156A, 0xF0B54, 0x4174A, 0xF1B4A, 0xF1A94, 0x3392A,  # 2071-2080
    0xF192C, 0x7329C, 0xF0AAC, 0xF156A, 0x52B64, 0xF0DA4, 0xF1D4A, 0x41C94, 0xF0C96, 0x8192E,  # 2081-2090
    0xF0956, 0xF0AB6, 0x615AC, 0xF16D4, 0xF0EA4, 0x42E4A, 0xF164A, 0xF1516, 0x22936,           # 2090-2099
]
[
    0xF0EA4, 0xF1D4A, 0x52C94, 0xF0C96, 0xF1536, 0x42AAC, 0xF0AD4, 0xF16B2, 0x22EA4, 0xF0EA4,  # 1901-1910
    0x6364A, 0xF164A, 0xF1496, 0x52956, 0xF055A, 0xF0AD6, 0x216D2, 0xF1B52, 0x73B24, 0xF1D24,  # 1911-1920
    0xF1A4A, 0x5349A, 0xF14AC, 0xF056C, 0x42B6A, 0xF0DA8, 0xF1D52, 0x23D24, 0xF1D24, 0x61A4C,  # 1921-1930
    0xF0A56, 0xF14AE, 0x5256C, 0xF16B4, 0xF0DA8, 0x31D92, 0xF0E92, 0x72D26, 0xF1526, 0xF0A56,  # 1931-1940
    0x614B6, 0xF155A, 0xF0AD4, 0x436AA, 0xF1748, 0xF1692, 0x23526, 0xF152A, 0x72A5A, 0xF0A6C,  # 1941-1950
    0xF155A, 0x52B54, 0xF0B64, 0xF1B4A, 0x33A94, 0xF1A94, 0x8152A, 0xF152E, 0xF0AAC, 0x6156A,  # 1951-1960
    0xF15AA, 0xF0DA4, 0x41D4A, 0xF1D4A, 0xF0C94, 0x3192E, 0xF1536, 0x72AB4, 0xF0AD4, 0xF16D2,  # 1961-1970
    0x52EA4, 0xF16A4, 0xF164A, 0x42C96, 0xF1496, 0x82956, 0xF055A, 0xF0ADA, 0x616D2, 0xF1B52,  # 1971-1980
    0xF1B24, 0x43A4A, 0xF1A4A, 0xA349A, 0xF14AC, 0xF056C, 0x60B6A, 0xF0DAA, 0xF1D92, 0x53D24,  # 1981-1990
    0xF1D24, 0xF1A4C, 0x314AC, 0xF14AE, 0x829AC, 0xF06B4, 0xF0DAA, 0x52D92, 0xF0E92, 0xF0D26,  # 1991-2000
    0x42A56, 0xF0A56, 0xF14B6, 0x22AB4, 0xF0AD4, 0x736AA, 0xF1748, 0xF1692, 0x53526, 0xF152A,  # 2001-2010
    0xF0A5A, 0x4155A, 0xF156A, 0x92B54, 0xF0BA4, 0xF1B4A, 0x63A94, 0xF1A94, 0xF192A, 0x42A5C,  # 2011-2020
    0xF0AAC, 0xF156A, 0x22B64, 0xF0DA4, 0x61D52, 0xF0E4A, 0xF0C96, 0x5192E, 0xF1956, 0xF0AB4,  # 2021-2030
    0x315AC, 0xF16D2, 0xB2EA4, 0xF16A4, 0xF164A, 0x63496, 0xF1496, 0xF0956, 0x50AB6, 0xF0B5A,  # 2031-2040
    0xF16D4, 0x236A4, 0xF1B24, 0x73A4A, 0xF1A4A, 0xF14AA, 0x5295A, 0xF096C, 0xF0B6A, 0x31B54,  # 2041-2050
    0xF1D92, 0x83D24, 0xF1D24, 0xF1A4C, 0x614AC, 0xF14AE, 0xF09AC, 0x40DAA, 0xF0EAA, 0xF0E92,  # 2051-2060
    0x31D26, 0xF0D26, 0x72A56, 0xF0A56, 0xF14B6, 0x52AB4, 0xF0AD4, 0xF16CA, 0x42E94, 0xF1694,  # 2061-2070
    0x8352A, 0xF152A, 0xF0A5A, 0x6155A, 0xF156A, 0xF0B54, 0x4174A, 0xF1B4A, 0xF1A94, 0x3392A,  # 2071-2080
    0xF192C, 0x7329C, 0xF0AAC, 0xF156A, 0x52B64, 0xF0DA4, 0xF1D4A, 0x41C94, 0xF0C96, 0x8192E,  # 2081-2090
    0xF0956, 0xF0AB6, 0x615AC, 0xF16D4, 0xF0EA4, 0x42E4A, 0xF164A, 0xF1516, 0x22936,           # 2090-2099
]

以上的數據已包含 1901 至 2099 年的全部數據。經過研究之後,數據結構如此。舉 2012 年的 0x4155A 為例。
將十六進制的 4155A 轉為二進制,就是 1000001010101011010 。二進位是由右讀到左,第 1 至 13 位元就是每個農曆月的天數, 0 為 29 , 1 為 30 。16 位元開始的 100 ,就是閏月月份。 1000 轉成十進制就是 4 。我們可用 Bitwise operator 將以上數據計算出來。以 R 為例,可以用以下方法算出閨月和某月的天數。

1
2
3
bitwShiftR(0x4155A, 16) #4
29 + bitwAnd(bitwShiftR(0x4155A, 1), 1) # Jan = 30 day
29 + bitwAnd(bitwShiftR(0x4155A, 2), 1) # Feb = 29 day
bitwShiftR(0x4155A, 16) #4
29 + bitwAnd(bitwShiftR(0x4155A, 1), 1) # Jan = 30 day
29 + bitwAnd(bitwShiftR(0x4155A, 2), 1) # Feb = 29 day

好了,我們已有足夠數據轉換 1901 年 2 月 19 日至 2100 年 2 月 18 日的所有農曆了。戲肉就是寫一個 R function 去將公曆年份轉成農曆。
這個東西已放在我的 github 。順手一提,我正在開發一個叫 hongkong 的 R Package 。而這個公農曆轉換法,實在是用作計算香港的假期。現在已確定 2007 年至 2014 年的公眾假期計算正確。

民主和社會秩序不應是零和遊戲

最近教院一個研究廣為流傳。該研究的主要論點是,如果要在民主和社會秩序作出取捨,五成香港人會選擇社會秩序,只有三成人選擇民主。1
負責研究的學者被巴士媒體訪問﹐回應此研究為何將民主和社會秩序變成零和遊戲,將民主和社會秩序變成互相排斥的關係。學者指出這個研究是基於佔領中環的邏輯而設計。而佔領中環的邏輯就是破壞中環的穩定作籌碼去爭取民主。
這個研究有反宣傳佔領中環的意義,亦因此廣為官方、親建制媒體所喜愛。但我想指出一點,我其實也不想佔領中環發生,屆時真的會將民主和社會秩序變成零和遊戲。而事實上,民主和社會秩序並不是零和遊戲。民主和社會秩序的消長是沒有必然關係,例子如下:

有民主、有社會秩序: 斯堪地納維亞式社會民主(Nordic social democracy)
有民主、沒社會秩序: 索馬里2
沒有民主、有社會秩序: 北韓
沒有民主、沒有社會秩序: 叙利亞

外國有臭蟲,香港都臭蟲。先不論外國的例子,純以本港作為主體思考,民主和社會秩序絕對能夠共存,而無須像學者所假設的思維將其對立。佔領中環的前設條件是,政府最終的普選方案不合乎國際定義之普及而平等的原則。故此,若果我們想民主與社會秩序共存,制止佔領中環的發生,最簡單的方法不是民間做甚麼,而是政府推出一個合乎國際定義之普及而平等的選舉方案。這亦有助和平化解香港現在劍拔弩張的對立氣氛。其實更正確的問題是: 若然政府宣佈香港實行合乎國際定義普及而平等的選舉,請問你會否反對。如果香港大多數人反對的話,那我只好認命,原來我住在北韓。

  1. 其實更正確的說法是,五成人認為社會秩序比民主重要。三成人認為民主比社會秩序重要。 []
  2. 只有民主選舉 []

無聊筆記: 公農曆轉換法 #1

假設 2012 年 1 月 23 日是年初一,請問今天 2013 年 5 月 9 日是農曆幾月幾日。
以下是其中一種算法,市面上大部份軟件都是用類似方法計。
2013 年 5 月 9 日與 2012 年 1 月 23 日相差 472 日。1 設此值為 y 。 ( y:= 472)
2012 年龍年是有閏四月。這是事先要知道的數據。此外農曆每個月的日數不定,這也增加了計算的難度。以下是龍年的數據:
正月: 30天 二月: 29天 三月: 30天 四月: 30天 閏四月: 29 天 五月: 30 天 六月: 29 天 七月: 30 天 八月: 29 天 九月: 30 天 十月: 29 天 十一月: 30 天 十二月: 29 天
龍年的總天數就是 30+29+30+30+29+30+29+30+29+30+29+30+29 = 384 天
由於 y >= 384 天,就將 y := y – 384 天 = 88 天。設新的 y 值為 88 。
88 天之前是甚麼日子呢? 就是蛇年年初一,也即是 2013 年 2 月 10 日。
之後又找出蛇年每月的天數
蛇年正月有 30 天。由於 y >= 30 ,將 y := y – 30 = 58 (二月初一,3 月 12 日)
蛇年二月有 29 天。由於 y >= 29 ,又將 y := y – 29 = 29 (三月初一,4 月 10 日)
蛇年三月有 30 天。由於 y < 30 天,不用再減。故此 5 月 9 日在農曆三月之內。
由於三月初一是 4 月 10 日,與 5 月 9 日相距 29 日。故此 5 月 9 日就是農曆三月三十 (1 + 29 = 30)。
又假設 2012 年 1 月 23 日是年初一,請問 2012 年 6 月 4 日是農曆幾月幾日呢。
2012 年 1 月 23 日與 2012 年 6 月 4 日之間相差 133 日。 y := 133 。
龍年上面計過有 384 天。而 y < 384 ,故此 2012 年 6 月 4 日仍在龍年之內。之後是找出哪一月份。
龍年正月有 30 天。由於 y >= 30 ,將 y := y – 30 = 103 。
龍年二月有 29 天。由於 y >= 29 ,將 y := y – 29 = 74 。
龍年三月有 30 天。由於 y >= 30 ,將 y := y – 30 = 44 。
龍年四月有 30 天。由於 y >= 30 ,將 y := y – 30 = 14 。
龍年閏四月有 29 天。由於 y < 29 。故此 2012 年 6 月 4 日是在閏四月。
閏四月初一與 2012 年 6 月 4 日相差 y 日,即 14 天,故此 2012 年 6 月 4 日是閏四月十五。

  1. 這個我是用電腦計的。用手計都不難。 2012 年是閏年,故此一年有 366 日。即是 2012 年 1 月 23 日與 2013 年 1 月 23 日之間有 366 日。 2013 年 1 月 23 日至 2013 年 4 月 23 日之間有 31 + 28 + 31 = 90 日。 2013 年 4 月 23 日至 5 月 9 日用數手指方法可計出有 16 日。故此就是 366 + 90 + 16 = 472 日。 []

如果香港能選擇 – No

每次看完外國有關政治的電影,從電影院走出來,都有一種非常可怕的窒息感油然而生。
皮諾切特都尚且知道自己當年軍事政變推翻民選的阿連德,是有合法性1 問題。獨裁統治十五年,仍要舉行公投,為自己千秋萬世統治智利建立合法性。控制政治、軍事、傳媒的皮諾切特,都要想這個問題,為何只有六百八十九票的香港特首竟無這個覺醒?
戲中談到公投,我也不禁想起當年的五區公投。皮諾切特公投的投票率高達九成,香港一個五區補選的投票率竟然只有 17% 。香港的民主運動轉向守勢,我想轉捩點就是五區公投。我並不是說當年發起五區公投的政黨要承擔責任,相反,這是一次清楚的展示,證明大部份香港人沒有智利人的勇氣和智慧。原來絕大部份的我們可以忍受一切,包括專制統治之下的地產霸權、日益收窄的言論自由、非港人優先的教育和經濟政策等等。我們當年的不選擇,就是我們的選擇。未來我們向後人解釋,為何我們沒有民主,我想我只能夠無言以對。2
天佑智利,快樂已降臨。中共治下的香港注定只有假民主。

  1. 合法性並不單單是照中文字面解,純粹討論某人上台執政是否合乎當地法律的問題。政治道德上的合法性,即 Legitimacy 一詞,是指被管治者有否同意被某人所統治。故此,現時只爭論基本法上普選定義的問題,根本是很低層次的討論。 []
  2. 這是我和妻子選擇不要小孩的原因之一。 []

以戰迫和

最近的拉布和罷工,我們看到香港的「保守霸權」。
保守勢力佔據了宣傳機器、國家機器,唯一一條保守勢力無法完全佔據的互聯網發聲渠道,也在五毛溝淡之下慢慢的消亡。
其實保守霸權最可怕一點,並非他們以資本所控制的以上兩項,更可怕的是他們所擺出的姿態,以及香港人普遍對這種姿態的沉默、忍讓。
外國也有臭蟲,故此外國也有拉布和罷工。先談拉布,到底拉布的作用是甚麼呢?這一點絕對值得討論。
議員拉布的作用,實質的效果當然是阻擬議案通過,但背後的意義最少有兩個。第一,拖延議案通過,可令議案的問題更加突顯,讓更多市民清楚議案的流弊,匯聚民意,令市民向議員及政府施壓。第二,政府有責任與拉布議員談判,商討取消拉布的條件。所以,拉布戰的主要目的,並非要拖跨政府,而是以此作為籌碼與政府談判。以現在爭取全民退休保障的拉布戰為例,我們民間是否認該討論一下全民退休保障的問題?如果大家都覺得根本無須要全民退休保障,大家自生自滅的話,當然現在的拉布是沒有意思的。但若你是認同香港是要有全民退休保障的話,請問政府有提出過嗎?你投票支持的議員有爭取過嗎?當然,政府可能無意現時推行全民退休保障,亦可與拉布議員商討未來人口老化的對策,又或者承諾研究全民退保。
但我們不但沒有見到政府與拉布議員對話,而是擺出強硬姿態,出盡法寶宣傳。「1,530萬元就在15分鐘玩完」論拉布阻紓困論,政府和議會保守勢力根本穩操勝劵,實在無須要與有敵我矛盾的議員合作。香港搞溝通帶頭對話,政府話佢係反動。一於大家一起沉默,世界上的黑暗和不公義似乎就會自動消失。
罷工一樣。
工會罷工要求爭取加薪 20% ,我想工會本身也了解到這是沒有可能發生。罷工為的也不是搞對抗,而是要與資方對話。正所謂開天殺價落地還錢,我懷疑只要資方出價如 12% 、保障工人工作環境、縮短工時,或者罷工已可平息。可是資方的態度亦與穩操勝劵的政府和保守勢力一樣,與勞工對立,再與友好傳媒聯合講「文革論」。
資本家聯同不民主的政府,在香港是贏晒的,根本不用聽你講任何的話。明明拉布、罷工的發起人目的是以戰迫和,資本家和獨裁政府卻趁這些不知好歹的挑戰者挑戰權威時,順勢聯同沉默的群眾一起擊沉他。我們明明知道不公義的存在,就像房間裏明明有一隻大象,大象在房裏走來走去。但是房間裏的人卻假裝大象不存在,在言談間也避免談到大象,樂於當個沉默的共謀者