分類:Alex’s

Regular expression应用

最近在学习regular expression,刚巧项目上又有用到之处,故此把这两个我觉得挺有用的东西记录一下,以备后用:

1. 抽取SQL语句中Table的名字

一般SQL语句都是这个样子:

select *
from tables_a a
join tables_b b
on a.col = b.col

之前有个项目需要从上千个脚本之中抽取所有的Table名字出来,用人手做显然不可能,所以我最终决定使用regular expression。下面这两句一般来说已经足够:

(from)(\s)+([a-z_]+\.)*[0-9a-z_@]+
(join)(\s)+([a-z_]+\.)*[0-9a-z_@]+

第一句是将所有from后面的字符抽出来,第二句是将所有join后面的字符抽出来。MS SQL情况下,这种是没有问题的。但pl/sql的话,就有机会出现下面这种情况:

select *
from tables_a a, table_b b,
table_c c
where a.col = b.col
and b.col = c.col

遇上这种情况,只能用大包围方式,将所有有可能的字符也抽出来。

(,)(\s)*([a-z_]+\.)*[0-9a-z_@]+(\s)+[a-z0-9]+
([a-z_]+\.)*[0-9a-z_@]+(\s)+[a-z0-9]+(\s)*(,)

这大包围方式的坏处是会把column名字也抽出,到最后还是要人手看一次,不过也能省下不少时间。

2. 识别重复的pattern,并去重

识别重复pattern就是用上regular expression本身look ahead的功能。之前有个项目需要整理一些乱七八糟的数据,其中一项是从系统导出来的号码,不知为什么会自己重复,例如:

正常号码应该是:S1HK098723Y
导出来却变成:S1HK098723YS1HK098723Y

要识别这种变体不是很好弄,因为号码本身没有明确的分界符。但用regular expression一句就搞定

([a-zA-Z0-9]{5,})(\1)

之所以要限制第一组长度为5或以上,是因为要避免诸如00, XX等刚好有重复的字符。这个要因应情况修改。

先外祖父

先外祖父姓周,諱潮芳。廣東南海人。余少時,父母奔走衣食于四方,無暇照顧,故大部分時間皆由外祖父母看管。外祖父讀書不多,年輕時在村裡私塾讀了幾年書,為人豪爽不拘小節。據母親回憶,外祖父頗疏財仗義。同鄉有難,必出手相助。有次賭馬贏了錢,帶著全家坐的士從九龍去元朗郊遊。於六十年代的香港,此行為實奢侈之極。與外祖母經營小販檔賣粥,外祖母只盛七分滿,外祖父則必定盛九分,兩老還為此經常吵架。外祖父之豪爽,從中可見一斑。

外祖父雖讀書不多,但為人處世很有原則。嘗謂“寧可你等人,莫要人等你”,此句話現在依然為余之座右銘。約會聚首,絕少遲到,實為外祖父教誨之功。又有諸如“善有善報,惡有惡報”之語,中國人敬天憫人之精神,大概便是從家教中傳承。今之學人,學貫中西,天文地理無所不知,但心靈修養方面,則似乎闕如了。

Kali Linux下设立Wifi AP

在Kali Linux下设立Wifi AP的如下:

1. 安装所需package

apt-get install -y hostapd dnsmasq wireless-tools iw

2. 首先设定dnsmasq,这个提供DHCP和DNS服务功能


cat > /etc/dnsmasq.conf
log-facility=/var/log/dnsmasq.log
#address=/#/10.0.0.1
#address=/google.com/10.0.0.1
interface=wlan0
dhcp-range=10.0.0.10,10.0.0.250,12h
dhcp-option=3,10.0.0.1
dhcp-option=6,10.0.0.1
#no-resolv
log-queries
EOF

service dnsmasq start

3. 设定hostpad,这个会建立起Wifi AP服务


nano /etc/default/hostapd

#change this line
DAEMON_CONF="/etc/hostapd/hostapd.conf"

cat > /etc/hostapd/hostapd.conf
interface=wlan0
driver=nl80211
ssid=FreeWifi
channel=1
# Yes, we support the Karma attack.
#enable_karma=1
EOF

4. 接下来是设定NAT table,网上很多复杂设定,其实只需要开通FORWARD和MASQUERADE就可以了。当然也要开通ip_forward


