木工退場囉

自從泥作退場後,為期三週的木工作業就展開了,在這三週當中我三不五時去工地查看施作進度,看著房子依照設計圖一步步完成的感覺真的很有成就感。Joshua 的這組木工師傅感覺工還蠻細的,一些該注意的小地方都不需要屋主來提醒,一次到位,感覺還不錯。

從客廳陽台往大門看

Read more

eee Box in Fedora

去年底華碩首先推出 mini book 類型的 eee PC,一推出馬上席捲市場,搞得各家廠商紛紛也得推出類似的產品來應戰,像是 Acer Aspire One、HP Mini 等等。不過這類產品對我來說大概只有出國攜帶方便的好處而已,雖然非常省電,不過螢幕只有 7" 對我來說瀏覽網頁是吃力了點,所以對這類產品一直不是很感興趣。但是最近華碩 eee 系列再度推出 eee Box 超小型的桌上型系統,搭載 Intel ATOM N270 處理器 / Intel 945G / 1G DDR2-667 / 80G 硬碟,號稱待機時僅耗電 14W,全速執行時也僅耗電 24W,更難得的是整體售價僅台幣 7988 元,再加上美觀的外型,一推出的確非常令人注目。

由於目前我的 Broso 主機是每天 24 小時不關機,這個用 P4 2.8GHz CPU 跑的耗電大怪物,讓我家每個月的電費大約都在 3000 元左右,如果是夏季吹冷氣那電費就更可觀了。因此為了節省電費,在去年底時我也曾經採買了 ITX 規格的小主機板與外殼,再加上 P4-M 1.8GHz 這顆便宜的筆記型專用處理器,搭配組成一台小型的伺服器,效能跑起來也是還不賴,不過幾個月跑下來電費是少了一點,但是卻也沒有明顯的減少。另外可能是因為 Case 非常小的緣故,機殼內的空氣流通不佳,24 小時跑起來整個機殼一直持續都很熱,高溫持續下來對機器來說當然是不太好,終於到了今年大約 5 月時,ITX 主機板終於燒壞了,於是我又回到以前用 P4 跑 Linux 來當伺服器的時代。

因此我又繼續尋找節能省電的小型桌上型主機,其實也不難找,像是同樣搭載 ATOM 處理器的 聯強Lemel Q-PC Smart,規格也還不賴,但是 1 萬多的售價真的讓人下不了手啊。因此尋尋覓覓了好一段時間,此時剛好華碩推出了 eee Box,而且一推出就缺貨,於是我就直接在 Y 購上刷卡預購,等了兩個多禮拜,終於收到 Y 購的出貨通知,東西在本週二到手。

東西到手後,就開始灌 Fedora,不過過程不是很順利,為了避免我下次重灌時還要再重新爬文一次,還是再多寫篇小筆記吧。用外接光碟機開機後,進入圖形安裝介面,沒多久螢幕訊號就消失了,試了兩三次都一樣。於是我改用 Text 模式來安裝,Text 模式就非常順利,一路安裝完畢後,最後重開機進入 Fedora 的設定畫面,

設定到 X configuration 時,螢幕訊號再度消失,於是只好重開機 (後記:其實此時應該可以按下 ALT-CTRL-BackSpace 回到 console 介面),再進入設定一次仍然相同,猜想應該是 Fedora 的 X Server 還不支援 Intel 945G chipset driver。求助於 Google,爬文了很久,終於有人提到類似的問題 Installing Linux – Ubuntu on EEE Box install succeeded.。於是依樣畫葫蘆修改 /etc/X11/xorg.conf,將下列 Driver 設定從 intel 改為 vesa,

Section "Device"
   Identifier "Videocard0"
   # Driver "intel"
   Driver "
vesa"
EndSection

再次進入 X configuration 去偵測顯卡驅動程式及螢幕,果然就 X Windows 畫面就正常出現,真是感動!不過由於先前安裝完畢首次進行 X 設定時未能設定成功,所以預設系統的 run level 是設定在 init 3,也就是 full multiuser mode,不會自動進入 X Window Login,必須再去調整一下 /etc/inittab,然後將 run level 從 init 3 改為 init 5

# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# System initialization is started by /etc/event.d/rcS
#
# Individual runlevels are started by /etc/event.d/rc[0-6]
#
# Ctrl-Alt-Delete is handled by /etc/event.d/control-alt-delete
#
# Terminal gettys (tty[1-6]) are handled by /etc/event.d/tty[1-6] and
# /etc/event.d/serial
#
# For information on how to write upstart event handlers, or how
# upstart works, see init(8), initctl(8), and events(5).
#
# Default runlevel. The runlevels used are:
# 0 – halt (Do NOT set initdefault to this)
# 1 – Single user mode
# 2 – Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 – Full multiuser mode
# 4 – unused
# 5 – X11
# 6 – reboot (Do NOT set initdefault to this)
#
# id:3:initdefault:
id:5:initdefault:/etc/X11/prefdm

其餘就沒什麼特別的地方,將網頁資料 / 相關批次作業 / crontab 設定 從原來的 P4 怪物機,移轉到新的 eee Box 後,剩下的就是靜待後面幾個月的的電費帳單來比較看看省電效果了。

GoogleDesktopProxy

自從使用了 GoogleDesktop 之後,它強大的搜尋信件文件能力,讓我減少了許多尋找資料的時間。尤其是在辦公室裡,常常記得某個資料曾經看過,找了很久但就是找不到放在哪兒。這個時候,GoogleDesktop 就發揮了很大的效用,輸入關鍵字後,馬上就幫你將所有相關的文件通通找出來列給你。

最近公司同事想把一些文件整理以後放在一台公用電腦上面,然後利用 GoogleDesktop 讓大家可以利用關鍵字搜尋來尋找有用的資料。經過實驗之後,假設公用電腦的 IP 是 192.168.1.100,由於 GoogleDesktop 只會 Listen 127.0.0.1 這個 loopback 的 IP,因此其他同網段(192.168.1.*) 的電腦無法連結到 GoogleDesktop 的搜尋網址。

碰到這種問題,最直接的想法就是搞一個 proxy server,讓 proxy server listen 192.168.1.100:4664,然後將所有連往 192.168.1.100:4664 的 packet 全部 forward 到 127.0.0.1:4664,如此一來應該就可以連到 GoogleDesktop 的搜尋網址。不過很遺憾的,經過實驗結果,會出現下面情形..

我初步猜想是 Browser 送過來的 HTTP header 中,GoogleDesktop 只接受 Host: 127.0.0.1:4664。所以馬上用 telnet 動手實驗了一下

[root@broso shell]# telnet 192.168.1.12 4664
Trying 192.168.1.12…
Connected to 192.168.1.12.
Escape character is '^]'.
GET /&s=Gcp35yLaRKNq-qK-MNo25UNQjO0 HTTP/1.1
Host: 192.168.1.12:4664
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Big5,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-control: no-cache, no-store, must-revalidate
Connection: close

<!–
Content-type: fix-mhtml

–><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>錄無效的要求</title>
<style>

後面省略

把上行的 Host: 192.168.1.12:4664 改為 Host: 127.0.0.1:4664 之後,結果真的就成功了,GoogleDesktop 就會回覆正確的搜尋頁面了..

[root@broso shell]# telnet 192.168.1.12 4664
Trying 192.168.1.12…
Connected to 192.168.1.12.
Escape character is '^]'.
GET /&s=Gcp35yLaRKNq-qK-MNo25UNQjO0 HTTP/1.1
Host: 127.0.0.1:4664
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Big5,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Proxy-Connection: keep-alive

HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-control: no-cache, no-store, must-revalidate
Connection: close

<!–
Content-type: fix-mhtml

–><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Google 桌面</title>

後面省略

知道 GoogleDesktop 原理之後,馬上動手來改寫個小型 Proxy Server。先前為了能夠從公司內部自由穿梭到外部 internet 世界,曾經寫了一個小型 SSL 加密的 Proxy Server(這個以後有機會再來寫),因此我的想法很簡單,是只要將中間穿梭的封包加以處理一下,碰到 Host: 192.168.1.100:4664 的 HTTP header,就置換為 Host: 127.0.0.1:4664。理論上應該就沒問題才是。

