2011年1月26日星期三

OS/X Server Default Gateway 卡死事件

把 Mac Mini Server 從上海帶回台灣,打算放在家裡當做 VPN server 來用。既然是 OS/X Server,就不用客氣,直接接上寬頻 modem 應該就可以了,不過接上去以後,發現怎樣都不會動,用 netstat -r  看了一下,發現 default gateway 變成 192.168.121.254。

想了很久,才想起來這是第一次在上海辦公室設定這台 server 的時候,因為一時手滑加上沒有好好 RTFM,所以設定得相當混亂。當時把 en0 設定為固定 IP,default gateway 也就定下來了。

依照一般的常理,只要是 DHCP 在這個 interface 上取得了動態的 ip, gateway, dns 等等設定,之前設定過的靜態 ip 和配置應該就會自動失效,不過 OS/X Server 的怪癖性好像不會依照常理而行,每次 reboot 都告訴我 default gateway 還是 192.168.121.254,變成 dyndns 也完全無法正常動作。

/etc 裡面的設定檔都找過了,只好使出 grep 大法,跑到 '/' 底下用 'grep -r 192.168.121 *',最後才發現,在 /Library/Preferences/SystemConfiguration 裡面,有兩個檔案有這個字串,一個是 com.apple.network.identification.plist, 另外一個則是 preferences.plist。根據此處的說明,這兩個檔案分別控制了所有連接過的網路以及不同位置的網路喜好配置。

從這兩個檔案裡面把 192.168.121 相關的東西全部清掉、reboot,這下子 default gateway 就正常了。

下一步,VPN!

2010年12月2日星期四

茉莉二手書店

茉莉二手書店:

"所以現在台灣人包括年輕人、小孩子,都會逛舊書店。"

這突然讓我想到,小學住在新加坡的時候,其實還蠻常去逛舊書店的。我不記得是誰介紹的,多半是我當時的家教老師 Angeline。會去這類的二手書店,最主要的就是買給小孩子看的小說、故事書。各式各樣的 Lady Birds 的小硬皮書、買了快上百本的 Hardy Boys、Enid Blyton 寫的小偵探故事們,到後來讀出興趣了,才去買新的 Dragonlance Chronicles。

在這裡買來的二手書,封底都會印有某某書店某年某月某日以多少錢賣出的橡皮圖章印記,下一次如果把這二手書看完了,還可以拿回來賣,圖章上也會載明如果你多久時間內拿回來賣,書店會以多少錢收購,其實還蠻好的。後來 Hardy Boys 應該是大部分都賣回去了,等於是拿一小筆錢去租書回來看,如果覺得值得的就自己留下。

當時反正上學只上半天,功課也很簡單,不是玩我爸那台 8088 PC/XT,就是看這些買來的二手舊書小說,要說英文有所進步,這些小說實在功不可沒,副作用,當然就是後來買新書也變得像買二手書一樣,一次買好幾斤擺在家裡慢慢看,不過當時台灣沒什麼這種賣回去換別的書這種事情,所以家裡的書越堆越多;看來該秤斤拿去賣一賣了。

2010年11月12日星期五

2010年11月11日星期四

And they fixed it in 10.6.5

The crash that happened in my last blog post has been fixed with 10.6.5. Hurray!

Also, I think this release is a good one, "Top Sites" in Safari became snappier, I now use the small setting so it's like an image wall.

螢幕快照 2010-11-11 下午8.55.59.png

2010年11月7日星期日

SystemPreference Screensaver/Wallpaper keeps crashing! *ANGRY*

I was meddling with some new wallpapers today when I noticed that after I've opened the ScreenSaver/Wallpaper preference pane, it crashes after approximately 10 secs. Searching the net seems to indicate that this might be a plist issue, mostly pointing to com.apple.desktop.plist.

But, that wasn't the issue. I spent about an hour trying to figure out which plist was causing the crash, since if I move all com.apple.* plists out of the usual place, the pref pane stays and runs smoothly. At last, it came down to com.apple.iApp.plist, which is a file indicating the various exported databases for iLife suite and iTunes.

I assume that the pref pane program crashed when trying to read AlbumData.xml. Unfortunately, I don't have any proper solution right now other than wait for Apple to fix the pref pane. There is a work-aroun though. Remove com.apple.iApp.plist before you modify any Screensaver/Wallpaper, the plist will be automatically re-created next time you run iPhoto. This might affect iWeb from retrieving media library from iPhoto and iTunes though.

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 狀態了。