2010年8月26日 星期四

The Lack of Common Sense

今天看到一篇文章是這樣說的:

當老鷹活到40歲時,牠的爪子開始老化,無法有效的抓住獵物。牠的啄變得又長又彎,幾乎碰到胸膛。牠的翅膀變得十分沉重,因為牠的羽毛長得又濃又厚,使得飛翔十分吃力。 牠只有兩種選擇:等死,或經過一次十分痛苦的更新過程。 150天漫長的「修煉」。牠必須很努力的飛到山頂,在懸崖上築巢,停留在那裏,不得飛翔。 ⋯⋯ 老鷹首先用牠的喙去擊打岩石,直到喙完全脫落。然後靜靜的等候新的喙長出來。 牠會用新長出來的喙把趾甲一根一根的拔掉。當新的趾甲長出來後,牠便把羽毛也一根一根的拔掉。 5個月以後,新的羽毛長出來了。老鷹開始飛翔。重新得以再過30年的歲月!

然後好多人說好感動,我看了真的覺得太荒謬了。這整篇文章錯誤百出,而且很不合理,看文章的人難道連一般的常識都已經沒有了嘛?

首先,一開頭說「活到40歲」,文末說「再過30年」,表示說這頭老鷹可以活到 70 歲,真是人生自古誰無死七十古來稀。根據這裡這裡,老鷹的平均壽命大概在 40 年到 50 年,野外真的有可以活到 70 年的老鷹嘛?再者,鳥類的喙和爪,和人類的頭髮與指甲一樣,都是角質層,一直都在生長,隨著日常的耗損維持一定的長度,也因此家裡養的鳥類常常需要修喙,免得長得歪了或是長太長了妨礙進食,野外的鳥類的爪、喙則因為有樹皮、石頭等等,得以有正常的耗損,甚至野鳥只怕耗損過度,少見長太長的情況。

另外,鳥羽通常是一塊一塊隨著季節更替,新的羽毛是長在原來的羽毛的位置的,所以說寵物鳥剪羽必須隔一段時間就做一次,因為飛行羽會重新長出來;年紀大的鳥甚至全身的羽毛都會掉光,並不會「羽毛長得又濃又厚」。

失去羽毛的鳥類無法飛行,進食、飲水都會是很大的問題,要「停留150天」不吃不喝,這已經是妖怪等級了吧!

為了這樣一篇沒有常識的文章覺得「好感動」,我真的很無法理解。

2010年8月25日 星期三

SSH Connection Multiplexing And DynamicForward Control Script

一直以來,上網在中國就是個大問題,很多東西因為有萬里防火牆的關係無法 access,比如 twitter、facebook、wikipedia。來了中國以後,一直都是依靠塞外的機器做 ssh tunnel。最早的時候用的是 local port forward,需要在 remote machine 上面建 http proxy,然後用以下的語法連到遠端的 http proxy 去:

ssh -f -N -L <local port number>:<http proxy hostname>:<http proxy port> <user>@<ssh login hostname>

這樣 data 的傳遞路徑是  Application -> local port -> SSH -> login host -> proxy host,通常 login host 就是 proxy host,但是也可以不一樣,以前用過家裡的機器當做 ssh host,然後 proxy host 設定成 proxy.seed.net.tw,這樣指令就變成

ssh -f -N -L 1080:proxy.seed.net.tw:1080 myname@home.machine

-f 是要求在輸入密碼(或是不需要輸入密碼)後,ssh process 就到背景去執行,-N 則是要求進入背景後不需要 timeout,也就是說不管這個tunnel上有沒有資料傳送,都一直維持連接的狀態。這樣再把 browser 的 http proxy 設定成 localhost:1080就可以開始用了。
這樣的作法有兩個問題:

  • 只有 http/https protocol 可以用
  • 控制這個 tunnel 的建立和停止機制很麻煩,只能用 ps -auxwww|grep ssh 找出 pid 然後送 -9 給它。

後來發現了有 -D 這個 option,可以建立 SOCKS4/SOCKS5 proxy,就可以把指令改為:

ssh -f -N -D 1080 <user>@<ssh login hostname>

