2017/11/27

捲廉大將失手打碎了玻璃盞

看「西遊記與中國古代政治」有感,以下文字出字「管子」,精華在前兩句,古人有認知到君主行為要有節制,不是想做什麼就可以做什麼。

君有三欲於民,三欲不節,則上位危。三欲者何也?一曰求,二曰禁,三曰令。求必欲得,禁必欲止,令必欲行。求多者,其得寡,禁多者,其止寡。令多者,其行寡。求而不得,則威日損。禁而不止,則刑罰侮。令而不行,則下凌上,故未有能多求而多得者也,未有能多禁而多止者也;未有能多令而多行者也;故曰:「上苛則下不聽」

這點和「天子犯法與庶民同罪」有點類似,差別在於一個強調事前的預防,另一個強調事後的公平處置。古人對人性早已有深刻的體悟,但論述歸論述,實踐歸實踐,千年來都是如此。

2017/11/15

軟體開發實例

今年有興和老師相聚,席間講了一個很多年前做軟體的意外經驗,值得記錄。

當時做的是VOD(視訊隨選)系統,過程中需要做scheduling,以達到更好的服務效果,在要結案時,老師們想到,應該比較一下有scheduling和沒有scheduling的差別,才知道效能改進了多少,量出來以後,大家都驚了,沒有scheduling的效果比有scheduling的效果要好(謎之聲:結案報告不好寫了)。後來一查,原來是Windows會自己再做一次scheduling,也就表示VOD的scheduling本身就是個overhead,難怪效能比較差。

接下來,當然就是設法把Windows內建的scheduling關掉,結果...Windows不允許user把內建的scheduling關掉(只是要寫個結案報告啊啊啊), 迫不得以,只好把平台換成Linux然後再量測,考量一下當時的時間緊迫性和工程的複雜度,那幾天一定很難熬。

老師沒說最後是怎麼結案的,但這個經驗肯定讓大家都學到了一課,用籠統一句話講,就是「軟體很難做」。也許是出於軟體出包比較好救(相對於做硬體,蓋房子等產業),在台灣,包括工程師在內的人對軟體的態度往往是「東西生出來比較重要」和「能動就好」;而就我個人的經驗,向持這個態度的人講軟體的方法論,別人聽不進去就算了,有時還會嗆回來呢。

2017/11/14

理論及應用的時間差

有些科學理論發展出來後,過了很久才找到它的應用,這篇只是記錄目前我所知的例子,以後有新的也會補上來。

  • 費馬小定理發現於1636年,到了1977年後應用在RSA加密演算法,中間隔了300年以上。
  • 黎曼幾何發展於1854年,到了1915年應用於愛因斯坦的相對論,中間約有60年不知道黎曼幾何能用在何處。

西遊記雜談

一開始接觸西遊記是從電視,大多數的細節都忘了,只知道是去西天取經、一路打怪的熱鬧故事;當時年經小,也沒在計較劇情合不合理這件事,只是覺得有件事很奇怪,為什麼孫悟空不翻一個筋斗,一下子就到如來佛那邊把經書拿了,再翻一個筋斗回到東土,這取經之事不就了結了嗎?這個問題就在我三十多歲的時候看文字版的西遊記,才明白是怎麼回事。

書中有解釋為什麼孫悟空沒這麼做,因為唐僧是肉體凡胎,孫悟空沒辦法帶著唐僧用筋斗雲到如來佛面前,就算可以這麼做,如來佛也不會把經書給他們。不能用筋斗雲帶唐僧走這個理由很牽強,因為有一段情節是孫悟空帶著同樣是肉體凡胎的公主,兩人一起駕筋斗雲回到她的國家;但是第二個理由就很有道理,如來佛要的是取經隊伍一步一腳印得到西天來,他不會把經書交給抄捷徑的人回去交差,但很快下個問題就來了,為什麼小說家不著墨這一段,把如來(或是作者)心中的用意明白說出來,而只是輕描淡寫,用一句話把讀者打發掉?