iptables -t nat -F
iptables -F
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT
echo '1' > /proc/sys/net/ipv4/ip_forward

5. 最后启动服务


ifconfig wlan0 up
ifconfig wlan0 10.0.0.1/24

airmon-ng check kill
service hostapd start

中文動詞時態

前一陣子和朋友談起中文文法中沒有時態這一變化,本以為這是人所共知,不勞辯證之事實。怎料該朋友居然堅稱中文也有時態,並謂這是他一個大學中擔任教授的朋友告訴他云云。以下是他所列舉的一個例子:

  • 我現在吃飯
  • 我已經吃了飯

他認為吃了飯就是過去式,相當於英文中的“~ed”。之後又舉例如“我已經走了”,“我買了東西”等等,來證明“了”就是中文的過去式。該位朋友性格本來就甚是好辯,你說是,他必須要說非。當時他雄辯滔滔,眾人亦各自點頭。我心裡隱隱然覺得不對,但一時之間也想不過來。回家後苦思一番,終於讓我弄明白是哪裡出了問題。首先,我舉個例子:

  • 去年,黃河氾濫,死傷無數,政府開倉賑災
  • 今年,黃河氾濫,死傷無數,政府開倉賑災

兩句句子,一句描述之前發生的事,一句描述當下發生的事。除了去年和今年標明了時間之外,句子中沒有一個部分能區分這兩種情況。中文動詞不會因時間不同而有所變化,也就是沒有時態這種東西。又例如:

  • 我在看電視
  • 昨天5點,我在看電視

同樣道理,撇除昨天5點,這句句子沒有任何分別,各位只要細心一想,便知真理。那我那位朋友到底犯了什麼錯誤呢?原來,他混淆了“吃”和“吃了”這兩個概念。前者說的是“吃”這個動作,後者強調的是”吃完了“這個動作,並不是強調他過去在吃這個動作。中文可能不好理解,要是翻譯成英文的話,大家一看便知。

  • 我現在吃飯 –> I have lunch now
  • 昨天12點,我在吃飯 –>  I had lunch at 12 yesterday
  • 我已經吃完了飯 –> I finish my lunch

”吃了“本身其實是另外一個動詞,說的是我完成了某一件事情,並非描述我過去在”吃“。同理,”買了“,”走了“等等也是表達”我完成了買“,”我完成了走“這個動作。並非描述我過去在”買“,過去在”走“。當然,既然說的是完成了某個動作,那該動作必然是過去發生的。但跟歐美語言中的過去式,則顯為兩回事。明乎此理,則不難理解我朋友所犯之錯誤了。

考取香港會計師

余自幼性喜理科,數理生物無一不精,唯獨文商則不甚擅長。今竟於機緣巧合之下考取了香港會計師資格,實非余幼時所能想像。故將經驗公諸於世,以被後人,亦供余將來之回憶也。

截止目前為止,香港會計師公會尚不允許自修人士參加考試。Enhanced QP只接納已修讀公會認可課程之人士。若本科並非會計學位,則必須修讀一個認可之Conversion Programme,方可應考。認可課程可參考以下網址:http://www.hkicpa.org.hk/en/become-a-hkicpa/how-to-apply/entry-routes/#route2

(註:New QP將於2019年6月舉行第一次考試,屆時非會計畢業生應可以自修形式通過Associate Level,詳情自行參考公會網頁)

小弟當年便是報讀HKUSPACE之Postgraduate Diploma in Professional Accounting。報讀原因是否因為HKUSPACE最好?非也。余當年之考慮因素只有價錢一項,HKUSPACE乃眾院校中最便宜之課程。余電腦課出身,必須修讀所有基礎課程,總費用亦不超過7萬元。若閣下乃商科出身或曾經修讀個別商業課程,而獲豁免部分課程,則價格更低。只修讀必修課程的話,當年價格只需4萬元不到,比其他院校便宜近半。

時光匆匆,從基礎課程開始,需時兩年方才畢業。畢業後可即刻向會計師公會註冊成為學生會員。余2015年8月畢業,但如果要當年12月參加QP考試的話,必須7月前註冊,所以為方便當年畢業之學生,公會有所謂Conditional Acceptance。7月時先註冊,並註明乃應屆畢業生,公會可以容許候補畢業證書。就是這樣,余2015年12月參加了第一次QP考試。