改完之後,馬上試驗一下,果然頁面很成功出現了。

不過再試下去,又發現一些問題…

咦,怎麼網址又被改為 http://localhost 了,看起來除了上行的 HTTP Header 要置換之外,連下行的 HTTP Header 及 HTML content 都得做一下過濾跟置換。所以又修改了一下程式,碰到 http://localhost 或是 http://127.0.0.1 都置換為 http://192.168.1.100:4664 。修改完畢後,馬上又試驗了一下… 

果然馬上就成功了。有興趣的人可以在這裡下載 GoogleDesktopProxy

簡單說明一下安裝方法:

  1. 將下載回來的 GoogleDesktopProxy.rar 解開放在同一個目錄下。
  2. 修改 start_proxy.cmd,將 "C:\Program Files\Java\jre1.6.0_03\bin\java" 改為你所使用的 JRE 或 JDK 路徑
  3. 修改 proxy.properties 中,我標為黃色字體的部分

參數 Host 指的是安裝 GoogleDesktop 那台電腦的 IP
參數 AllowList 指的是允許連接 GoogleDesktopProxy 的 IP 清單,所以沒列在裡面的 IP 都會被檔掉唷
參數 ReplaceLineFrom 跟 ReplaceLineTo 這兩個參數是成對的,GoogleDesktopProxy 會過濾所有經過的封包,是不是包含了 ReplaceLineFrom 所指定的字串,如果有,就置換為 ReplaceLineTo 所指定的字串。
所以 ReplaceLineFrom_1 請同樣修改為安裝 GoogleDesktop 那台電腦的 IP。ReplaceLineFrom_2 跟 ReplaceLineTo_3 亦同。


Host=192.168.1.12
Port=4664
TargetHost=127.0.0.1
TargetPort=4664
LeftSSL=0
RightSSL=0

AllowList=127.0.0.1,192.168.1.*,10.23.4.*
LogDir=log

SSLTimeOut=300
SSLKeystore=KEYSTORE.jks
SSLKeystorePassword=broso.net
SSLTruststore=TRUSTSTORE.jks
SSLTruststorePassword=broso.net

ReplaceLineFrom_1=Host: 192.168.1.12:4664
ReplaceLineTo_1=Host: 127.0.0.1:4664

ReplaceLineFrom_2=http://127.0.0.1:4664
ReplaceLineTo_2=http://192.168.1.12:4664

ReplaceLineFrom_3=http://localhost:4664
ReplaceLineTo_3=http://192.168.1.12:4664

之後如果有機會的話,再來說明一下上述 SSL 相關參數的使用方法。

有興趣研究原始碼的人,可以留言跟我索取。

VAIO S56 安裝 Vista Driver 的正確順序

兩年前 VAIO S56 買來時,原先所搭配的作業系統是 Windows XP Professional,而原廠附贈的還原光碟相當便利,使用還原光碟可將 S56 還原為原先出廠的狀態,使用者無須另外自行安裝各項裝置的驅動程式,S56 買來就是可以馬上上路開始工作。去年 Vista 推出後,試用 Vista 一陣子後,覺得 Vista 在 S56 上的執行效能,似乎也還蠻不錯的,於是便在 Yahoo 購入了 Vista Home Premium。使用正版的感覺的確不錯,尤其是微軟在 Windows Update 上增加許多檢核正版作業系統的限制之後,使用盜版軟體的確變得很麻煩,不用再到處找尋 crack,或是擔心 crack 中含有木馬之類的問題。其實支持正版的確也是資訊人所該做的事啦。

不過 S56 自行安裝 Vista 完畢之後,其實距離真正方便便利仍有一大段距離。怎麼說呢?除了部分驅動程式 Vista 仍未內建,所以裝置管理員中仍然會有三項裝置處於驚嘆號的狀態(這三個裝置分別是 Texas Instruments PCI7420 Integrated FlashMedia Controller、Sony Notebook Control Device 以及 Sony Programmable I/O Control Device),後二者可以透過 Windows Update 更新時可以自動找到驅動程式,而前者我試著使用 XP 的驅動程式來安裝,竟也正常無誤的安裝成功,所以驅裝置可以全部安裝完畢。不過其餘音效與顯示卡的部分,雖然 Vista 內建驅動程式,但音效的驅動程式重新開機之後,竟會顯示此驅動程式不相容於 Vista。這還真扯!也許是 Realtek 拿給 Vista 認證的驅動程式,微軟自己並沒驗證過 @@。