稍微細想西遊記整個故事框架,就會發現它表面上在講取經,實際上則是在反映真實世界的樣貌,而這個樣貌多半充滿負能量,有刻薄寡恩的老闆(玉皇大帝),有貪汙納賄的高官(如來身邊的阿攤和伽葉),有陷害忠良的鄉民等等。但這些都是潛台詞,小說家只講故事,只說各角色們做了什麼,故事背後的邏輯胍絡則由讀者自己推敲,如果讀者看出了小說家想影射的社會現象,那很好;沒看出來的話,也可當作是在看純打怪昇級的故事。因此,每個人都會有各自的解讀,同一個人在不同年紀也會有不同的解讀,這裡有無限的想象空間。

目前為止,我看到最有深度的解讀是薩孟武教授的「西遊記與中國古代政治」這本書,裡頭就解讀為什麼玉帝不留顯聖真君在天宮保駕,為什麼如來佛得知下屬貪汙納賄後非但沒有懲處,反而幫忙開脫等等情節,西遊記成為四大名著之一,也許和它技巧性地影射社會黑暗面有關。

雖然裡頭負能量的情節很多,我仍傾向於認為西遊記是個正能量的小說,會這麼認為是因為唐僧一行人的組成太極端了,唐僧是唐太宗的御弟,同時也是如來佛座下二弟子金蟬子轉世,集官二代及富二代於一身,孫悟空大鬧天宮時,曾叫玉帝讓位給他,則是個叛亂分子;豬八戒和沙悟淨在得到菩薩點化前,是吃人的妖怪,講白了是殺人犯;白龍馬也是犯了殺頭的罪,同樣因為菩薩而有戴功立罪的機會。唐僧以他高貴的出身,接納了孫悟空等社會上的極端份子並一同完成了取經任務,一方面表現了用人惟材的氣量,另一方面也展現了即便犯了滔天大罪,仍可脫離厄境,在社會中向上晉昇的可能,以此觀之,西遊記是不折不扣的勵志故事。

2017/11/02

談談法律白話文

法律白話文近來有許多精彩討論(法律學是專業不因民粹而通俗寫判決豈是下神諭?書摘:「如何做個好法官」-判決的寫作方式,以及「靈魂不歸法律管」中一個自然人的法律想像章節),從寫作的角度來看,讀者和作者的專業素養差距過大的話,讀者往往會有閱讀上的困難,法律這個領域也是如此,因此大眾看不懂判決書有其客觀理由,用白話文書寫判決書並不能完全彌補司法和民眾之間的落差.

我自己在看判決書時也時常遇到要停下來猜文字意思的時候,諸如「即屬有上開瑕疵,仍非可謂係重大瑕疵之情形」,「上訴人購屋前,非不得事先經由看屋而查知該屋牆壁及天花板曾因滲水而有白華」,「然非不可斟酌雙方身分資力與加害程度」。多看幾篇下來,裁判書的文字既不能說是白話文,也不能說它是文言文,而是法官專屬的次文化。法律白話文運動就是要讓這種難懂的文字變得平易近人,但與其說事法律白話文,更貼切的講應是法律簡明文。

為什麼法官會寫出不今不古的文字?我想這是因為這樣的文字代表著他們的行話,用會不會講行話做為標準,可以判斷陌生人是否和自己同屬於一個團體,到行話使用得熟不熟練為標準,可以看出一個人在團體中的資歷。設想一個年輕的法官,新來乍到一個單位,若他想融入同僚法官裡,當然是入境隨俗,使用法官群體慣用的風格和行話,不是嗎? (其實何只是法官,各行各業皆如此。)

此外,寫出來的文字讓人看不懂,其實是有用處的。法院在定義上就是一個裁判單位,各派人士都會來這裡討公道,有時法院並不想得罪某派的人,但又必須給一個勝或敗、有罪或無罪的判決,怎麼辦呢? 玩文字遊戲!只要別人看不懂法官寫出來的東西,就不知道怎麼批評起,即使再不滿判決結果,也只能用恐龍法官之類的空洞語言回應;但要是別人看懂了呢? 那可能就是在媒體上挑戰法官的法律見解了。

在我唸高中時,大法官做出了行政院長能不能兼任副總統的解釋(當時的行政院長是連戰,這個解釋專為連戰而來)。大法官解釋出來後,沒人看懂到底在寫什麼,沒人能確定大法官認為行政院長能兼任副總統,也沒人能確定大法官的意見是不能兼任。當時我的三民主義老師直接就講了,聯考絕對不會考這個,因為沒人懂這個解釋在解釋什麼。