QP並沒有想像中困難。Module A, B ,C ,D 各有其特點和溫書方法。A,D需時最多,B,D需時較少。建議每次可配搭來考。例如,A+C一組,B+D一組,加上Final,三個Diet便可完成。同理,A+B和C+D亦為可考慮之配搭。A+D則極不建議,因兩者皆需要背誦大量條例和Standard,時間上很難分配。余當年第一次考B+D,第二次考A+C,最後Final,一次搞定。時間分配大約為7分A/D,3分B/C。考Final亦同,7分時間複習A+D,三分時間複習B+C即可。各科心得如下:

Module A: 不斷操練,直至能一眼看穿題目問哪個Standard。有些似是而非的題目,例如似乎是問HKAS40 Investment Property,其實是問HKFRS15 Revenue。Standard不熟尚可抄書,題目看錯便無從入手了。

Module B: MB範圍很細,完全無需理會LP,直接操練Past Paper,直至每題皆能計算正確答案為止。

Module C: 將LP做好Index,確保考試時能快速翻至所需頁面。若無報讀補習班的話,必須熟讀LP,確保一看題目便知道從哪個Chapter入手。

Module D: 同A,不斷操練,直至能一眼看穿題目問的範疇。然後快速翻至對應頁面即可。

Final:綜上

從2013年8月入讀HKUSPACE,到2015年8月畢業,再到2017年2月通過Final。前後耗費3年半光陰。說長不長,說短不短。各位看倌若真有心成為會計師,可權衡一下是否有如此精力,再做考量。

撰寫中文報告技巧

余於香港之外資諮詢公司任職數年,與大陸客戶頗多交道,亦多有機會參與撰寫中文建議書和報告。港人及大陸人雖號稱中文為其母語,但寫作技巧異常拙劣。以口語入文,句式西化已為常事。尤有甚者,文法全然不通,不知其所云,卻莫之能改。蓋因此等句式,流傳已久,深入民心。眾人習以為常,不但不以為非,反覺傳統中文難以理解。余心痛之,積數年之經驗,書之於此,若能對當下文風稍有補益,則亦不枉余之一番心意矣。

通則

中文文法既與西歐語言文法大異,則遣詞造句之方法,自有不同。撰寫報告時,不宜採用太多西化之語句。而中文西化正是現今世人常犯之毛病。此病於余光中之〈怎樣改進英式中文?──論中文的常態與變態〉中已有詳論,今不勞轉述。有興趣之讀者,可以循以下鏈接閱讀全文。

https://dotblogs.com.tw/huanlin/2008/04/23/3205

本文茲就公司報告與建議書中常見之問題,略加分析。

信函

項目建議書之起首,多附有一封信函,以闡述來書之意及書中之大概。此種信函既為公司與公司間之公文往來,故宜使用書面語,不宜以口語入文。正式之公函,應以“敬啟者”起首,信末以“此致 XXX公司XX部門XXX先生”為結尾,表明此信之受文人。信中關於對方之公司,宜稱“貴公司”。對受文人,宜稱“閣下”,“鈞座”或“台端”。對我方,則宜自稱“本公司”或“本人”。若需略表敬意,則可稱“敝公司”。西化之句子及稱呼,於正式公函中可免則免。如“尊敬的領導”,“親愛的XXX”皆不宜出現。又如“我们很高兴向贵公司呈递关于我们XXX专业服务建议书”,此等句子實為外文“We are pleased to ”之翻譯,於中文而言,已不太妥當。兼太過口語化,電郵中出現尚可接受,公函中則不甚得體。以下節錄常見之於建議書:

我们很高兴向贵公司呈递关于我们XXX专业服务建议书。

为了使贵公司享受我方最优质的服务以及资源,我们组织了一支拥有丰富经验和工作热情的专业团队来向贵方提供优质服务及建议。

在下文中,我们非常高兴同贵公司分享我方在全球及中国的XXX能力及经验,尤其是在相关行业领域的XXX经验。同时,我们也向贵司提供了我方建议的工作范围。如贵方有特别需要,我方很乐意按照贵方的要求来修改我方的工作范围。

我们期盼与贵方进一步讨论我方的建议书。同时,若贵方有其他任何问题,可随时联系:

XXX

此文之病,在於冗長,口語化,西化及格式不當。若能作如下改動,則大方得多。一般而言,公函皆應跟隨:

敬啟者:

敬悉貴公司欲開展XXX業務。荷蒙 閣下之邀請,本公司特準備建議書一份,以供省覽。

建議書中列出了本公司於中國乃至於全世界之XXX經驗,突顯了本公司於相關領域之能力。書中亦已包括建議之工作範疇,如有修改,敬請 閣下示之。本公司之項目團隊已經準備就緒,項目隨時可以開展。如何之處,敬候示覆。此致

XXX公司XXX部門XXX先生

(職稱)XXX 謹上

日期

報告

外文報告多喜用“We”或“Ours”以表達本公司或本方之意。受此影響,頗多人於報告中使用“我們”一詞作起首,例如:

我们建议贵行应当根据实际操作情况,定期审阅机制

又如上面節錄之信函,即是濫用“我們”之例子。一篇短短之信函,出現了六個“我們”。乍看之下,似乎問題不大,唯當通篇文章皆用“我們”一詞則甚為臃腫累贅。蓋因“我們”於此等句子中,實不起任何作用。傳統中文中,只要主語明確,一般不再明示。如將上述句子之我們刪除,變為:

建议贵行应当根据实际操作情况,定期审阅机制

意思一樣明確清晰,且無臃腫之弊病。若必須指明某一動作係我方所為,則不宜使用太口語化之句子。應當自稱“本人”“本公司”或者以公司名稱代替。

西歐語言另一特點,為喜用被動式,諸如“This report was written by”,“He is called”。故世人多濫用“被”字。傳統中文,則以主動式為主,估撰寫或翻譯之時,亦當作適當轉換。例如:

我们的工作不应被视作为审计

可直接改為:

本項目並非審計項目

則更合乎中文語法。另外,與其寫“他被稱為”,不若寫“他名為/人稱”。若真要使用被動式,則中文之被動式並非只有一“被”字,乃是根據情況,各自有其用法。諸如:

被殺害,可稱為 遇害

被打,可稱為 挨打

被人提點,可稱為 經人指點

被世人看重,可稱為 為世所重

報告中另一語病,為動詞名詞化,亦即所謂萬用動詞。例如:

我們對某某人進行了訪談

使该模型更为有效的对客户进行评分

訪談本身已經為動詞,無需將之名詞化後再配以“進行”。此種句式亦係西歐語言中所常用者,如“We conducted an interview”,“we performed certain action”,放之於中文則顯為冗長。將之改為:

我們訪談了某某人

使該模型更有效為客戶評分

則恢復了中文簡約之美。

總而言之,中文以簡約為主,無謂之副詞,介詞,助語詞等皆不應保留。又中文之其中一大特色,乃口語與書面語可以完全分離。雖則我國自五四運動以降,提倡白話文,提倡我手寫我口。唯寫文章,總不宜太白話。適當之書面語能使文章莊重得體,亦能顯示撰寫報告之公司,擁有深厚之文化底蘊。

法治與人治

世人皆謂中國重人治而輕法治,且自古如此,余不以為然。中國之法律制度實甚為詳備,自秦漢開始,歷經唐宋,一切司法典章與現代制度已無甚區別。如夢溪筆談中有如此記載,

近歲邢,壽兩郡各斷一獄,用法皆誤,為刑曹所駁。壽州有人殺妻之父母昆弟數口,州司以不道緣坐妻子,刑曹駁曰:“毆妻之父母,即是義絕,況其謀殺,不當復坐其妻。”邢州有盜殺一家,其夫婦即時死,唯一子明日乃死,其家財產戶絕,法給出嫁親女,刑曹駁曰:“其家父母死時,其子尚生,財產乃子物,出嫁親女乃出嫁姊妹,不合有分。”此二事略同,一失於生者,一失於死者。