顯示卡雖然 Vista 也內建 NVidia GeForce GO 6400 顯示晶片的驅動程式,不過這內建的驅動程式在播放 DVD 電影,似乎動態的影像無法顯示出來。想當然爾,是去原廠找驅動程式,而在原廠網站選擇下載 GeForce GO 6400 驅動程式時,會告訴你請自行至 Sony 網站下載。但是回到 Sony 網站來找,竟發現 Sony 並未提供給 S56 Vista 版本的各項驅動程式 @@。找了很久,終於有人提到可以自行修改原 NVidia 廠驅動程式的 INF 安裝檔,加入 GeForece GO 6400 晶片的參數,使得S56 安裝時可以認得這是顯示卡的驅動程式。安裝完畢後,果然電影放起來就沒問題了。

其實還有一個最大的問題是,S56 鍵盤上一大堆的快捷鍵,像是 S1 / S2、Fn 功能鍵,藍芽與 Wireless LAN 切換的功能完全失效。S1 / S2 快捷鍵不能用就算了,但 Fn 功能鍵實在是很重要,像是螢幕亮度明暗、PageUp / PageDown / Home / End、LCD / 外接螢幕切換,這些功能沒了 Fn 功能鍵之後,也等於是廢了。在 Google 上找了很多文章,大抵都是提到要安裝 Sony Utility DLL 與 Sony Event Service 等軟體套件才能將這些功能鍵恢復。不過試了很久都沒試出來,最後等到我終於受不了沒有 Fn 鍵的日子,最後還是放棄了 Vista,重新回到 XP 的懷抱。

這兩天趁著春節過年沒事做,又把塵封已久的 Vista 挖出來想再來試試。重灌後沒想到問題還是一樣,不過這次有找到一篇文章提到如何將 VAIO SZ38 升級至 Windows Vista,原來 Sony 的各項驅動程式與軟體套鍵之間是有一個安裝的先後順序以及何時該重新開機步驟。我依樣畫葫蘆,比對SZ38 與 S56 之間的周邊裝置差異,調整了一下安裝順序,竟然就一次成功了,所有的快捷鍵與功能鍵馬上重獲新生。欣喜之餘,第一個想到的是就是趕緊記錄下來,免得下次又碰到一樣的情形。

下面就是各項驅動程式及軟體套件的安裝順序

  1. Sony Utilities DLL Update
  2. Sony Shared Library Update
  3. 重新開機
  4. VAIO Event Services Update
  5. Realtek High Definition Audio Driver
  6. VAIO Control Center
  7. Sony Utility Series
  8. VAIO Power Management
  9. Wireless Switching Utility
  10. Texas Instruments Driver for Memory StickR Controller Driver
  11. ALPS Pointing Device (Touchpad) Driver and and Control Utility
  12. NVidia_GeForce_100.40
  13. 重新開機
  14. Sony Utility Series update
  15. 重新開機

如果 VAIO 要從 XP 升級到 Vista 的話,可以參考看看。

 

 

2007 年璀璨的煙火

由於 101 招商已接近尾聲,往後將無架設施放煙火的足夠空間,因此今年的跨年煙火聽說是 101 施放煙火的最後一年。今年預計一樣是到二姐家去吃晚餐聊天,等待跨年時刻的到來。不過不同以往,今年將到公司的樓頂上去看跨年煙火,公司就在信義區附近,高度也夠高,預計應該是會有不錯的視野。