在我們平常人眼中,難懂的裁判書意味著不夠親民友善;但對法官而言,知道如何以及何時要巧妙運用文字,則是一項技術活,平常就要練習,難懂的裁判書不會因為法律白話文運動而消失。

2017/09/16

Setup L2TP/IPSec VPN server on Gentoo Linux

It is not trivial to setup VPN server on Gentoo. After several trial and errors, the VPN is up and running. I think it is better to leave a documentation of what I did.

The final outcomes I want to achieve are

  1. A gentoo linux with a public IP that runs VPN server. Its IP is 172.104.75.62
  2. Other clients, esp my android phone, can connect to the VPN server via L2TP/IPSec protocol.

There are two great articles that help me make it.

Unlike the Gentoo wiki, I do not use certificate files like *.ca or *.crt. I use psk.txt to do the auth job. It would keep the setup task simple.

Install necessary packages

    # emerge ipsec-tools xl2tpd pptpd

Setup ipsec-tools (racoon)

There are 3 configuration files for racoon. The first is /etc/racoon/psk.txt. It controls what information clients should provide, as shown below.

# Peer IP/FQDN  Secret
* be903514

Note that I specify the IP field as *, which means all clients use the same Secret.

The second configuration file is racoon.conf:

path pre_shared_key "/etc/racoon/psk.txt";

remote anonymous {
        exchange_mode main;
        my_identifier fqdn "172.104.75.62";
        passive on;
        generate_policy on;
        nat_traversal on;
        proposal_check obey;
        proposal {
                encryption_algorithm 3des;
                hash_algorithm sha1;
                authentication_method pre_shared_key;
                dh_group 2;
        }
}
sainfo anonymous {
        encryption_algorithm aes, 3des;
        authentication_algorithm hmac_sha1, hmac_md5;
        compression_algorithm deflate;
}

Finally, the 3rd configuration file for racoon is /etc/ipsec-tools.conf

flush;
spdflush;
spdadd 172.104.75.62[l2tp] 0.0.0.0/0 udp -P out ipsec
        esp/transport//require;
spdadd 0.0.0.0/0 172.104.75.62[l2tp] udp -P in ipsec
        esp/transport//require;

After setting up the three files, it's time to call racoon up:

# /etc/init.d/racoon start

Setup xl2tpd

x2ltpd has only one configuration file /etc/xl2tpd/xl2tpd.conf

[global]
port = 1701
access control = no
[lns default]
ip range = 192.168.0.1-192.168.0.20
local ip = 192.168.1.2
require authentication = yes
name = LinuxVPN
pppoptfile = /etc/ppp/options.xl2tpd

Note that pppoptfile variable refs to a file outside the /etc/xl2tpd directory. We need to create it later.

I also setup iptable rules as suggested in the Gentoo Wiki:

iptables -t filter -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport l2tp -j ACCEPT
iptables -t filter -A INPUT -p udp -m udp --dport l2tp -j REJECT --reject-with icmp-port-unreachable
iptables -t filter -A OUTPUT -p udp -m policy --dir out --pol ipsec -m udp --sport l2tp -j ACCEPT
iptables -t filter -A OUTPUT -p udp -m udp --sport l2tp -j REJECT --reject-with icmp-port-unreachable 

Setup pptd

The first step is to edit /etc/ppp/chap-secrets. The following is my config:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
pptpuser  * I_am_client   *

Next create a file /etc/ppp/options.xl2tpd that matches the setting of /etc/xl2tpd/xl2tpd.conf

noccp
auth
crtscts
mtu 1410
mru 1410
nodefaultroute
lock
proxyarp
silent

OK. Now the xl2tpd and pptpd are ready to run.

# /etc/init.d/xl2tpd start
# /etc/init.d/pptpd start

Reap fruits

Now, check the android if it can connect to the VPN server. Tap Settings - More - VPN - Add VPN profile. The following window shows up, and I fill up only the Name, Type, Server IP, and pre-shared key. The IPSec pre-shared key is be903514 in my case (see /etc/racoon/psk.txt).

