2004年6月29日

Jabber 伺服器設定

設定 Jabberd 伺服器

  • 安裝 jabberd 1.4.3 版
emerge -v jabberd
  • 編輯 /etc/jabber/multiple.xml,將
<host>
  <jabberd:cmdline flag="h">localhost</jabberd:cmdline>
</host>
改為
<host>
  <jabberd:cmdline flag="h">Jabber Server 的 FQDN</jabberd:cmdline>
</host>
  • 打開接受使用者註冊的設定
<!-- commented out so no one can register!!! -->
  <register notify="yes">
    <instructions>
      Choose a username and password to register with this server.
    </instructions>
    <name/>
    <email/>
  </register>
  • 設定 jabberd 載入註冊支援模組
<!-- commented out so no one can register!!! -->
  <mod_register>/usr/lib/jabberd/jsm.so</mod_register>
  • 在 service id="c2s" 中填入欲監聽的 ip 位址,若要變更 port 號也在此修改。若要啟用 ssl 連線的話,則開放 <ssl...></ssl> 設定
<service id="c2s">
    <!-- .... -->
      <!--
      Use these to listen on particular addresses and/or ports.
      Example: <ip port="5222">127.0.0.1</ip>
      Default is to listen on port 5222 on every interface.
      Remove the <ip/> section to disable non-ssl client connections.
      <ip port="5222"/>
      -->
      <ip port="5190">xx.xx.xx.xx</ip>

<!-- The <ssl/> tag acts pretty much like the <ip/> tag, except it defines that SSL is to be used on the ports and IP addresses specified. You must specify an IP address here, or the connections will fail. <ssl port='5223'>127.0.0.1</ssl> <ssl port='5224'>192.168.1.100</ssl> --> </pthcsock> </service>

測試 jabberd 是否正常

  • 執行以下命令啟動 jabber server
jabberd -c /etc/jabber/multiple.xml -D
看到這行訊息表示 jabberd 啟動了
[notice] (-internal): initializing server
  • 使用 telnet 登入 jabber server
telnet <Jabber Server 的 FQDN> 5190 # 此為於 service is='c2s' 中指定的 port number
應該要回應以下訊息,如未回應請檢查 jabber server 是否正確啟動
Trying xx.xx.xx.xx
Connected to <Jabber Server 的 FQDN>
Escape character is '^]'.
  • 送出以下命令給 Jabber Server
<stream:stream
  to='Jabber Server 的 FQDN'
  xmlns='jabber:client'
  xmlns:stream='http://etherx.jabber.org/streams'>
  • Server 回應下列訊息表示接受連線
<stream:stream xmlns:stream='http://etherx.jabber.org/streams' 
                         id='40E04E48' xmlns='jabber:client' 
                       from='jabber.jspbb.net'>
  • 送出要求註冊的訊息
<iq id='reg1' type='get'>
  <query xmlns='jabber:iq:register'/>
</iq>
  • 若回應如下訊息即表示設定完成,可以開始安裝其他 IM 的轉接器了
<iq id='reg1' type='result'>
  <query xmlns='jabber:iq:register'><password/><password/>
        <instructions>
          Choose a username and password to register with this server.
        </instructions>
        <name/>
        <email/>
      <username/></query>
</iq>

Gentoo 中文化相關文件

感謝 GOT 提供的各項中文說明…
  1. Gentoo中文化指南
  2. Gentoo 台灣中文 Ebuild 使用指南
  3. Gentoo Samba3/CUPS/Clam AV HOWTO

心智圖

星期天買了一本心智圖的基礎手冊,很薄,價格也不貴,才 1xx 元。

由於習慣於不求甚解,所以看了手冊前面的十來個範例後就大概知道心智圖的用法,並且也嘗試使用這種資料匯整工具。

我是把心智圖當成筆記在用的,但是和循序、階層式筆記不同。

我認為階層式筆記過於死板、文字過多、很難立即的將重點擺在相關連的地方,雖然可以使用線條來表示某筆記錄真正所在的位置,但這麼做版面就顯的凌亂。階層式筆記可以整理的很工整,相對的也會給人死板板的感覺,對,就是那種讓人想睡覺的感覺。另外通常這種筆記的句子較長,相對難以記憶。

心智圖一開始就不求工整,相對的就可以應用到整個頁面的空間。記錄上講求使用關鍵字,因此很容易用最少的字數登載最多的訊息。不過也常常因為資訊太多,造成不知道怎麼和他人交換所整理出來的圖形,即使是使用 MindManager 等這類軟體畫圖也一樣。