其中的 -g 表示打開 GatewayPort,讓別的機器也可以把這個 port 當做 proxy 來用。改成這樣以後,OS/X 上只要可以用 SOCKS4/SOCKS5 的程式(幾乎是所有會 honor 系統 proxy 設定的程式)都可以用到這個 proxy,而不僅限於 http/https protocol。

只是改成這樣還是無法解決第二個 control 的問題,每次都還是要很工人智慧去用 ps, grep, kill。一直到昨天晚上看到 OpenSSH 5.6 的 release 公告,才重新發現有個叫做 multiplexing connection 的東西。

這個功能其實從 OpenSSH 3.9 就已經放進去了,主要是提供一個 local unix socket,透過這個 socket 重複使用已經建好的 connection,省去 authentication handshake 的時間。這個功能要在 .ssh/config 裡面設定

ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h:%p

這樣建一個 tunnel 或是啟動任何 ssh session 就會在這裡生一個新的 socket 出來,並且把這個主要的 connection 設定為 Master,以後建立到同樣的 user@host 的 ssh connection 就會利用這個 local socket 來 multiplex。對於這個 Master 我們可以送一些控制的 command,目前只有兩個(according to the manpage)exit 和 check。送 exit 當然就會讓 Master 結束,送 check 的話,會 return 這個 Master 目前的狀態和使用的 pid。看到了嘛?出現 pid 了喔,好像可以解決上面第二個問題了,但是有個更簡單的方法,直接送 exit 就好了。所以最後簡化了建立 SOCKS tunnel 的 shellscript,變成如下的片段:

 #!/bin/sh
port=1080
ssh=/usr/bin/ssh


if [ "$2" = "" ] ; then
echo 'Usage: '$0' {start|stop|check} user@hostname'
fi

if [ "$2" = "start" ]; then
$ssh -f -g -D $port -N $1
fi

if [ "$2" = "stop" ]; then
$ssh -D $port -O exit $1
fi
if [ "$2" = "check" ]; then
$ssh -D $port -O check $1
fi

加上 host, hostname 的設定,就可以用 ./socks.sh start hostname 這樣的形式來啟動 tunnel,然後用 ./socks.sh stop hostname 來停止,用 ./socks.sh check hostname 來檢查目前的 tunnel 狀態了。

 

2010年8月9日 星期一

切身的馬克思命題:為了生活而工作、還是為了工作而生活? - 楊照部落格 - Yahoo!奇摩部落格

切身的馬克思命題:為了生活而工作、還是為了工作而生活? - 楊照部落格 - Yahoo!奇摩部落格:

"年輕、浪漫的馬克思提出了他的夢想:每個人都應該以「個別性」 的身分活著,而工作是「個別性」當中重要的部分。 沒有人可以再像法國大革命前的貴族那樣遊手好閒、不事生產, 寄生在別人的生產力上,每個人都應該進入新的生產關係裡, 貢獻所能。不過一來,工作是尊嚴的,人人尊重工作者, 鄙視不工作的人;二來,工作只佔生活中的一小部分時間, 工作之餘,每個人都有他自己選擇的生活,去釣魚、去爬山、 去寫詩,或去讀柏拉圖。"

最接近這個理想狀態的,應該是 Star Trek 的世界

2010年8月7日 星期六

三太子上身的痴漢水球2.0: [2010/8/7雜談] 崩潰的台灣經濟(偽)

三太子上身的痴漢水球2.0: [2010/8/7雜談] 崩潰的台灣經濟(偽):

"「台灣人已經窮苦到沒辦法留在臺灣過年只能逃難到美國日本,平常沒錢買菜只能出門擠爆高級餐廳吃大餐,房貸壓力太大讓台北每坪價格變成東京兩倍,生活品質太差只能去開車塞爆雪隧,身體太虛只能開跑車載辣妹到墾丁徹夜跑趴,家裡沒水只能跑去宜蘭泡溫泉喝啤酒,房價太貴只能躲在礁溪老爺知本老爺這樣的飯店看2100全民開講,最後滿口塞著鮑魚的嘴巴一直講台灣經濟不好、政府鎖國、中國最大、歐美必衰,所以一切都是阿扁的錯。」"

hahahaha