當天大約 10:50 就離開二姐家步行前往公司,公司雖然有車位,但是怕到時候散場人潮會讓交通打結,所以還是決定直接步行前往。走了大約 30 分鐘就到了,這時才發現,怎麼樓頂有這麼多不認識的人?看來一樓警衛並沒有很認真的檢核進出人員的身份。頂樓的護欄相當的高聳,而且已經爬滿了人。另外頂樓還有個水塔,水塔上的空間也還不小,於是還沒佔到位子的人都紛紛爬上了水塔頂端。水塔上的視野真的很讚,環顧附近四周,完全沒有比我們更高的建築物,於是就開始架設腳架。沒想到才稍微拍了一下,警衛就來趕人了。不過水塔頂端完全沒有護欄,其實具有相當的危險性,所以想想還是就乖乖下到頂樓平台來。最後還是在護欄圍牆上找了一個位子,還好圍牆夠厚,腳架還稍微可以放上去,不過就是得小心點兒就是了。

架好腳架後,就開始試拍,一方面是因為先調整各種參數來試拍,免得等會兒煙火開始施放才要來調整參數就來不及了。另一個原因是由於夜景與煙火的測光數據差異很大,因此最好是施放前後各拍一張,事後再來合成。煙火很準時的在 0 點整爆開,我調成了連拍模式快門狂按不放,不過 5D 的連拍張數實在是不夠多,最後就看到觀景窗中寫著 Busy,必須等資料都寫入 CF 卡後才能繼續拍。停停拍拍,188 秒的煙火很快就結束了,於是就回家做後製合成的工作。

合成的方法其實很簡單,用 PhotoShop 大約四到五個步驟就可以完成。

1.新開一個檔案,然後將要合成的兩張圖片做成兩張圖層放入。

 

2.點選 "圖層",選擇有煙火的那張圖層,然後調整參數為 "變亮"。

3.最後調整一下兩張圖,讓圖中的元素可以接合得比較完整。

4.在選擇 "圖層 –> 影像平面化",就完成了。

下面就是後製的幾張圖片:

 

Updated:(2008/01/03)
用 GIF 弄了一張煙火連續爆發的動畫

Vigor 2910 Dual WAN 的另類用法

Vigor 2910 產品特色其中之一就是它具有 Dual WAN port,也就是說它可以同時接上兩條 ISP 對外的線路,例如:第一個 WAN port 接的是 CHT  ADSL 線路,第二個 WAN port 則可以接 Cable Modem 的寬頻線路。同時接兩條對外線路,除了頻寬倍增之外,另一個考量點就是備援線路。如果一條線路故障了,另一條線路可以馬上發揮作用。如果兩條線路都正常時,Vigor 2910 也具有負載平衡的功能,可以自己決定路由要走什麼線路出去。

Vigor 2910 Dual WAN Load Balance

我自己家裡只接了一條 12M/1M 的 ADSL 線路,本錢並沒粗到可以再多牽一條 ADSL 線,於是第二個 WAN port 自從買來之後就一直是當作 local port 來使用 (W2 沒接對外線路時,就會自動轉成 LAN port) 。直到最近看到有人這麼惡搞([新知]吼~Vigor 2910真是中階頻寬分享器中的首選啊~),我依樣畫葫蘆,沒想到竟然還真的接通了。

一般 ISP ADSL 線路都是配發 8 個動態 IP,或者是 1 個固定 IP + 7 個動態 IP。所以其實同時用同一組帳號密碼撥接,的確是都可以撥通取得 IP。所以我就調整了一下家裡網路的拓譜,如下:

拓譜

再將第二個 WAN port 設定為 PPPoE 取得動態 IP,如下:

Vigor 2910 Dual WAN setting

設定存檔後重新 Reset Vigor 2910,沒多久兩個 IP 就都正常取得。

Connection Status

不過想當然爾,降子並不會增加任何頻寬,只是善用 Vigor 的功能,同時惡搞你的 ISP 而已。

Syslog network traffic of Vigor 2910

從 Vigor 2910 剛買來就知道可以將網路流量 log 透過 Broso syslog 記錄下來,方式很簡單,在管理介面系統管理中將 syslogd server ip 設定上去即可。

設定上去後,/var/log/messages 果然就跑出來很多 2910 的 log。