MindManager 一套要 US$299 ,好貴… :(

2004年6月27日

重大抉擇

現在我決定做出這個重大的抉擇… 換掉 XFree86-4.3.0 改為 Xorg...

Why ?!

因為 Gentoo of Taiwan 提供的 Gentoo 中文化方案使用的是這個 X11 環境… :( 若是安裝失敗的話… 哈哈哈...

我也不敢想像… :(

※後註:後來沒有改,但是增加了一堆中文字型… :D 現在桌面變成以下德性了!

FlatDesktop4

2004年6月25日

驢耳朵大集合

布拉格的春天 看到一些被聽錯的歌詞記錄,讓我差點在辨公室暴笑失聲。

去看看如何?

2004年6月23日

聽說朋友去買了套射擊遊戲

聽說朋友去買了套射擊遊戲,立刻讓我滿心期待星期五的到來,並且留下了這首歌詞(配樂:__我現在要出征__ )...

歌名:我一定要破關                    詞:Ada

我一定要破關… 我一定要破關… 我若是破不了關我總會繼續接關… 當笨達不去買Game我怎會陷下去… 但這套Game總是需要我來破關… 所以我要破關… 就因為這緣故… 玩Game… 玩Game… 破關....

還有兩天就是星期五了… :D

吃完粽子了

中國三大節慶中,端午節是我第二喜歡的節日,因為比起月餅而言,我比較喜歡熱熱的粽子… :D

到台北五年多,到今天為止有四年吃到粽子:

  1. 第二年:端午節前天下班時被朋友騙到他工作的地方去,然後他帶我到新東陽商店(那時他在新東陽)挑了三個粽子丟我拿回家吃。比較慘的是… 那一年我租的房間並沒有附上冰箱,結果一個晚上就把三個粽子(其中一個還特別大顆… -.-)啃掉,然後隔天腸胃不適.... -.-
  2. 第三年:同事端午節回南部時,帶了一串南方粽北上到公司分享,好吃!
  3. 第四年:這跟同事拗來的,是北方粽。
  4. 第五年:這一年那個新東陽的朋友早就離開新東陽了,可是不巧他媽媽為了去日本玩就先把粽子包好、拜完後,在去日本的前一天拎了一串到台北來交給他。這傢伙也很夠義氣,強迫推銷、分享他媽媽的愛給我,可是正當感動之餘卻聽到一句:星期二來幫我搬房子.... -.-! 好吧,不過星期二要在家中發呆,星期五去幫一下好了...
對了,你應該猜到第一喜歡的節日是啥了,最喜歡的原因當然不是因為有啥好吃的東西,只是單純因為年終有錢可以領的緣故而以… XD

2004年6月20日

計算檔案中重覆的行數

因為發現負責提供服務的系統中,似乎有人在暴力測試用戶的資料,好在之前有對系統使用狀況進行 Log 登載,所以嘗試實施統計那些作業編號有人在惡搞。

首先,Linux 上的確有計算重覆行數的指令:uniq -c ,但這個指令有所限制:只能計算 連續相同 的部份。

ada@www tmp $ uniq --help
用法:uniq [選項]… [輸入 [輸出]]
將 <輸入> (預設為標準輸入) 的資料中每行連續相同的資料捨棄至只剩一行,
並在 <輸出> 顯示結果 (預設會在標準輸出顯示結果)。
長選項必須用的引數在使用短選項時也是必須的。
  -c, --count           每行前加上出現次數
  -d, --repeated        只印出重覆的資料
  -D, --all-repeated[=分隔方式]
                        印出所有重覆的資料
                        分隔方式={none(預設)、prepend、separate}
                        會使用空行來分隔資料。
  -f, --skip-fields=N   不比較最初的 N 個欄位
  -i, --ignore-case     比較時忽略大小寫
  -s, --skip-chars=N    不比較最初的 N 個字元
  -u, --unique          只印出沒有重覆的資料
  -w, --check-chars=N   每行比較不多於 N 個字元
      --help     顯示此求助說明並離開
      --version  顯示版本資訊並離開

一個欄位是由一組空白字元加上一組非空白的字元組成的。 當同時指定略過欄位和略過字元不作比較時,會先略過欄位。

請向 <bug-[email protected]> 回報錯誤。

即然 uniq -c 必須要連續相同的資料行才視作重覆,那麼只要排序一下不就好了?這個指令是 sort !

ada@www tmp $ sort --help
用法:sort [選項]… [檔案]…
將所有 <檔案> 內容合併和排序,並在標準輸出顯示結果。

排序選項:

長選項必須用的引數在使用短選項時也是必須的。 -b, --ignore-leading-blanks 忽略每行開始的空白字元 -d, --dictionary-order 只考慮空白字元、英文字和數字 -f, --ignore-case 排序前先將小寫字元轉換為大寫 -g, --general-numeric-sort 以普通數值的方式作比較 -i, --ignore-nonprinting 只考慮可列印的字元 -M, --month-sort 比較月份: (不明) <‘JAN’< … <‘DEC’ -n, --numeric-sort 將字串轉換為數值來作比較 -r, --reverse 以相反的次序排列

其它選項:

-c, --check 只檢查輸入資料是否排列好,不會真正將資料排序 -k, --key=位置1[,位置2] 排序索引由 <位置1> 的欄位開始,在 <位置2> 的 欄位結束 (1 表示第一個欄位) -m, --merge 只合併已經排序的檔案;不分別排列每個檔案的內容 -o, --output=FILE 將結果寫入 <檔案> 而並非在標準輸出顯示 -s, --stable 不進行最後的整行比較排序 -S, --buffer-size=大小 指定記憶緩衝區的 <大小> -t, --field-separator=SEP use SEP instead of non-blank to blank transition -T, --temporary-directory=DIR use DIR for temporaries, not $TMPDIR or /tmp multiple options specify multiple directories -u, --unique with -c: check for strict ordering otherwise: output only the first of an equal run -z, --zero-terminated 以位元組 0 而非 newline 字元作為每行的結束字元 --help 顯示此求助說明並離開 --version 顯示版本資訊並離開

<位置> 的格式是 F[.C][OPTS],其中 F 是欄位編號,C 是該欄的字元位置。OPTS 是一個或多個單字元的排序選項,這些專用的選項會取代該排序索引的一般排序 選項。如果沒有指定排序索引,則以整行的內容作為索引。

<大小> 可以加上如下的單位: %% = 1%% 記憶體,b=1,K=1024 (預設值),還有 M、G、T、P、E、Z、Y 如此類推。

如果沒有指定 <檔案> 或 <檔案> 是 -,則由標準輸入讀取資料。

*** 警告 *** 和語系有關的環境變數會影響排序結果。 如果要以位元組數值作為排列次序,請設定環境變數 LC_ALL=C。

請向 <bug-[email protected]> 回報錯誤。

所以結論很簡單了,假設有一文字檔內容如下:

ada@www tmp $ cat text.txt
11111
22222
33333
44444
22222
44444
11111
11111
33333
55555
44444

若要計算重覆的資料行數,可以下指令:

ada@www tmp $ sort text.txt | uniq -c
      3 11111
      2 22222
      2 33333
      3 44444
      1 55555

透過 Linux 上即有工具的簡單組合,可以減損眼力的消耗和時間的浪費,提供各位做一個參考!

史瑞克 2

今天去看了 史瑞克2 了,感想如下:
  1. 微風廣場的國賓戲院好冷啊… :( 雖然是下午天氣正熱的時候,但是仍然感受到極低溫的振撼。我在此提出抗議:我是來看 史瑞克2 ,不是來看 明天過後 ,不需要把室溫搞的那麼低來企圖讓觀眾有身歷其境的感受啦...
  2. 史瑞克2 開了不少玩笑,不知道那邊有清單可以彙整所有笑點的來源?
  3. 史瑞克 還有沒有第三集?有可能喔… 神奇教母的兒子會不會為了報仇來找史瑞克呢?天曉得… :p

關於北市健保費爭議

其實… 我現在不想管誰是誰非,我只想知道如果北市府不還錢,健保局不放棄催討時,我這個非設籍台北市的外來勞工的健保福利是否可以繼續保持?

幹嘛這麼想?

當然會這麼想囉,因為屬於我的那一份健保保費還沒繳完整啊.... 所以台北市政府現在的處理方式應該朝向修改健保法,確認繳費計算基礎後,再回頭和健保局吵,否則一旦我的健保卡失效時,你認為我該怪誰?

話說回來,北市有多少外來勞工,在幫台北市生產、建設?

使用 SNMP 查詢 ADSL Router (ATU-R) 狀態


使用 SNMP 查詢 ADSL Router (ATU-R) 狀態

補充說明:
  1. 一個使用 SNMP 查詢網路設備狀態的範例
  2. 與 ADSL 相關的 MIB 參考:ADSL-LINE-MIB
我目前使用的網路是由 HiNET 所提供,硬體設施則是使用由中華電信出借的 Alcatel SPEEDTOUCH 340 這顆 ATU-R。
由於在系統中裝了 snmpd 服務,加上知道 Alcatel SPEEDTOUCH 340 也有提供 SNMP 代理服務 (必須使用 telnet 設定方式才能看到,若用 Web 設定界面是看不到的 ),所以就試著透過 SNMP 來看看這顆 ATU-R 有啥特殊資訊。

確認主機與 ATU-R 同網段

除非使用的是固定多 IP 制的連線模式,否則 ATU-R 會使用 bridge 模式來代轉使用者的網路連線。這通常給使用者一個 ATU-R 本身沒有 IP 的假象。
只要是網路設備必然會有一個 IP 來代表( HUB沒有就是了 :p),ATU-R 也不例外。它的預設 IP 是 192.168.1.1,只要系統能有一個 IP 與 ATU-R 的預設 IP 同一網段時即可存取 ATU-R 上的資訊,至少我們可以透過 telnet , web 或者是 snmp 方式向 ATU-R 進行存取作業。
我的系統中內建有 5 個網路界面,因此指定其中一個網路界面的 IP 為 192.168.1.2,當然你也可以透過 alias IP 的方式讓同一張網卡擁有兩個以上的 IP ,設定完畢後先 ping ping 看是否可以連上 ATU-R。

確認已安裝 snmp utility

在 Linux 環境下,只要安裝 net-snmp 套件後即可;若是 Windows 系統則請自己看著辦。
Gentoo Linux 中可以使用以下方式檢查是否安裝 net-snmp 套件。

www tmp # emerge -s net-snmp
Searching…
[ Results for search key : net-snmp ]
[ Applications found : 2 ]
* dev-perl/Net-SNMP Latest version available: 4.1.2 Latest version installed: [ Not Installed ] Size of downloaded files: 70 kB Homepage: http://www.cpan.org/modules/by-module/Net/Net-SNMP-4.1.2.readme Description: A SNMP Perl Module License: Artistic
* net-analyzer/net-snmp Latest version available: 5.0.9-r1 Latest version installed: 5.0.9-r1 Size of downloaded files: 2,290 kB Homepage: http://net-snmp.sourceforge.net/ Description: Software for generating and retrieving SNMP data. License: as-is

開始查詢 ATU-R 系統資訊


www tmp # snmpwalk 192.168.1.1 -c public -v 1 1.3.6.1.2.1.1
SNMPv2-MIB::sysDescr.0 = STRING: Alcatel SPEEDTOUCH 340 version 7.1.0.31 (patch) (25 April 2001) T60L280.01/H2.3.1.5.01/1.4.8
Copyright (c) 2001
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.4684
SNMPv2-MIB::sysUpTime.0 = Timeticks: (83557662) 9 days, 16:06:16.62
SNMPv2-MIB::sysContact.0 = STRING:
SNMPv2-MIB::sysName.0 = STRING:
SNMPv2-MIB::sysLocation.0 = STRING:
SNMPv2-MIB::sysServices.0 = INTEGER: 6
從以上可知 ATU-R 的產品名稱、版本編號、開機時間等,其他像連絡人資訊、系統名稱、系統位置則沒有設定。

查詢 ATU-R 網路設備資訊

www tmp # snmpwalk 192.168.1.1 -c public -v 1 1.3.6.1.2.1.2
資料很多,所以可以改查詢網路設備的型別。
www tmp # snmpwalk 192.168.1.1 -c public -v 1 1.3.6.1.2.1.2.2.1.2
IF-MIB::ifType.1 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.2 = INTEGER: ppp(23)
IF-MIB::ifType.3 = INTEGER: ppp(23)
IF-MIB::ifType.4 = INTEGER: ppp(23)
IF-MIB::ifType.5 = INTEGER: ppp(23)
IF-MIB::ifType.6 = INTEGER: ppp(23)
IF-MIB::ifType.7 = INTEGER: ppp(23)
IF-MIB::ifType.8 = INTEGER: ppp(23)
IF-MIB::ifType.9 = INTEGER: ppp(23)
IF-MIB::ifType.10 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.11 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.12 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.13 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.14 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.15 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.16 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.17 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.18 = INTEGER: other(1)
IF-MIB::ifType.19 = INTEGER: adsl(94)
IF-MIB::ifType.20 = INTEGER: fast(125)
IF-MIB::ifType.21 = INTEGER: interleave(124)
不過因為數字型式的 OID 難以記憶,通常會使用文字式代名。
www tmp # snmpwalk 192.168.1.1 -c public -v 1 interfaces.ifTable.ifEntry.ifType
IF-MIB::ifType.1 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.2 = INTEGER: ppp(23)
IF-MIB::ifType.3 = INTEGER: ppp(23)
IF-MIB::ifType.4 = INTEGER: ppp(23)
IF-MIB::ifType.5 = INTEGER: ppp(23)
IF-MIB::ifType.6 = INTEGER: ppp(23)
IF-MIB::ifType.7 = INTEGER: ppp(23)
IF-MIB::ifType.8 = INTEGER: ppp(23)
IF-MIB::ifType.9 = INTEGER: ppp(23)
IF-MIB::ifType.10 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.11 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.12 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.13 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.14 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.15 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.16 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.17 = INTEGER: ethernetCsmacd(6)
IF-MIB::ifType.18 = INTEGER: other(1)
IF-MIB::ifType.19 = INTEGER: adsl(94)
IF-MIB::ifType.20 = INTEGER: fast(125)
IF-MIB::ifType.21 = INTEGER: interleave(124)
配合每一個界面的描述,大致上可以得知這 21 個界面的用途。
www tmp # snmpwalk 192.168.1.1 -c public -v 1 interfaces.ifTable.ifEntry.ifDescr
IF-MIB::ifDescr.1 = STRING: ethernet
IF-MIB::ifDescr.2 = STRING: ppp channel 1
IF-MIB::ifDescr.3 = STRING: ppp channel 2
IF-MIB::ifDescr.4 = STRING: ppp channel 3
IF-MIB::ifDescr.5 = STRING: ppp channel 4
IF-MIB::ifDescr.6 = STRING: ppp channel 5
IF-MIB::ifDescr.7 = STRING: ppp channel 6
IF-MIB::ifDescr.8 = STRING: ppp channel 7
IF-MIB::ifDescr.9 = STRING: ppp channel 8
IF-MIB::ifDescr.10 = STRING: ppp1
IF-MIB::ifDescr.11 = STRING: ppp2
IF-MIB::ifDescr.12 = STRING: ppp3
IF-MIB::ifDescr.13 = STRING: ppp4
IF-MIB::ifDescr.14 = STRING: ppp5
IF-MIB::ifDescr.15 = STRING: ppp6
IF-MIB::ifDescr.16 = STRING: ppp7
IF-MIB::ifDescr.17 = STRING: ppp8
IF-MIB::ifDescr.18 = STRING: bridge
IF-MIB::ifDescr.19 = STRING: ADSL physical interface
IF-MIB::ifDescr.20 = STRING: ADSL fast channel
IF-MIB::ifDescr.21 = STRING: ADSL interleaved channel
比對過 ifType 和 ifDescr 後,可以判定第 1 個網路界面是 ethernet,也就是接到內部網路的那個界面;第 18 個網路界面是 bridge, 若使用 bridge 模式時會在這個網路界面上產生 I/O;第 19 個網路界面是 adsl, 也就是 ADSL 實體線路,當線路異常時會在這個界面上產生反應。

範例:檢查網路是否斷線

透過 interfaces.ifTable.ifEntry.ifOperStatus.xx 可以查詢指定界面的連線狀態,如:

www tmp # snmpwalk 192.168.1.1 -c public -v 1 interfaces.ifTable.ifEntry.ifOperStatus.1
IF-MIB::ifOperStatus.1 = INTEGER: up(1)
www tmp # snmpwalk 192.168.1.1 -c public -v 1 interfaces.ifTable.ifEntry.ifOperStatus.18
IF-MIB::ifOperStatus.18 = INTEGER: up(1)
www tmp # snmpwalk 192.168.1.1 -c public -v 1 interfaces.ifTable.ifEntry.ifOperStatus.19
IF-MIB::ifOperStatus.19 = INTEGER: up(1)

查詢某個 OID 的意義

當查詢某個裝置的資訊時,發現有無法明確辨識的 SNMP 標籤時其實可以透過 net-snmp 套件所提供的轉譯工具,將標籤轉成較為明確的說明,如 ATU-R 中有這個一個標籤 IF-MIB::ifLastChange,他的實際意義可以這樣查詢:

www tmp # snmptranslate -Td -OS IF-MIB::ifLastChange
IF-MIB::ifLastChange
ifLastChange OBJECT-TYPE
  -- FROM       IF-MIB, RFC1213-MIB
  SYNTAX        TimeTicks
  MAX-ACCESS    read-only
  STATUS        current
  DESCRIPTION   "The value of sysUpTime at the time the interface entered
            its current operational state.  If the current state was
            entered prior to the last re-initialization of the local
            network management subsystem, then this object contains a
            zero value." 
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) interfaces(2) ifTable(2) ifEntry(1) 9 }
也可以查詢 IF-MIB::ifOperStatus 的完整說明。
www tmp # snmptranslate -Td -OS IF-MIB::ifOperStatus
IF-MIB::ifOperStatus
ifOperStatus OBJECT-TYPE
  -- FROM       IF-MIB, RFC1213-MIB
  SYNTAX        INTEGER { up(1), down(2), testing(3), unknown(4), dormant(5), notPresent(6), lowerLayerDown(7) }
  MAX-ACCESS    read-only
  STATUS        current
  DESCRIPTION   "The current operational state of the interface.  The
            testing(3) state indicates that no operational packets can
            be passed.  If ifAdminStatus is down(2) then ifOperStatus
            should be down(2).  If ifAdminStatus is changed to up(1)
            then ifOperStatus should change to up(1) if the interface is
            ready to transmit and receive network traffic; it should
            change to dormant(5) if the interface is waiting for
            external actions (such as a serial line waiting for an
            incoming connection); it should remain in the down(2) state
            if and only if there is a fault that prevents it from going
            to the up(1) state; it should remain in the notPresent(6)
            state if the interface has missing (typically, hardware)
            components."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) interfaces(2) ifTable(2) ifEntry(1) 8 }

應用

當我們知道如何查詢指定硬體的 SNMP 資訊後,即可加以整理作為系統效能的參考依據或是錯誤警示等,或者透過 MRTG 等其他工具將數據資訊以圖示方式顯示出來。這部份就是個人的創意問題了。

Cygwin 中文化

目前網路上找的的 Cygwin 中文化說明對於新版的 Cygwin 似乎不甚正確,害我之前試了半天都失敗。這次在安裝 Cygwin 時,其 Cygwin DLL 的版號是 1.5.10-1 ,如果一直無法讓 Cygwin 顯示中文字的話,也許可以照以下方式試試看。

初始化 Cygwin

當第一次執行 cygwin 時,多半會出現以下的訊息要求建立使用者:

Your group is currently "mkpasswd".  This indicates that
the /etc/passwd (and possibly /etc/group) files should be rebuilt.
See the man pages for mkpasswd and mkgroup then, for example, run
mkpasswd -l [-d] > /etc/passwd
mkgroup  -l [-d] > /etc/group
Note that the -d switch is necessary for domain users.
此時使用以下指令完成使用者建置動作:
mkpasswd -l > /etc/passwd
mkgroup -l > /etc/group
  • 若使用者有加入網域中,則要加上 -d 選項,如下例:
mkpasswd -l -d > /etc/passwd
mkgroup -l -d > /etc/group

完成上述指令後,請先離開 Cygwin 環境再重新進入,此時應該會看到 Cygwin 開始建立使用者的基本設定檔:

Copying skeleton files.
These files are for the user to personalise
their cygwin experience.

These will never be overwritten.

`./.bashrc' -> `/home/bill//.bashrc' `./.bash_profile' -> `/home/bill//.bash_profile' `./.inputrc' -> `/home/bill//.inputrc'

完成中文化相關設定

當完成上述設定後,Cygwin 才會建立使用者的基本設定,此時才能依照網路上所找到的方式完成 Cygwin 中文化設定。

1. 編輯 ~/.inputrc ,加入以下設定:
set meta-flag on
set input-meta on
set convert-meta off
set output-meta on

2. 編輯 ~/.bash_profile ,加入以下設定:

alias ls='ls --show-control-chars'

2004年6月18日

Thunderbird 0.7 正式推出

嘩… 前幾天才剛釋出 Firefox 0.9 ,沒想到才幾天而以連 ThunderBird 0.7 也更著釋出,真是令人欣喜。您可以到Mozilla 正體中文網站去下載中文版本,也可以到Mozilla Thunderbird去瞭解一些相關的特色。

簡單介紹一下,ThunderBird 是一套獨立的郵件客戶端軟體,也可以用來讀取新聞伺服器上的新聞資訊,功能上差不多和微軟的 Outlook Express 相當。

不過 ThunderBird 內建有垃圾郵件偵測器,可以協助過濾日益煩人的垃圾郵件的侵擾,這個功能目前是 Outlook Express 遠遠所不及的。更重要的是,使用這個郵件客戶端軟體的話可以不必擔心那些針對 IE/OE 漏洞的惡意信件所帶來的困擾,因為 Thunderbird 不會,也不能執行那些惡意信件所使用的 Script 語言。當然,若你手賤去執行信件的附檔的話,那就不是 Thunderbird 能夠負責任的事了… :p

不過有時候 Thunderbird 比較容易 Crash ,一般只要重新啟動 Thunderbird 即可。若還有使用上的問題的話,可以到Mozilla Thunderbird 特區尋求其他使用者的協助。

2004年6月17日

勞退金條例新制

立院在上週五(2004/06/11)會期結束前最後一次院會中,依慣例會在吵吵鬧鬧、一陣混亂後忽然通過多項屯積以久的法案作為立委們怠惰了整個會期後的一種補償。隨後又馬上照著不成文的規定,立即有政黨或立委針對通過的法案內容開始準備翻案(馬的,我好想罵三字經啊!早知如此何必每天吵吵吵,吵到會期結束前一天才在那邊亂表決?)

其中最引起注意與爭議的,莫過於勞退金條例新制的問題,以下就讓我來胡說八道一番… :p

除非企業本身會依照年資逐年調昇薪資,否則要想讓勞工從一而終的可能性已逐年降低(嗯,忽然想到國家還養了一堆沒啥用處的高階公務員、只會吵吵鬧鬧的國會議員、老是耍嘴皮的政府官員、以及三不五時可以去遊行抗議的中華電信準公務員),所以勞工要選擇那一種制度其實已經很清楚。但是問題就出在這個新制中的 6% 勞工退休金是由資方所提撥的,那麼資方(特別是中小企業的老闆)會怎麼做就很令人尋味了。

假設一個 10 名員工的小公司,員工的平均薪資是 30000 元,那麼每個月公司必須提撥合計 30000 x 6% x 10 = 18000 元的勞退金,那麼每年必須額外支付 216000 元的成本,這樣的額外支出不可不謂沉重。於是可以猜想資方可能會有 5 種應變作為:

  1. 關廠歇業,老闆去當別人的員工。於是造成 9 名勞工非自願性失業,政府開始輔助失業救助金。
  2. 全員減薪 6%,那麼每名員工可以少支付 NT$108 元,一年可以較未實施勞退金新制前少支付 NT$12960 元,結果是員工大失血,可是老闆小賺一筆。說真的,這種做法實質上還是由員工自行繳付退休金,因此對於留住號稱企業最重要資產的人力資源跟本沒有幫助!
  3. 資遣部份員工,將省下的薪水轉做為留職人員的勞退金。通常,留下來的這些人會受到更嚴苛的工作壓力,必須小心過勞死的威脅。
  4. 薪水改以最低基本工資 (NT$15860) 加上獎金方式發放,這樣實際支付的勞退金一年只需要 NT$114192 元,少了將近一半的支出。雖然勞方還是領一樣多的薪水、資方也依照規定提撥勞退金,可是勞方退休後的保障卻縮水一半。
  5. 依規定提撥,不過我認為除非該公司有賺錢,不然依規定提撥只會對營業狀況雪上加霜罷了,最後公司倒閉,政府只好開始輔助 10 名非自願性失業勞工的失業救助金。
  • 請注意喔,這還只是 10 人小公司喔,要是鴻海那種大企業,那麼額外支出就是 10 倍、100 倍喔!
從上面看來,表面上勞退金條例讓勞工退休後可以有所保障,可是如果因為資方無力配合加上政府未提出配套措施的話,恐怕只會造成員工提早退休而拉高失業率的情形,勞退金條例中所期望的勞工退休保障仍然只是一個屁而以!

屁話放完了後,我要去找人事申請使用新制去了...

後記:本公司似乎打算採減薪方式因應,這… 媽的,立法院怎麼老是搞這種自以為對勞工有益的法案啊… -.-

2004-06-17 再後記:依慣例,這個問題通常不用一個星期後,立委就會忘記曾經表決過啥法案,也忘了原本打算翻案的理由…

2004年6月16日

Firfox 0.9 正式推出

Firefox 0.9 已於日前正式推出,中文版同步更新。您可以隨時從這個 Blog 右方的【最佳瀏灠工具】分類中立即取得最新 Firefox 資訊。
在 Linux 上比較 Firefox 0.8 英文自行編譯版及 Firefox 0.9 中文網路下載版後,確定在預設狀態下(相關套件已 patch 過,並採用 FireFly 提供的字型設定檔) Firefox 0.9 中文版的小字體比較漂亮,0.8 英文版則覺得字體有點模糊。不過若放大一級字體後都一樣漂亮啦!
眼見為憑,請參閱【Firefox 0.8】及【Firefox 0.9】的晝面擷圖。
至於 Firefox 0.9 所新增的各項特色,請直接參考Mozilla Firefox 釋出備註內的說明,英文原始說明則請參考Firefox - The Browser, Reloaded說明。
最後有關 Extension 擴充套件部份,發覺 0.8 版的可以安裝 (我搞錯了,0.8版的extensions雖然可以安裝但無法啟動),當安裝新的擴充套件後 Firefox 0.9 會提該套件將於 Firefox 0.9 重新啟動後完成設定動作,真的不錯!我先安裝了RSS Reader Panel 0.7 ( 看 Blog 很方便喔 ),其他有空再裝!

2004年6月15日

桌面小調整

今天發現氣象元件的作者把 Flat 佈景設定整合進他的程式中了,馬上更換回氣象元件作者本身釋放的版本。效果令人滿意!

按【這裡】是新的氣象元件的效果,按【這裡】是原來的桌面效果,看出差異了嗎?

2004年6月13日

我的新桌面

今天把我的桌面改成灰色系列,算是走簡單的線條風格吧。沒有炫爛的顏色干擾,覺得看來蠻舒服的!
按【這裡】可以看到我的新桌面,圖本身有點大喔~~
首先,這可不是 Windows 的桌面,事實上目前我比較常在 Linux 環境下作業,所以這是 Linux 的 X Window 桌面圖。我在桌面上放了三個小應用程式,從右側由上而下分別是:台北市過去兩小時的天氣狀態及未來4天的天氣預測情形;月曆;以及系統狀態監控。比起來,我個人認為 X Window 的桌面彈性較大,像是【這裡】有第二個虛擬桌面的樣式,而且我可以建立好幾個虛擬桌面,只要我有需要的話。目前我建立了四個虛擬桌面,而每一個桌面各自使用自己的桌布以方便辨視!
從圖上可以發現右邊的一個時鐘符號的資料似乎跑到框框外了,這是因為我增加了磁碟空間檢測項目,這一加就把系統時間和系統運作時間給擠到下面去了,我有找人幫忙改,可是… 還沒拗到義工… :(

2004年6月3日

官員未出席立法院應課以刑責

昨天有個新聞 王金平打算立法對未出席立法質詢的官員覺得要立法課以刑責

我覺得為公平起見,同一個法案中除了規範官員未依規定出席立院各委員會應課以刑責的話,同時要規範立委未依規定參加所屬委員會會議者,一併課以刑責。

這樣不知可不可以讓那些簽個名就溜的、或者連簽到都沒有的立委們好好執行選民的委託?

2004年6月2日

使用 RRDTool 整合系統狀態

RRDTool手册(簡)

RRDTool 和 MRTG 一樣都是將某些狀態的數值變化以圖形方式加以顯現的工具,其中最大的差別在於 RRDTool 可以在同一個圖示中整合多種看似無關的數據資料在同一個時間流之下,例如網頁存取次數與網路流量、CPU 使用率、以及記憶體使用率之間的關係。可以提供管理人員作為判別之用。

這份文件是參考 abelyang 在 酷!學園 討論區中標題為 [教學]大作 rrdtool (像 mrtg 的東東) 完全攻略 的內容後所做的實際測試,同時依個人的領悟狀況加上個人的解釋。

安裝 rrdtool

在 Gentoo 下,直接以 emerge -v rrdtool 即可安裝,portage 機制可以會自行處理相依性問題。事實上 rrdtool 須要的套件主要是 libgd (RedHat 叫 gd) 這個套件,通常在安裝 libgd 前會先安裝 libpng 及 freetype2 兩個套件。若使用中文修改版的 rrdtool 則還必須另外安裝 libiconv 套件,目前 Gentoo 中 libiconv 這個套件是 Masked 的。

使用 RRDTool 的基本步驟

使用 RRDTool 的基本步驟有三:

  1. 建立RRD資料記錄檔:也就是真正儲放資料的地方,基本上是要求 RRDTool 必須記錄多少項資訊,以及這些資訊的儲存規則。
  2. 擷取資料、寫入資料記錄檔:透過各種方式將當成圖示條件的資料寫入RRD記錄檔中,作為晝面顯示的依據。
  3. 繪出圖示:將已記錄下的資料依指定格式輸出成圖形檔,提供管理人員分析研判。

練習目標

由於我的 Server 上有提供 WEB 及 Mail Server 兩種服務,因此打算以這兩種服務的流量表作為這次練習的目標,依照前述的三步驟逐一建立。

同時,由於是追蹤流量的改變,因此必須使用 tcpdump 輔助工具協助擷取 TCP 封包資訊,不過這部份的使用不在此次介紹之列。其他像是 Shell Script, sed/awk, 或 Regular Expression 等使用也必須瞭解熟悉。

建立 RRD 記錄檔

建立 RRD 記錄檔的方式是透過 rrdtool create 方式達成,以下是完整的語法結構。

rrdtool create filename                 # filename 一般會以 .rrd 作結尾,方便辨視
[--start|-b start time]                 # 記錄起始時間, 為自1970-01-01 00:00:00迄今之秒數
[--step|-s step]                        # 每兩次記錄之間的時間間隔
[DS:ds-name:DST:heartbeat:min:max]      # 資料源,同一記錄檔中可有多個資料源
[RRA:CF:xff:steps:rows]                 # 資料保存方式

記錄起始時間用於標示該記錄檔有效起始時間,未指定時以建檔當時時間為預設值。

時間間隔則用於標示前後筆資料的相差時間(秒數)。

資料集合(DataSource, DS, 或稱為資料源):

  1. ds-name: 用來指定這個資料集合的名稱
  2. DST: 用來說明這個資料集合的型別為何,總共有四種:GAUGE、COUNTER、DERIVE及ABSOLUTE。GAUGE 是指前後兩個數據各自獨立,沒有關連的記錄方式;COUNTER 則是前後項資料之間有累計的性質。使用 COUNTER 會影響到圖示輸出的方式,其輸出的值則是兩數據之間的差。其他待查。
  3. heartbeat: 有效值,這是指多久時間之內若沒有取得資料時先用內插法取得欠缺的資料,但若超過這個限定時間長度的話則直接以 UNKNOW (UN) 表示。例如:假設step設為300, heartbeat 設為 600,某一個時間軸中的一點為t1,t2為t1+300秒,t3為t1+600秒, t4為t1+900秒。當t1有值、t3有值,但t2無資料時,會因為 t3 - t1 <= heartbeat 而由 rrdtool 自行將 t1 + t3 的值除以 2 作為 t2 的值;但若 t1 有值,t2, t3無值而t4有值,則因為 t4 - t1 >= heartbeat 所以 t2, t3 都會變成 UN,表示無資料。
  4. min: 可接受的最小值。
  5. max: 可接受的最大值。
資料保存方式 (RRA):
  1. CF: 資料使用方式,共有AVERAGE,MIN,MAX,LAST四種,分別表示在指定的區間(steps)內的所有數據的『平均值』、『最小值』、『最大值』、『最後值』 。
  2. xff: 用途不明,其值限定在 0 到 1 之間,我試過填入 0 或填入 0.5 似乎都沒差。
  3. steps: 指出這個保存方式橫跨幾個step, step表示多長時間則由建檔時指定。
  4. rows: 在指定的steps間隔下,必須保留最新的多少筆資料。例如若step=300,steps=1,rows=800即表示5分鐘間隔的記錄要存800筆;step=300,steps=6,row=300表示30分鐘間隔的記錄要存300筆。
經由以上的說明,可以使用以下的命令建立符合練習目標的rrd記錄檔。

# 指令請自行串接成一行
rrdtool create ~/tcpdump.rrd
-s 300
DS:smtp:GAUGE:600:0:U
DS:http:GAUGE:600:0:U
RRA:AVERAGE:0.5:1:603
RRA:AVERAGE:0.5:6:603
RRA:AVERAGE:0.5:24:603
RRA:AVERAGE:0.5:288:800
RRA:MAX:0.5:1:603
RRA:MAX:0.5:6:603
RRA:MAX:0.5:24:603
RRA:MAX:0.5:288:800

上述指令的完整意思說明如下:

  1. 建立一個叫 tcpdump.rrd 的rrd記錄檔。
  2. tcpdump.rrd的資料計算區間為300秒。
  3. 有一個叫smtp的資料集,單一數值記錄,最長有效時間為600秒,最小值為0,最大值無限制。
  4. 有一個叫http的資料集,單一數值記錄,最長有效時間為600秒,最小值為0,最大值無限制。
  5. 資料保存時必須記錄5分鐘的資料平均值603筆。
  6. 資料保存時必須記錄30分鐘的資料平均值603筆。
  7. 資料保存時必須記錄2小時的資料平均值603筆。
  8. 資料保存時必須記錄一天的資料平均值800筆。
  9. 資料保存時必須記錄5分鐘的資料最大值603筆。
  10. 資料保存時必須記錄30分鐘的資料最大值603筆。
  11. 資料保存時必須記錄2小時的資料最大值603筆。
  12. 資料保存時必須記錄1天的資料最大值800筆。

更新RRD記錄檔

要更新RRD記錄檔必須透過 rrdtool update 方式進行,以下是指令的架構:

rrdtool update filename                # 欲更新的RRD檔檔名 
[--template|-t ds-name[:ds-name]...]   # 指定要更新的資料源順序,未輸入時以建立時的順序為預設值
N|timestamp:value[:value...]           # 記錄時間及相關數據
  1. --template|-t: 用於標示後續的資料要依何種順序寫入RRD記錄檔中,若有多個資料源則以 : 加以區隔。
  2. N|timestamp: 用於標示此筆資料的建立時間,若記錄的時間是目前的時間時,可以用 N 表示。這個數值的單位是秒,在 bash 下可以使用如下方式取得:
    NOW=$(date +%s)
  3. value: 實際欲寫入的數據,必須和 template 指定的項數建檔時的資料集合項數 符合。
簡單的說,更新RRD記錄檔的方式就是將須填入的資料準備好,再依指令規定的格式串接即可透過指令寫入記錄檔中。

寫入新資料時,必須注意rrdtool在繪出圖檔時似乎是以 08:00 + step 設定的秒數 UTC +0000 為時間軸的參考點(所以實際的起始時間必須配合 TimeZone 來確認,如 Taipei 時區就變成 08:00 為起始點),因此在實際繪出圖形時若發現預期外的小數點輸出時,請修改寫入記錄檔時所設定的 timestampe ,使之配合 0 + step 的週期即可。

以下是此次測試使用的資料擷取程式片段,我採用 crontab 方式執行。

#!/bin/bash
# tcpdump.sh, 產生 smtp 及 http 兩個 port 上的流量表並寫入 rrd 記錄檔
RRD_PATH="/root/tcpdump.rrd"
image_path="/root"
sec=300
# 此段用於產生新的 tcpdump 記錄檔
killall tcpdump
mv /root/ip.packet /root/ip.packet.1
/usr/sbin/tcpdump -w /root/ip.packet tcp &
# 指定要計算的 port 列表
scan_port="25 80"
rrd_data=""
# 開始擷取相關資料,算出來的流量單位是 5 分鐘內的平均 bytes 數
# 請注意:這邊對流量的計算方式僅適用於 Gentoo 下的 tcpdump v3.8.3 版,
#        這是因為 tcpdump 輸出格式似乎有依套件及版本別不同而有不同的格式。
for sport in $scan_port
do
        port=$(/usr/sbin/tcpdump -r /root/ip.packet.1 port $sport -v | sed -e 's/.*, length: ([^)]*)) .*$/1/g' | tr 'n' '+')
        port=$(echo ${port}0| bc)
        port=$(expr $port / $sec)
        rrd_data="$rrd_data$port:"
done
# 濾掉前一個迴圈中額外產生的 : 符號
rrd_data=$(echo $rrd_data | sed -e 's/:$//')
# 將指令寫入 tcpdump.cmd 中,若須重建 rrd 資料庫時可以重覆利用
echo "rrdtool update $RRD_PATH N:$rrd_data" >> /root/tcpdump.cmd
rrdtool update $RRD_PATH N:$rrd_data

輸出圖形

RRDTool 的繪圖指令格式

rrdtool graph filename                      # filename 圖檔名稱
[-s|--start seconds]                        # 起始時間,自1970年1月1日起以秒為單位,預設為24小時前
[-e|--end seconds]                          # 結束時間,規則同起始時間,預設為繪圖當時之時間
[-x|--x-grid x-axis grid and label] 
[-y|--y-grid y-axis grid and label] 
[-Y|--alt-y-grid] 
[-R|--alt-y-mrtg] 
[-A|--alt-autoscale] 
[-M|--alt-autoscale-max] 
[-N|--no-minor]                             # 不要繪出副隔線 
[-X|--units-exponent] value]> 
[-L|--units-length] value]> 
[-v|--vertical-label text]                  # Y 軸上的說明
[-w|--width pixels]                         # 圖檔寬度
[-h|--height pixels]                        # 圖檔高度
[-i|--interlaced] 
[-f|--imginfo formatstring] 
[-a|--imgformat GIF|PNG|GD]                 # 圖檔格式,預設為 GIF 格式
[-B|--background value] 
[-O|--overlay value] 
[-U|--unit value] 
[-z|--lazy] 
[-o|--logarithmic] 
[-u|--upper-limit value]                    # 設定 Y 軸上最高顯示範圍
[-l|--lower-limit value]                    # 設定 Y 軸上最低顯示範圍
[-g|--no-legend] 
[-j|--only-graph]                           # 關閉說明列 
[-F|--force-rules-legend] 
[-r|--rigid] 
[-S|--step value]                           
[-b|--base value] 
[-c|--color COLORTAG#rrggbb]                # 指定物件(COLORTAG)顏色 
[-t|--title title]                          # 圖形抬頭
[DEF:vname=rrd:ds-name:CF]                  # 定義rrd檔中的資料集合對應之變數名稱
[CDEF:vname=rpn-expression]                 # 定義經計算過後之變數名稱
[PRINT:vname:CF:format]                     # 格式化字串
[GPRINT:vname:CF:format]                    # 格式化字串
[COMMENT:text]                              # 註解訊息
[HRULE:value#rrggbb[:legend]]  
[VRULE:time#rrggbb[:legend]] 
[LINE{1|2|3}:vname[#rrggbb[:legend]]]       # 設定線條格式(有寬、中、細三種,分別為LINE3, LINE2, LINE1) 
[AREA:vname[#rrggbb[:legend]]]              # 設定區塊格式
[STACK:vname[#rrggbb[:legend]]]
  • RRDTool 其實是不支援中文的,以下附的中文範例其實是因為使用了 abelyang 修改過的版本,請注意這項不同。
以下僅就範例所需解釋各參數的意義:
  1. -s|--start : 繪圖的起始時間點,以1970年1月1日0時0分0秒開始計算所經的秒數。預設值為 1 天前。
  2. -e|--end : 繪圖的結束時間點,以1970年1月1日0時0分0秒開始計算所經的秒數,預設值為現在。
  3. -N|--no-minor : 不要繪出副格線,在長時段下若繪出副格線有時會顯的凌亂不已。
  4. -v|--vertical-label : Y 軸上的說明文字。
  5. -w|--width : 資料輸出的有效寬度,單位是點。實際輸出寬度會因 Y 軸上的說明文字所佔用空間及兩側空白之故而略寬。
  6. -h|--height : 資料輸出的有效高度,單位是點。實際輸時會因為線條的說明文字及上下兩端空白之故而略高。
  7. -a|--imgformat GIF|PNG|GD : 指定圖形檔輸出格式,預設值是GIF,並不因為指定的圖檔副檔名而自動調整。
  8. -u|--upper-limit : 指定Y軸上的最高數據值,這個值一定大於或等於指定時間區段中的資料最大值。
  9. -l|--lower-limit : 指定Y軸上的最低數據值,這個值一定小於或等於指定時間區段中的資料最小值。
  10. -c|--color COLORTAG#rrggbb : 設定圖形輸出色彩值,COLORTAG中指定設定的項目,rrggbb是實際顏色值。COLORTAG共有BACK, CANVAS, SHADEA, GRID, MGRID, FONT, FRAME, ARROW 8種,詳細用途請自行參考 RRD TOOL -- RRD GRAPH 說明。
  11. -t|--title : 圖形抬頭。
  12. DEF:vname=rrd:ds-name:CF : 定義來自RRD資料檔的資料源對應,簡單的說就是要將某變數(vname)定義成資料檔(rrd)中的那一個資料源(ds-name)的那一種型別(CF)。例如:
    DEF:v1=/root/tcpdump.rrd:smtp:MAX
    表示將tcpdump.rrd記錄檔中的smtp資料源中記錄的最大值命名為v1這個變數。
  13. CDEF:vname=rpn-expression : 定義運算公式 (rpn-expression),並賦予公式名稱 (vname)。通常在原始資料不一定適合直接顯示在畫面上,此時可透過運算公式對原始資料進行處理。整個公式的表示採用後序方式表示,也就是必須將運算子擺到尾巴的方式。如果想要更清楚的瞭解公式的表達方式可以參考官方網站 CDE TutorialRPN Tutorial 網頁說明。
  14. GPRINT:vname:CF:format : 將指定的變數(vname),種類(CF)依規範的格式化字串(format)格式輸出到圖形的說明區中。
  15. COMMENT:text : 註解訊息,可在字串末端加上 LF 符號表示換行。
  16. LINE{1|2|3}:vname[#rrggbb[:legend]] : 線段設定,將指定變數(vname)的數據內容以指定的顏色(#rrggbb)及寬度(LINE3最粗,LINE1最細)繪出。legend用於說明該顏色/變數所代表的意義。
  17. AREA:vname[#rrggbb[:legend]] : 區塊設定,指將指定變數(vname)的數據內容以指定的顏色(#rrggbb)繪出。legend用於說明該顏色/變數所代表的意義。
RRD_FILE=/root/tcpdump.rrd
NOW_STR=$(date +"%Y-%m-%d %H:%M:%S")

# 以下指令請自行串接為一行,\\n 因 SnipSnap 限制,其意是換行符號 LF。 rrdtool graph /home/blog/ada/flowrate.png --title "伺服器網路服務流量表 - 最近 2 小時內" DEF:d1=$RRD_FILE:smtp:MAX DEF:d2=$RRD_FILE:http:MAX COMMENT:"服務別 --- 最大值 -- 平均值 -- 最小值 -- 現值 -- \\n" LINE3:d1#0000ff:"SMTP: " GPRINT:d1:MAX:"%10.0lf" GPRINT:d1:AVERAGE:"%11.0lf" GPRINT:d1:MIN:"%11.0lf" GPRINT:d1:LAST:"%9.0lf \\n" LINE3:d2#ff0000:"HTTP: " GPRINT:d2:MAX:"%10.0lf" GPRINT:d2:AVERAGE:"%11.0lf" GPRINT:d2:MIN:"%11.0lf" GPRINT:d2:LAST:"%9.0lf \\n" --no-minor -h 200 -w 320 -s `date -d "-2 hour" +%s` COMMENT:" 最後更新: $NOW_STR"

上述指令的說明如下:

  1. 定義一個叫 d1 的變數,其資料來源是 RRD 檔中的 smtp 資料集合中的 MAX 類型之資料。
  2. 定義一個叫 d2 的變數,其資料來源是 RRD 檔中的 http 資料集合中的 MAX 類型之資料。
  3. 使用 LINE3 線段繪出 d1 的變動情形,此時線段使用的顏色是紅色,同時附帶一個簡短的訊息文字,內容是 "SMTP:"。
  4. 格式化輸出 d1 的各種狀態的值。
  5. 使用 LINE3 線段繪出 d2 的變動情形,此時線段使用的顏色是藍色,同時附帶一個簡短的訊息文字,內容是 "HTTP:"。
  6. 格式化輸出 d2 的各種狀態的值。
  7. 不要顯示副格線。
  8. 有效高度是 200 畫素。
  9. 有效寬度是 320 畫素。
  10. 起時日期是 2 小時前。
  11. 輸出最後更新時間為 $NOW_STR。
圖檔輸出範例:
example

中文版本安裝 - 使用 Gentoo Linux

※目前 rrdtool 應已內建輸出 UTF-8 字元之能力!

若打算在 Gentoo 上使用 abelyang 所修改的 rrdtool 套件,必須完成以下作業:

  1. 自行建立 gnroff 的 soft link。
    ln -s /usr/bin/nroff /usr/bin/gnroff
  2. make 前要修改 perl-piped 及 perl-shared 目錄下的 Makefile, 將 perl 版本別改為系統上的狀態。例如在 vim 下執行下述指令可以完成修改作業。
    :1,$s/5.8.0/5.8.2/g
  3. make 前要修改 perl-piped 及 perl-shared 目錄下的 Makefile, 將 i386-linux-thread-multi 改為系統上的狀態。在 vim 下執行以下指令可完成修改作業。
    :1,$s/i386-linux-thread-multi/i686-linux/g
  4. 安裝中文字形檔 media-fonts/arphicfonts。
  5. 修改 gd1.3/gd.c 中字型檔位置
    gdImageStringTTF(im,&brect[0], color, "/usr/share/fonts/ttf/zh_TW/bkai00mp.ttf",12,0.0,x-2,y+13,UTF8_String((char *)s));
  6. 最後安裝 rrdtool 時不要使用 configure, 直接 make clean; make; make install 即可。

中文版本安裝 - 使用 RedHat Linux

若打算在 Redhat 上使用 abelyang 所修改的 rrdtool 套件,必須完成以下作業:

  1. 安裝 libpng, libjpeg, freetype2 的函式標頭檔。
  2. 安裝 gd 套件,可以先找找 rpm 套件包,也別忘記安裝函式標頭檔。同樣的,若 rrdtool 無法 make 成功時,請考慮自行編譯 gd ,同時指定 --prefix=/usr/local 。最後在 ./configure 後必須檢查是否已開啟 freetype, libpng, libjpeg 等支援。
  3. 安裝 libiconv 套件,可以先試著找找看有無 rpm 套件包(記得安裝函式標頭檔),若找不到的話就下載原始程式檔自行編譯安裝。安裝時記得要在 configure 時設定 --prefix=/usr/local ,否則可能 rrdtool 會 make 失敗。另外若發現已確實安裝 libiconv 卻仍然無法成功 make 時,可以試著更改 libiconv 的版本,如 libiconv v1.8 版。
  4. 若有更新過 Perl 時,必須要和 Gentoo 一樣去修改 rrdtool 目錄下的 perl-piped 及 perl-shared 中的 Makefile,將路徑修正成系統的實際設定。
  5. 記得安裝中文字形檔 ttfonts-zh_TW-2.11-19.noarch.rpm 。
  6. 安裝 rrdtool 時不要使用 configure, 直接 make clean; make; make install 即可。

中文版本安裝 - 使用 GB2312 編碼

  1. 請先完成套件本身有關之相依性設定。
  2. 修改 gd1.3/gd.c 中的設定,將
    cd=iconv_open("UTF-8","BIG5");
    修改為
    cd=iconv_open("UTF-8","GB2312");
  3. 開始禱告我的猜測是正確的… :p
  4. 安裝 rrdtool 時不要使用 configure, 直接 make clean; make; make install 即可。