此兩案實無異於今日之一審與復審,判詞有理有據。若中國有所謂普通法之概念,則此兩案當成案例,以供後來有司斷案之據。中國之病,不在於無法,在於缺乏合適之士,以與有權勢之人相對抗。英國之法律能維持數百年而不衰,蓋因其社會封建制度尚未崩壞,擔任法官之貴族自身有足夠力量與國王相持。又因與國王對抗,故必須將法律置於無上之地位,方能以之制約國王之權力。大憲章與國會之產生,皆源於此。中國則自秦漢以後,封建制度已經崩壞,雖有士大夫抗爭於下,畢竟難與皇帝相抗。遇上奸臣或昏君當道,自身尚且難保,又何以保法律?故中國之病,在於無人。無人,則法不能自行。此病於今日之中國,尚未能去。

叮噹 – 光輝的人性

叮噹之所以歷久而不衰,在於漫畫中對人性的描述非常貼近現實。小時候閱讀未能產生共鳴,但長大後發現大雄,技安,牙擦仔和靜宜這種類型的人確實比比皆是。大雄懦弱怕事,給人的印象是性格善良。在結婚的前夜一章中,大雄的未來岳父也是這麼認為。但仔細閱讀,大雄之善良,並非蓄意為之,乃是無能為力之表現而已。從他屢次使用叮噹所提供之道具來看,大雄一旦掌握權力,為惡之烈絕對不下於技安。例如,在大雄之地底國裡,他便藉著叮噹之道具奴役大家。有好幾次,連自己的好友叮噹本人都不放過,成為他作弄的對象。一朝得志,便不把任何人放在眼內。這些都反映出大雄善良的面目只是由於自己能力不足,非不作惡,實不能作惡也。

這種人性在無論在技安或牙擦仔身上都能找到。技安平時已經是眾惡之首,後來在其中一章中獲得了一個未來的錢包,內藏叮噹也沒有的道具。作惡的本性遂大顯。若不是時空警察及時趕到,恐怕沒有人能再制衡他。牙擦仔重金向大雄購買無敵砲台之後,也是到處為非作歹,將阻止和反對他的人用砲台轟炸。大雄,技安和牙擦仔其實本質上沒有任何區別,差的只是前者實力不足,後者則比別人強而已。

相反,叮噹則是人性中最光輝一面的代表。他作為一個來自未來的機械人,掌握著現代人類所未知的科技,要是他想統治人類可以說是易如反掌。叮噹曾經拿出可以毀滅整個地球的導彈,亦擁有刀槍不入的防禦工具。他能飛天,能下海,能遁地,能隱身。可是他就從來沒有被這權力所蒙蔽,甚至乎沒有打算用來賺錢。除了某幾次被大雄慫恿可以吃大量豆沙包而一反常態以外,叮噹總是甘於平凡。不為外物所動,進退有矩,真乃大丈夫行徑。縱然孔子再生,恐怕也不過如此。

宗教信仰辯

宗教與信仰,世人往往混為一談。有人問曰:汝何信仰?彼以為答案不外乎耶教,佛教,伊斯蘭或其他宗教或無神論等。實則彼之問題乃為汝何宗教,非汝何信仰也。夫信仰者,一人判斷是非之準繩,生活之準則,行動之依據,精神之寄託。宗教者,則只在乎某神之存在與否。故信仰為大,宗教為小,信仰為廣,宗教為狹。舉例說,吾相信善有善報,惡有惡報,若然不報,時辰未到。此為吾之信仰,絲毫與宗教無干。因果循環,報應不爽。某人造之惡果必由某人承擔,此不需神之力量而所能為。又例,先外祖父常告誡余曰,寧要汝等人,莫要人等汝。余常銘記於心,故赴會之時,絕少遲到。此則吾之生活準繩,非特要一個神存在,然後吾方可準時。
故宗教與信仰實為兩者。有宗教者必有信仰,有信仰者則不必有宗教。洋人常以為中國人無神論,故無信仰。其實中國文化雖從未衍生出一宗教,但其衍生之信仰,則足為天下先。如孟子曰,窮則獨善其身,達則兼善天下。此為歷代中國學者之嚮往。故范仲淹云居廟堂之高則憂其民,處江湖之遠則憂其君。耶教則只希望各人能仰賴天主,修身為善,以求死後不落入地獄。相比之下,中國人之信仰豈不比任何之宗教信仰為強?可惜余並非國學大師,不能再作深論。然凡對中國文化稍有認識之人,皆不至於信奉宗教者,則為吾之深信也。惜乎今國學衰微,能稍微了解中國文化者,鮮矣。