[root@broso log]# tail -200f messages
Dec 7 22:53:31 my.router Vigor: Open port: 220.132.143.85:47549 -> 192.168.1.14:80 (TCP) Web
Dec 7 22:53:31 my.router Vigor: 459:44:35.110 wan->lan @S:R=13:1 p 220.132.143.85,47549 -> 192.168.1.14,www PR tcp len 20 48 -S 94932610 0 65535
Dec 7 22:53:35 my.router Vigor: WAN1 PPPoE ==> Protocol:LCP(c021) EchoReq Identifier:0x18Magic Number: 0x0 00 00 ##
Dec 7 22:53:36 my.router Vigor: WAN1 PPPoE <== Protocol:LCP(c021) EchoRep Identifier:0x18Magic Number: 0x1360 9b 98 ##
Dec 7 22:53:39 my.router Vigor: WAN1 PPPoE ==> Protocol:LCP(c021) EchoReq Identifier:0x19Magic Number: 0x0 00 00 ##
Dec 7 22:53:40 my.router Vigor: WAN1 PPPoE <== Protocol:LCP(c021) EchoRep Identifier:0x19Magic Number: 0x1360 9b 98 ##
Dec 7 22:53:43 my.router Vigor: WAN1 PPPoE ==> Protocol:LCP(c021) EchoReq Identifier:0x1AMagic Number: 0x0 00 00 ##
Dec 7 22:53:44 my.router Vigor: WAN1 PPPoE <== Protocol:LCP(c021) EchoRep Identifier:0x1AMagic Number: 0x1360 9b 98 ##
Dec 7 22:53:46 my.router Vigor: Local User: 192.168.1.14:80 -> 220.132.143.85:47549 (TCP) close connection
Dec 7 22:53:46 my.router Vigor: Local User: 192.168.1.12:1276 -> 220.132.143.85:80 (TCP) close connection
Dec 7 22:53:47 my.router Vigor: WAN1 PPPoE ==> Protocol:LCP(c021) EchoReq Identifier:0x1BMagic Number: 0x0 00 00 ##
Dec 7 22:53:47 my.router Vigor: WAN1 PPPoE <== Protocol:LCP(c021) EchoRep Identifier:0x1BMagic Number: 0x1360 9b 98 ##

但隨著時間越來越久,/var/log/messages 中紀錄太多了網路的 log,反而 messages 中該被注意的一些訊息被淹沒在茫茫 log 大海中,因此該想個辦法來將 log 分流到不同的檔案中。

在股溝中查了一下,得知 Vigor 系列的 router 基本上提供了下列的 device 來區分 log

  • local0: Firewall-Log
  • local1: VPN-Log
  • local2: User-Access-Log
  • local3: Call-Log
  • local4: WAN-Log
  • local5: ADSL Status & Traffic Statistics

於是便修改了 /etc/syslog.conf 如下


# Save Vigot 2910 Router network log

local0.*                                                /var/log/vigor/firewall.log

local1.*                                                /var/log/vigor/vpn.log

local2.*                                                /var/log/vigor/user-access.log

local3.*                                                /var/log/vigor/call.log

local4.*                                                /var/log/vigor/wan.log

local5.*                                                /var/log/vigor/adsl.log

重起了 syslogd 後,發現怎麼 /var/log/messaes 還是有 2910 的 log,再仔細察看了一下 syslog.conf,原來是第一行忘了將 local0~5 的 log,從 /var/log/messages 中濾除。修改如下:


*.info;mail.none;authpriv.none;cron.none;local0.none;local1.none;local2.none;local3.none;local4.none; local5.none /var/log/messages

重起 syslogd 後,果然 /var/log/messages 就已經不再出現 Vigor router 的 log 了。

Speeding up your web site

網站的回應速度快慢一直是攸關於使用者會不會停留下來繼續瀏覽最主要的關鍵。最近工作上也面臨到同樣的問題,網站回應速度不佳,客戶抱怨導致客群流失。除了提昇硬體容量跟頻寬這種暴力辦法之外(上級長官已經指示了,沒多餘預算可做容量提升),最後還是得回頭來看看系統面與 AP 面是否還有調整的空間。

Best Practices for Speeding Up Your Web Site 是 Yahoo 做效能調校時整理出來的 14 項 Rule,涵蓋了系統面與網頁程式開發時需注意的事項。各個 Rule 的細節這兒就不提了,有興趣的可自行至上述網址研讀即可。我僅針對 Rule 3 “Add an Expires Header” 拿來套用在 Broso Web 的設定,套用的結果的確效果顯著。