Save and profile and Tap it again to connect. I will open a dialog. Now, fill in the values that correspond to /etc/ppp/chap-secrets. In my case, Username is pptpuser and the password is I_am_client.

If all goes well, a "Connected" message would show in the android.

2017/09/13

在Linux上架socks5 server.

Socks5 是種 proxy, 以前想下載學術文章但人又不在學校內時,就用了一兩次自己架的socks5 server, 偽裝成校內的機器,再連到學校的圖書館,老實說還蠻好用的,只是當時socks5的server架起來後,一來很難設成自己預期的樣子,二來也沒留下文件,這個知識就這麼失傳了。

直到今天才發現,原來用ssh就可以做到,而且還異常簡單,只要一個指令:

ssh -N -D 0.0.0.0:1080 localhost

就行了,其中-N是讓ssh保持在idle狀態,同時在localhost上不執行任何命令;-D則是把port forward到1080, localhost則是ssh建立連線到localhost的意思。設好之後,其他人在瀏覽器那邊把SOCKS HOST設成執行該ssh指令的那台機器, port設成1080就大功告成。

連到測主機來源的網頁,會顯示

Visible IP Address Information:
hop description IP address GeoIP
0 Your internal IP: unknown 
1 Your external IP: 172.104.75.62 Japan, Tokyo, Tokyo
→ This server:  173.255.232.166 United States, New Jersey, Newark

另一種用法是在本機執行ssh指令:

ssh -N -D 1080 172.104.75.62

其中172.104.75.62是可以遠端ssh連線的server;成功登入後,在瀏覽器那邊設定socks proxy, SOCKS HOST填localhost, port填1080。

至於security的問題, 就交給 iptable 或是 tcpwrapper 囉。

2017/08/03

豹豹,再見

第一次看見虎虎和豹豹的心跳時,我楞了一下,沒想到一次就來了兩個。在那之後的日子裡,我都對著他們說「虎虎和豹豹要乖乖的喔」說著說著,好像和他們建立起了深深的情感,即使他們只能算是胚胎。

今天第八週檢查,豹豹沒有心跳了,王醫生說是因為週遭血塊的關係,供氧不足,就沒了心跳。那時候的失落感好大,因為我這段時間不斷想像一個畫面,要把我學到的許多知識教給他們兩人,看著他們快樂長大、完成他們自己的理想,這個想像就這麼縮減了一半。

雖然只有短短的八週,我仍然感謝和豹豹這段無緣的情份,希望你能很快找到另一個好家庭投胎。

2017/04/27

民主和法治

今天聽到的觀點,很有啟發

法制:以法管人,法律有如馬車的彊繩,君王則是車夫。法治:將權力關進籠子裡。

有法治,但不一定有民主,如香港。有民主但不一定有法治,如古希臘的陶片放逐法。

民主的直接對立面不是專制,而是君主(或寡頭)。

專制的直接對立面不是民主,而是憲政。專制的本質是權力不受制約,不是誰說了算的問題。

法治是憲政的結果。在憲政的環境下,才講的上程序正義。

民主則是為了實現善政,符合人性的兩個基本需求:被尊重(能參與過程)和被信任(不分男女老少、知識高低),政治權力要和經濟能力脫勾,才能建立民主的基礎。

民主是在憲政建立起來之後,逐漸成長和擴大的。

本傑明‧富蘭克林談選舉權

今天一個人有頭公驢﹐價值50元﹐他有權投票﹔但驢在下次選舉前死亡。與此同時﹐他本人變得更有經驗﹐對政府原則的瞭解以及對人生的認識更廣博﹐因此更能勝任選舉當權者──然而驢死了﹐他不能投票。各位先生﹐請告訴我﹐選舉權屬於誰﹖屬於這個人﹐還是屬於這頭驢﹖

2017/04/05

要盟也,神不聽

今天聽到的有趣故事,孔子要到衛國,中途經蒲地,蒲人不希望孔子這一幫人到衛國幫助衛國國君,於是和孔子約定,如果孔子不去衛國,就放你走,孔子走了以後,子貢問孔子要不要遵守約定? 孔子說「要盟也,神不聽。」意思是可以不用鳥在威脅下所立的約定。