Broso 上的應用不外乎是部落格與相簿,所以網站上大部分都是靜態的圖檔、JavaScript、CSS。在沒有設定 Expires Header 之前,即使靜態圖檔內容並未改變,Browser 仍然會發個 Request 來 Broso Web 問問圖檔是否有更新。由於圖檔並未更新,於是 Apache 便會回覆 HTTP Result Code 304 (Not Modified),因此 Browser 便繼續使用 local cache 上的原圖檔來顯示。下面的資料是從 Fiddler 所節錄出來的:

當網頁中的小圖檔眾多時,Browser 所發出詢問圖檔是否更新的 Request 以及 Web Server 所回覆的 304 (Not Modified) Response,將形成嚴重的 overhead。如果確定大部分的靜態資料都是很久才會做更新,便可以針對這類型的資料設定 Expires Header。

HTTP 協定中 Expires 這個 header tag,是由 Web Server 回覆給 Browser。舉例如下:


HTTP/1.1 200 OK
Date: Sun, 25 Nov 2007 15:58:58 GMT
Server: Apache/2.0.61 (Unix) mod_watch/4.3
Last-Modified: Sat, 17 Nov 2007 04:16:21 GMT
ETag: “1e6f13-216e-2d712f40”
Accept-Ranges: bytes
Content-Length: 8558
Cache-Control: max-age=259200
Expires: Wed, 28 Nov 2007 15:58:58 GMT
Content-Type: image/jpeg

Expires 欄位指示這個靜態圖檔一直到 2007/11/28 15:58:58 以後才會過期,因此 Browser 在這個時間之前都不會再發出任何 Request 到 Web Server 來詢問圖檔是否更新,直接使用 local cache 中的圖檔來顯示,所以所有的 304 (Not Modified) Response 都可以省了,便可減輕 Web Server loading 與頻寬,Browser 的顯示速度也會更迅速。

在 Apache 2.0 要啟用 Expires Header,需使用 mod_expires module。預設設定此模組並不會啟用,需重新編譯,並透過 configure 設定需加入此模組,Apache2 才會具有處理 Expires Header 的能力。

重新編譯 Apache2 的方法可以參考先前的文章 – Apache Basic / Digest Realm Authentication,這次我重新編譯 Apache 時使用的 configure 參數如下:

[root@broso httpd-2.0.61]# ./configure –prefix=/usr/local/apache2 –enable-auth-digest –enable-deflate –enable-expires

編譯完畢後,apache2 就具有處理 Expires Header 的能力了,此時便可進行 httpd.conf 的設定了(mod_expires 的詳細語法可參考 Apache Module mod_expires),針對需要設定 Expires Header 的文件種類與預計過期的時間進行設定。


# mod_expire 針對下列 MIME type 設定 Expires header
ExpiresActive On
ExpiresByType image/jpeg “access plus 3 days”
ExpiresByType image/gif “access plus 3 days”
ExpiresByType image/png “access plus 5 minutes”

ExpiresByType image/x-icon “access plus 4 weeks”
ExpiresByType application/x-javascript “access plus 2 weeks”
ExpiresByType text/css “access plus 2 weeks”
ExpiresByType application/x-shockwave-flash “access plus 4 weeks”

設定完畢,重新啟動 Apache2 即可。

再用 Fiddler 來驗證一下 Expires Header 有沒有生效。首先記得先清除 Browser cache,再瀏覽相簿首頁。隨便找一個圖檔來看看 Expires Header 是否已經出現?

再次瀏覽相簿首頁,看看第二次 Browser 是否還會發出 Request 來詢問圖檔是否更新?

敗 Expires 之賜,Browser 已經知道圖檔尚未過期,因此便只會發出 jsp 的 Request 了。

重回 21 歲的年代

上上禮拜跟同事團購了一台 Wii 回來之後,就每天在家裡狂練網球,準備部門 11 月中的 Wii 運動大賽。倒是這個體適能測驗,一天限制只能測一次,第一次測就 34 歲,還蠻符合年紀的。沒想到剛剛心血來潮測試一次,竟然讓我重回了 21 歲的年代!趕快拍照留起來紀念 :p

Wii Fitness