顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


主題 - thyme

頁: [1] 2 3
1
Network 討論版 / 請問一個 router 的怪怪設定
« 於: 2010-06-14 15:47 »
先說明,這是一個特殊客戶,設一個怪怪的設定,然後要我們違反常理做一些設定…

網路環境就是一個 router 然後接 hub 再接 pc, 我的 linux 機器(client)和 pc 地位一樣,
router 和 pc 都是 10.1.1.0/24 的,我的 linux 機器有兩組 ip, 10.1.1.0/24 與 14.1.1.0/24,
router 再對外是連 VPN , 而有一個 server 是 192.168.1.0/24,這 server 是位在 VPN 另一端。

正常來說,我linux client以 10.1.1.0/24 連線到 server 是沒有問題,
但因為他們種種的怪原因,我 linux 機器的網路必需做到

1. 要有一個永遠存在的 192.168.1.1, 方便設定人員使用對接網路線,以web方式設定。

2. 在 server 端看到 linux client 的連線 ip 要為 14.1.1.0/24 的,
router 只有一組 10.1.1.0/24 的 ip, router 可設定(且測試過)以 10.1.1.0/24 來轉 14.1.1.0/24 的 ip

3. 區網的 pc 可用 10.1.1.0/24 連到我 linux 機器的 web 設定畫面


我遇到問題是…
1. linux 機若設定 192.168.1.1/24 ,那麼 192.168.1.0/24 的網路會變成區網,就不會透過 router,
這麼一來就連不到處在 router 另一邊的 server

2. linux 設(alias)兩個網段 10.1.1.0/24, 14.1.1.0/24, 再設 router 10.1.1.254,
則透過 router 出去的就是 10.1.1.0/24,不會是 14.1.1.0/24,
若不設 10.1.1.0/24 , 則 14.1.1.254 的 router 是無法設定的,
10.1.1.0/24 的ip也不能關, 因為要留給 PC 來連線 web 設定。

3. 有辦法用 linux 架一台類似功能的 router 嗎?只有一個10.1.1.1/24,然後通吃10.1.1.1/24及14.1.1.1/24


PS:因為對方是年營業上千億的大公司,我只能改變自己,沒辦法改變別人。

2
美食行動區 / 建議一下,台南吃的地方?
« 於: 2010-05-26 18:08 »
這幾天要去台南逛逛,主要是賞花(荷花、鳳凰花、阿勃勒等),
有什麼建議吃的地方,會帶兩個小朋友,要能舒服慢慢吃的餐廳之類,
夜市之類的就不用建議了,還有上千元一客的我們也吃不起...

對了,我的行情主要在台南市及白河鎮....

3
Windows 討論版 / email 夾檔不能解開
« 於: 2010-05-24 14:25 »
我對windows不熟,請教一下mail的肉腳問題。

某個客戶寄給我老闆的信件中,其夾檔就是不能正常打開,
這個客戶是大廠,他們的軟體通常是 update 到最新,
客戶說他有測過,直接CC到自己同事夾檔開啟都沒問題。

老闆的 outlook 不能開,那我試試我用的 Thunderbird,
奇怪,也打不開。

測了老半天,發覺是 base64 編碼檔頭的問題,
我 Thunderbird 以及老闆 outlook 寄出的信在夾檔的檔頭差這麼一段
Content-Transfer-Encoding: base64,
打不開夾檔的就沒這麼一段,
導致收信軟體跟本不認得這是 base64 編碼,
開啟和另存新檔也不會自動幫你轉,
現在變成我都要很累的手動轉。

這個 outlook 要什麼特殊設定嗎?
為什麼同樣的內容,客戶的 outlook 收檔也沒問題?

4
雜七雜八 / 大概是DNS問題,請大家幫忙
« 於: 2009-06-05 16:06 »
事情是這樣的,最近有些 email 會被退回來,
後來是發現寄到 xxxx@cht.com.tw 的才會被退回來,("xxxx"是馬賽克後的id)
我用 google mail 寄,又可以正常收到,
mail server 是我自己電腦的,所以又查了一下:
$ nslookup
> server 168.95.192.1
Default server: 168.95.192.1
Address: 168.95.192.1#53
> cht.com.tw
Server:         168.95.192.1
Address:        168.95.192.1#53

Non-authoritative answer:
*** Can't find cht.com.tw: No answer
> server 168.95.1.1
Default server: 168.95.1.1
Address: 168.95.1.1#53
$ dig cht.com.tw

; <<>> DiG 9.4.2 <<>> cht.com.tw
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39486
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;cht.com.tw.                    IN      A

;; AUTHORITY SECTION:
cht.com.tw.             6409    IN      SOA     edns1.cht.com.tw. kemy.cht.com.tw. 2009020412 600 600 259200 86400

;; Query time: 19 msec
;; SERVER: 168.95.192.1#53(168.95.192.1)
;; WHEN: Fri Jun  5 16:00:13 2009
;; MSG SIZE  rcvd: 75

看來是 DNS 找不到的問題。

但為什麼 google mail 可以寄到呢?
我又去另外網站查
http://www.mxtoolbox.com/index.aspx
卻又可以查到。

不知這問題出在哪兒?
國外 DNS 站尚存有暫存檔,所以查得到,
168.95.1.1第一個刪除了,所以這台查不到?

5
MIS 討論區 / 增加 proxy 及 ssh 對外的安全性
« 於: 2008-05-22 16:13 »

因為對 MIS 不熟,有些問題,請大家建議一下:

1. 有幾個同事一定會在家用 Hinet ADSL 上網做公司的事。
2. 某個必要網站一定要公司的ip才可連到。
3. 不小心答應老闆要架Proxy應付問題 2。

我的 squid 有做它本身提供的簡單認證,不過這還不太安全,
但因為同事是 ADSL 上網,ip會一直變,就不能用 iptables 去直接鎖死,
請問有沒有其他的方式?間接或直接都可以。
這個 proxy 只有 proxy port 有 mapping 對外,並不是直接對外網連線。

另外還有 ssh 的問題,雖然我機器只有 ssh 對外(跟 proxy 是不同台機器),
每天看到上千人次來我家按門鈴,就覺得心驚,生怕不小心密碼被試出就完蛋了。
因為我常會在家用 ADSL 連線,所以同樣也不能鎖死ip,有沒有更安全的方法?
請不要告訴我關閉 ssh,直接奔到公司做就好,我不想為了幾分鐘的事,在假日被緊急召回公司,
何況,被召回公司後,很可能會附贈許多贈品給你嘗嘗。

6
灌個水,免得自個版面鬧旱災。

話說 Firefox 有 Windows、Linux、中文、英文、法文、德文等等版本,
我們一般都是安裝正體中文版,但某些時候,想跑英文版或是簡體版怎麼辦?
(嗯,不要誤會,我不是指網頁內容,而是 Firefox 本身的外觀)
當然,每個版本都安裝一份也可以,只是佔空間且不太方便。

跟據我研究結果,是可以整合成一個多國語言版本,且可以互相切換。

1. 在不同語言版本的 firefox/chrome 目錄內可以找到不同語言介面的外觀檔,
正體中文是 zh-TW.jar  及 zh-TW.manifest,英文版就 en-US.* 等等類推,
把你想要的語言都 copy 到相同的 firefox/chrome 之下。

2. 個人使用時,可以在 Firefox 的  about:config 改這個屬性 general.useragent.locale 的值,
正體中文就是 zh-TW,英文就是 en-US,法文就是 fr ,以此類推。
咦,突然想到,我沒裝過簡體中文,不知什麼字串是代表簡體中文。

3. 若你習慣用 xterm 去改 general.useragent.locale 的值,可以找
~/.mozilla/firefox/*/prefs.js,修改(沒有這行就加上去)
user_pref("general.useragent.locale", "zh-TW");
或是直接原始安裝路徑 /usr/local/firefox/defaults/pref/firefox-l10n.js
pref("general.useragent.locale", "zh-TW");
,這邊要注意,檔名不相同,且一個是 user_pref,一個是 pref。

然後就 OK 了。

7
拾人牙慧 / [分享]播放手機 3gp 檔
« 於: 2007-06-11 17:01 »
我手機錄影的檔案格式是 3gp ,這幾天程式寫太煩了,
就小小研究一下怎麼播放這種檔。

首先要安裝 mplayer 及 ffmpeg,
然後編輯 /etc/mplayer/codecs.conf 這個檔,
在這一行 videocodec ffh263 的底下加入一行
  format 0x33363273
然後就可以播放了
mplayer xxx.3gp

8
Shell 設計入門 臥龍小三 ols3@www.tnc.edu.tw 台南縣教育網路中心
http://linux.tnc.edu.tw/techdoc/shell/book1.html

awk 的使用說明文件
1. AWK Tutorial Guide 中央研究院計算中心 ASPAC計劃 (中文)
     http://phi.sinica.edu.tw/aspac/reports/94/94011/
2. The GNU Awk User's Guide (英文)
    http://www.gnu.org/software/gawk/manual/gawk.html

awk 書本
1. 書名:sed & awk 程式設計 第二版 作者:Dale Dougherty & Arnold Robbins 編譯:陳爽 / 蔣大偉 ISBN:957-8247-67-2
    http://www.oreilly.com.tw/product_unix.php?id=a084_toc

9
或許你有疑惑,為什麼根目錄要在 ramdisk 上呢?難道不能把隨身碟看成一個硬碟
來使用嗎?答案是可以的,您可以隨心的使用 linux。

我們假設你把隨身碟分成兩個分割區,第一個分割區是 FAT 的,第二個是 EXT2,
然後 kernel 和 initrd.img 及 syslinux 都放在第一個分割區,第二個分割區當
成我們可讀寫的根目錄(/),在 linux 跑起來時,就可以直接使用之,隨時安裝或
修改及資料都可以保存下來,不用一定要在 PC 上才能修改東西。

首先要先弄好在你隨身碟第二分割區的根目錄(/),可以把之前做的 initrd.img 內
所有東西都複製過去,若你空間夠大,你要把 PC 上所以東西都 copy 過去也成,
但是,你一定要明白,若沒有適當修改一些檔案,保證跑起來是有問題的,至於要修
改什麼,我也不太清楚,因為我也沒這麼暴力過。

要注意一點,這第二分割區(假設是在 /dev/sda2),我們是把檔案放進去,而不是
包成一個 image ,然後只寫入一個 image 檔,也就是你可以直接掛載 /dev/sda2
然後可以直接寫入。

根目錄(/)做好後,再來就是要動我們的 initrd.img 了,古人說,愈練神功,必先
自X(我指的是北冥神功),我們自己做的 initrd.img 太肥了,所以直接拷貝 PC 上
/boot/initrd.img 來使用,還是要做一些修改,首先,這個檔是 gzip 的壓縮檔,
我們先把它拷貝到 /tmp/initrd.gz ,然後用 gzip 解成 /tmp/initrd ,再掛載
看看
代碼: [選擇]

mkdir /mnt/initrd
mount -o loop /tmp/initrd /mnt/initrd
ls /mnt/initrd
....

可以參考看看,檔案很小吧,但是,五臟不全,功能只剛剛好夠一些 initrd 要做的
事而已!

首先要換的是 kernel 的 modules,通常你 PC 的 kernel 會和你隨身碟上的 kernel
不一樣,所以把 kernel module 都換一換,其實也沒有幾個,再來就是把掛載隨身碟
需要用到的 module 都放上去,諸如 usb, scsi 等等相關的都放進去,也就是能把
隨身碟掛載,然後能看到隨身碟內容的 module 的就夠了,其他什麼網路什麼的,就不
用了,留在載入根目錄(/dev/sda2)時再去做即可。

對了,還記得 syslinux.cfg 有這麼一行嗎?要把 root 改成 /dev/sda2,不能再用 /dev/ram0
代碼: [選擇]

APPEND root=/dev/sda2 initrd=initrd.img

然後,要開始改這個 /mnt/initrd 的 linuxrc 這個檔,這是原先 PC 上 linuxrc 的內容
代碼: [選擇]

#!/bin/nash
 
 echo "Loading jbd.ko module"
 insmod /lib/jbd.ko
 echo "Loading ext3.ko module"
 insmod /lib/ext3.ko
 echo Mounting /proc filesystem
 mount -t proc /proc /proc
 echo Creating device files
 mkdevices /dev
 echo Mounting sysfs
 mount -t sysfs none /sys
 echo Creating root device
 mkrootdev /dev/root
 umount /sys
 echo 0x0100 > /proc/sys/kernel/real-root-dev
 echo Mounting root filesystem
 mount -o defaults --ro -t ext3 /dev/root /sysroot
 pivot_root /sysroot /sysroot/initrd
 echo Remounting devfs at correct place if necessary
 handledevfs
 umount /initrd/proc

這不是 PC,系統不會自動幫你掛載 kernel moudle,所以要自己動手用 insmod 把你
掛載隨身碟所需要的檔一行一行掛上去,這裡要注意一下,掛載 module 的先後順序
是不能隨便亂放的,有些 module 會有相依性的問題。
好了,再來就是修改這一行
代碼: [選擇]

 mount -o defaults --ro -t ext3 /dev/root /sysroot

改成這樣
代碼: [選擇]

 mount -o defaults --rw -t ext2 /dev/root /sysroot

這邊的 /dev/root 就是你在 syslinux.cfg 內 root=/dev/xxx 傳進來的參數,你也
可以自己用暴力法改成
代碼: [選擇]

 mount -o defaults --rw -t ext2 /dev/sda2 /sysroot

(關於 linuxrc 可以參考 http://phorum.study-area.org/viewtopic.php?t=33514 )

最後有幾點要注意的,首先是在 syslinux.cfg 內的 root=/dev/xxx ,某些 kernel,
若是指定 /dev/ram0 ,則不會跑 initrd.img 內的 /linuxrc 而是跑 /etc/inittab
內指定的 sysinit 的檔。還有,你不要指望在 /linuxrc 裡面做太多事,nash不是萬
能的。

10
USB flash 拿來存隨身資料很方便,當然就有人動惱筋把整個作業系統
都灌進去,最近在弄這個,順便把心得報告一下。

網路上相關資料我沒有找很詳細,我想別的地方一定有,但做法應該
和我有些許的差異,有興趣的人就參考一下我的方法。

首先假設你具備有 floppy linux 或是 embedded linux 的基礎,我的方
法比較偏向嵌入式的做法(所以請不要問我怎樣才能把 FC4 ,灌進 1G 的
大姆哥內)。

硬體則需要一隻 USB flash disk,容量 8 MB 以上(現在應該買不到這麼
小的容量的吧!),以及你的主機板要支援USB-HDD開機的選項。

軟體方面,linux系統是必備的,因為我們不打算做太大的系統,busybox
也要先準備好,kernel版本不限,能跟 busybox 合即可,一般來說,直
接 copy 你 PC 上的 kernel 來用即可,再來比較不同的是 syslinux,
這是一隻 bootload,可以去 http://www.syslinux.org/ 去下載回來,
直接 make,然後找裡裡的 syslinux 這隻執行程式來用即可。

第一步,先在你 PC 上插上 USB flash,看可否能掛載,如果不能掛載,
先檢查一下底下的一些 modules 有沒有載入,
USB 方面:usbcore.ko uhci-hcd.ko ohci-hcd.ko ehci-hcd.ko  usbhid.ko usb-storage.ko
SCSI 方面:scsi_mod.ko sd_mod.ko
檔案系統:fat.ko vfat.ko nls_cp437.ko nls_iso8859-1.ko

再來,假設你已經正確把 USB flash 放在 /dev/sda1 且 mount 在 /mnt/tmp,
也可以讀寫資料,一切沒問題後,先 umount /dev/sda1,
然後安裝 syslinux,執行
# syslinux /dev/sda1

接著我們要建立一個 syslinux 的設定檔,重新掛載 /dev/sda1 到
/mnt/tmp,
自行建立一個名為 syslinux.cfg 的文字檔,內容類似如下
代碼: [選擇]

TIMEOUT  20
DEFAULT  linux

LABEL  linux
  KERNEL bzImage
  APPEND root=/dev/ram0 initrd=initrd.img

其中 kernel 檔名為 bzImage,ram disk image的檔名為initrd.img,
這幾個檔皆放在 /mnt/tmp 底下,initrd.img 就是一個 root file
system,你可以使用 gzip 壓縮之,其做法請參考 floopy  linux的
製作。

完畢後,在 BIOS 選擇 USB-HDD 重開機就大功告成了。

因為檔案系統的根目錄都放在 ramdisk,這樣比較浪費空間,下一篇我們再
談談 root 不是 ramdisk 的方式。

11
雜七雜八 / 教師節快樂
« 於: 2006-09-28 18:13 »
祝大家教師節快樂!

好像自從某人上台後,一些節慶的氣氛都沒有了...

12
程式討論版 / [Shell]取得IP
« 於: 2006-08-29 16:17 »
不是發問,是請大家動動腦。
限定使用語言為 shell script,必須為完整可執行的程式,
題目為取得eth0的 ip、broadcast、netmask、mac。
範例:
代碼: [選擇]

#!/bin/sh
ip=$(ifconfig eth0 | grep "inet addr:" | cut -d ':' -f2 | cut -d ' ' -f1)
bcast=$(ifconfig eth0 | grep "inet addr:" | cut -d ':' -f3 | cut -d ' ' -f1)
mask=$(ifconfig eth0 | grep "inet addr:" | cut -d ':' -f4 )
mac=$(ifconfig eth0 | grep HWaddr | sed -e 's/^.*HWaddr //)
echo "IP=$ip Broadcast=$bcast Netmask=$mask Mac Addr=$mac"



我目的在於與大家交流一下,看看有沒有什麼不一樣的寫法,
也許可以增進寫shell的功力。

上面程式是我隨便打出來的,我希望能看到不同寫法的,
更聰明或是更笨的寫法也行,有時候笨方法反而不容易出錯也好debug,
例如:
代碼: [選擇]

#!/bin/sh
eval $(ifconfig eth0 | grep "inet addr:" | sed -e "s/^.*inet addr:\(.*\)  Bcast:\(.*\)  Mask:\(.*\).*$/ip=\1 bcast=\2 mask=\3/")
echo "IP=$ip Broadcast=$bcast Netmask=$mask"

就不太好debug,若不小心打字多個空格就要debug好一陣子。

13
雜七雜八 / mandriva live cd
« 於: 2006-05-18 12:12 »
詳情見:
http://www.mandriva.com/en/community/mandrivaone
引用

Mandriva One

The first complete distribution of Mandriva Linux on one CD, Mandriva
One is now available for everybody. To use it in Live mode, you just
insert it into the CD or DVD drive, then restart your machine. Office
software, Internet, multimedia: the power of Mandriva Linux is
instantly available, without installing anything on your system.

Convinced?  Install Mandriva One just by clicking on a simple icon on
the desktop.  The installer will even transfer any file you created
with OpenOffice.org in Live mode to the hard disk. Freedom has never
been so easy to find!

簡單的說,就是不用安裝,一片搞定,你要安裝它,也是很容易的。
免費,而且也有中文版的唷!

14
雜七雜八 / 報稅
« 於: 2006-05-18 11:23 »
去年報稅軟體有linux的,今年我找不到耶,難道不支援linux了嗎?

15
雜七雜八 / MIS 賺錢途徑之一
« 於: 2006-05-08 15:48 »
剛看到一則新聞
http://tw.news.yahoo.com/060508/15/3406m.html
賣老闆的獲利比賣股票來得高。

16
Study-Area 公開討論版 / 24小時內發表的文章
« 於: 2005-12-29 16:49 »
看過某一站,有提供一個link,可以直接點取後,
列出按時間排序的最近24小時內的文章,我覺得這功能很好用,
平常我會按"最新文章列表",這樣可以看到我未看過的文章,
可以,若不小心把瀏覽器關了,就很難再找最新的文章了 -_-

17
肉腳版 / 如何關閉 eth0
« 於: 2005-12-19 12:14 »
我用 ifconfig eth0 down,用 /sbin/ifconfig 看不到 eth0,
可是,用別台機器透過網路的仍然可以ping及telnet到該ip。
kernel: 2.6.11.7
networak card: via-rhine.ko

我是菜鳥,請各位大大指點一下,怎麼完全關閉?

18
程式討論版 / 求質數---解
« 於: 2005-11-10 10:31 »
代碼: [選擇]

$ cat num.sh
#!/bin/sh
typeset -i i
typeset -i j
typeset -i n
typeset -i m
typeset -a a
echo "input number: "
read n
echo "number list:"
i=1
while [ $i -le $n ]
do
        a[$i]=0
        i=$i+1
done
a[1]=1
i=2
while [ $i -le $n ]
do
        j=2
        [ $(($i * $i)) -gt $n ] && break
        while [ $(($j * $i)) -le $n ]
        do
                j=$j+1
                a[$(($i * $j))]=1
        done
        i=$i+1
done
i=2
while [ $i -le $n ]
do
        j=${a[$(($i))]}
        [ $j -eq 0 ] && echo $i
        i=$i+1
done
$ ./num.sh
input number:
100
number list:
2
3
4
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97



三子,夠義氣了吧!

19
Linux 討論版 / 無法啟動無線網卡 ndiswrapper
« 於: 2005-09-16 17:03 »
我是使用 ndiswrapper,usb無線網路是 DWL-G122 B1,
驅動程式都裝好了
代碼: [選擇]

# iwconfig wlan0
wlan0     IEEE 802.11g  ESSID:off/any  
          Mode:Auto  Frequency:2.437 GHz  Access Point: 00:00:00:00:00:00  
          Bit Rate:11 Mb/s   Tx-Power:20 dBm   Sensitivity=-115 dBm  
          RTS thr:2347 B   Fragment thr:2346 B  
          Encryption key:off
...........
# iwlist wlan0 scan
          Cell 01 - Address: 00:11:D8:A8:FE:FA
                    ESSID:"wl500g"
                    Protocol:IEEE 802.11b
                    Mode:Managed
                    Frequency:2.412GHz
                    Quality:0/100  Signal level:-39 dBm  Noise level:-256 dBm
                    Encryption key:on
..............
# iwconfig wlan0 key restricted 1234567890
# iwconfig wlan0 essid wl500g
# iwconfig wlan0
wlan0     IEEE 802.11g  ESSID:off/any  
          Mode:Auto  Frequency:2.437 GHz  Access Point: 00:00:00:00:00:00  
          Bit Rate:11 Mb/s   Tx-Power:20 dBm   Sensitivity=-115 dBm  
          RTS thr:2347 B   Fragment thr:2346 B  
          Encryption key:1234-5678-90   Security mode:restricted
..........

似乎問題出在無法連上ap。

之前我用 linux-wlan-ng 可以連上,使用的key0為 12:34:56:78:90

20
Embedded 討論版 / [教學] linuxrc 實作剖析
« 於: 2005-08-15 16:14 »
linuxrc 實作剖析
本篇背景知識:linuxrc, busybox, initrd, bootloader(lilo or grub)

linuxrc 有何特異功能,請自行研究,本篇只說明如何應用。
linuxrc 通常在 initrd.img 內出現,由於此時所有檔案系統皆未掛載,
所以相關的 shell、binary、library 都要先包在裡面,甚至一些 kernel
可能沒有編譯進去的 modules 都要放在 initrd.img內。

如果你只使用一個 initrd.img 當成檔案系統的全部,沒有要把 root /
改成硬碟的 partition 的話,那就不需要 linuxrc,而且,我看 2.4.20
的 soruce,有一段是判斷,如果你的 root 是 ramdisk ,就不執行 linuxrc。

本篇測試的 kernel 都是 2.4.20 ,所以不同的版本,可能稍有不同。

先來看看一段很簡單的 linuxrc (本內容抄自 mdk 10.0)
代碼: [選擇]

#!/bin/nash
insmod /lib/jbd.ko
insmod /lib/ext3.ko
mount -t proc /proc /proc
mkdevices /dev
mount -t sysfs none /sys
mkrootdev /dev/root
umount /sys
echo 0x0100 > /proc/sys/kernel/real-root-dev
mount -o defaults --ro -t ext3 /dev/root /sysroot
pivot_root /sysroot /sysroot/initrd
handledevfs
umount /initrd/proc

nash是很小的 shell ,剛好把 linuxrc 需要的功能都放進去,
所以我們就選擇它了。
代碼: [選擇]
echo 0x0100 > /proc/sys/kernel/real-root-dev
是告訴 kernel ,我們的 root 是掛在第0個 ramdisk 上,
可以查一下
代碼: [選擇]
ll /dev/rd/0
brw-------  1 root root 1, 0  1月  1  1970 /dev/rd/0

若是 /dev/hda8 則是 0x308,查一下
代碼: [選擇]
ll hda8
brw-r-----  1 root root 3, 8  9月  9  2002 hda8
那個 3 及 8 就是你在 mknod /dev/hda8 b 3 8 中的 3 及 8,
不過,記得要轉成十六進位就是。
在 bootloader 中的 root=/dev/xxx 會傳到 /dev/root,
所以你要把 bootloader 內的 root=/dev/xxx 視為你的 root ,
就要用 mount 把它 mount 成 root 就成了。
再來是很多人的疑問,root 不是早被 initrd 掛用了嗎?沒錯,
所以我們要用 pivot_root 來改一下,
代碼: [選擇]
pivot_root /sysroot /sysroot/initrd
這個的意思是,原來的 root / 改由 /sysroot 來做 root / ,
而目前的 initrd 就改成掛在 /sysroot/initrd 底下,
這邊注意一下,initrd.img 內的 /sysroot, 及一般硬碟內的 /initrd
都是寫死的目錄,所以你把它們砍了,就開不了機唷!

如果我們不管 bootloader 傳入 root= 是何方神聖,我們就是要指定
/dev/hda8,也可以這麼做:
代碼: [選擇]

#!/bin/nash
mount -t proc /proc /proc
echo 0x308 > /proc/sys/kernel/real-root-dev

因為 kernel 預設會去跑 /sbin/init ,你都告訴它是 /dev/hda8 了,
它就會自己去抓來跑。

再來就是比較複雜一點的,NFS boot,由於比較複雜些,我們改用 busybox
的 sh 來用,當然,這個 initrd.img 的大小也會大很多。
代碼: [選擇]

#!/bin/sh
mount -t proc proc /proc
echo 0x100 > /proc/sys/kernel/real-root-dev
insmod mii
insmod via-rhine
insmod sunrpc
insmod lockd
insmod nfs
ifconfig eth0 192.168.0.88
route add default gw 192.168.0.1
[ -x /sbin/portmap ] && /sbin/portmap
mount -t nfs 192.168.0.2:/nfs /sysroot
killall portmap
pivot_root /sysroot /sysroot/initrd

其中 192.168.0.88 是本地 ip,192.168.0.1 是指 router,
192.168.0.2是指 NFS server 及其開於 /nfs 的目錄。

這個 NFS boot 的做法和第一個很像,只是要事先準備好連線工作,
最後把把 root 切換過去就成了。
要注意一點,這些工作都要在 linuxrc 內做,如果你留在 rc.sysinit 來
做就來不及了,會啟動不了唷!切記!切記!

再來,變化一下,如果你的 root file system 是一個 ext2 image file
放在 /dev/hda1 的 /root_fs.img ,也可以直接拿來開機,
代碼: [選擇]

#!/bin/sh
mount -t proc proc /proc
echo 0x100 > /proc/sys/kernel/real-root-dev
mkdir /mnt
mount /dev/hda1 /mnt
mknod /dev/loop0 b 7 0
losetup /dev/loop0 /mnt/root_fs.img
mount /dev/loop0 /sysroot
pivot_root /sysroot /sysroot/initrd


--
本文章自由轉載,需註明作者及出處

21
拾人牙慧 / [教學] 安裝/設定 ALSA 音效
« 於: 2005-05-26 11:54 »
ALSA(Advanced Linux Sound Architecture)

前言:
  一般我在 PC 安裝音效卡方式是在 install 時,就讓系統自己去偵測,
有測到,人生是彩色的,沒測到,就算了 :~ 本篇不是討論在一般圖形
介面上安裝操作,純綷是苦力安裝方式,適合冒險犯難的人士為之。

Kernel driver:
  由於舊的 OSS 音效方式不理想,所以現在改用 ALSA 方式, ALSA
功能較強大,缺點是,設定很麻煩!首先我們由 Kernel 下手,安裝一
下正確的驅動程式,我們看一下電腦上的音效卡是何方神聖:
代碼: [選擇]

# cat /proc/pci
......
Multimedia audio controller: VIA Technologies, Inc. VT82C686 AC97 Audio Controller
......

本範例是VIA的音效卡,所以我找了一下,是用這個 kernel module:
snd-via82xx,重編 Kernel 並載入 snd-via82xx ,先設一個設定檔
代碼: [選擇]

# echo "alias sound-slot-0 snd-via82xx" >> /etc/modprobe.conf

再來載入模組:
代碼: [選擇]

# modprobe snd-via82xx

如果沒問題,記得放入 /etc/modules.conf 內,免得每次重開機就要再
設一次:
代碼: [選擇]

# echo "snd-via82xx" >> /etc/modules.conf

再來就是為了讓有些只使用 OSS 方式的程式也能播放,你也要載入
snd-pcm-oss
代碼: [選擇]

# modprobe snd-pcm-oss
# echo "snd-pcm-oss" >> /etc/modules.conf  #一樣是為了自動載入


安裝 ALSA 程式庫及工具:
查查看有沒有 /usr/lib/libasound.so.xxx 的檔,沒有的話要安裝套件
 libalsa-xxx。工具程式則要 /bin/amixer 及 /bin/aplay ,前一個是設
定程式,後一個是播放程式,若無則安裝套件 alsa-utils-xxx ,最後
還要安裝必備的設定檔,放在 /usr/share/alsa ,若無,則安裝
libalsa-data-xxx 套件。

播放前準備:
一切就緒後,記得要打開音量控制,因為預設是「靜音」模式,很奇
怪的設定,播放前,先解除靜音模式:

代碼: [選擇]

# amixer set PCM 31 unmute
# amixer set Master 31 unmute

其中31是指音量大小,0~31代表0%~100%。

播放測試:
最後就是測試啦!
代碼: [選擇]

# /usr/bin/aplay /usr/share/sounds/KDE_Startup_new.wav


其他:
一些相關的 device:
代碼: [選擇]

# ll /dev/sound/
crw-------  1 thyme audio 14, 12  1月  1  1970 adsp
crw-------  1 thyme audio 14,  4  1月  1  1970 audio
crw-------  1 thyme audio 14,  3  1月  1  1970 dsp
crw-------  1 thyme audio 14,  0  1月  1  1970 mixer
crw-------  1 thyme audio 14,  1  1月  1  1970 sequencer
crw-------  1 thyme audio 14,  8  1月  1  1970 sequencer2
# ll /dev/snd/
crw-------  1 thyme audio 116,  0  1月  1  1970 controlC0
crw-------  1 thyme audio 116, 24  1月  1  1970 pcmC0D0c
crw-------  1 thyme audio 116, 16  1月  1  1970 pcmC0D0p
crw-------  1 thyme audio 116, 25  1月  1  1970 pcmC0D1c
crw-------  1 thyme audio 116,  1  1月  1  1970 seq
crw-------  1 thyme audio 116, 33  1月  1  1970 timer
# ll /dev/dsp /dev/adsp /dev/audio /dev/mixer /dev/sequencer*
lr-xr-xr-x  1 root root 10  5月 26 09:13 /dev/adsp -> sound/adsp
lr-xr-xr-x  1 root root 11  5月 26 09:13 /dev/audio -> sound/audio
lr-xr-xr-x  1 root root  9  5月 26 09:13 /dev/dsp -> sound/dsp
lr-xr-xr-x  1 root root 11  5月 26 09:13 /dev/mixer -> sound/mixer
lr-xr-xr-x  1 root root 15  5月 26 09:13 /dev/sequencer -> sound/sequencer
lr-xr-xr-x  1 root root 16  5月 26 09:13 /dev/sequencer2 -> sound/sequencer2


參考資料:
http://phorum.vbird.org/viewtopic.php?t=12205&highlight=alsa+amixer
file:///usr/src/linux/Documentation/sound/alsa/OSS-Emulation.txt
file:///usr/src/linux/Documentation/sound/alsa/ALSA-Configuration.txt
file:///usr/share/doc/HOWTO/HTML/en/Alsa-sound/Alsa-sound.html

--
本文章可非營利自由轉載,需註明文章作者及來源。

22
想買 Mandriva Linux Limited Edition 2005 的可以買到了,
心動的人快去行動吧!

此版使用 Firfox 1.0.2、Acrobat Reader 7.0、The GIMP 2.2、
OpenOffice.org 1.1.4 以及提升速度10% 的 KDE(註:我不知道
是跟哪一個版本比)

原文如下:
Flash Newsletter: Mandriva Linux Limited Edition 2005 is now shipping!

Limited Edition 2005 has been out for only a month, and it already
appears to be a great success, with several positive reviews.

With many new features and Firefox 1.0.2, Acrobat Reader 7.0, 10%
faster KDE,The GIMP 2.2, OpenOffice.org 1.1.4 and other up-to-date
software, this new release provides all the best and most advanced
features you can currently find in a Linux distribution.

This great product is now shipping. Order your copy today and get it
delivered to your door within a few days!

Choose your Limited Edition 2005 from the following:
- DVD Case (includes both a 32-bit DVD and a 64-bit DVD)
- Downloadable version at a special 10% discount, available via a
  dedicated high speed connection (for all LE2005 versions, including
  CDs and DVD, 32 and 64-bit!)
- DVD Case plus downloadable version, only 10% more than the DVD case
  version (if you need to install the LE2005 immediately)

Visit Mandriva Store to order:
http://store.mandriva.com/product_info.php?products_id=218

Mandriva Club Members can download Mandriva Linux Limited Edition
2005. Standard Members have access to the 4-CD version!

Silver members and above have access to the full commercial product, as
a 6-CD set or a single DVD!

Join the Club and download today!
http://www.mandrakelinux.com/en/club/?fnl=20050524

        Mandriva Online Team.

------------------------------------------------------------------
All Mandriva products & services:
http://www.mandrivastore.com?fnl=20050524
Join the Club! http://www.mandrivalinux.com/en/club/?fnl=20050524
------------------------------------------------------------------
The Mandriva Linux Community Newsletter is available in English, French,
German, Spanish, Dutch, Portuguese.
Please select the following link to:
* Request a different language for the next newsletter
* Receive the next newsletter in a different format (plain text or HTML)
* Unsubscribe to the newsletter
http://www1.mandrivalinux.com/cgi-bin/regnl.pl?em=thyme%40ms11.url.com.tw&ctr=y

23
最近被太陽公公曬得很黑,忙著漂白,一時沒空上來灌水 :(

這篇要和大家聊的是嵌入式系統的電源管理,如果你沒玩過嵌
入式系統,你可能不知道電源管理有多麼重要。在一般 PC 上,
一般人都會想盡辦法提高運作效能,至於要消耗多少電能,完
全不在乎,跑得快就好了,在嵌入式上觀念就要改了,主要原
因不在於節約能源,而在於嵌入式系統有很多是用電池來供應
電源,無法長期保有足夠的電能可供使用,舉例來說,大家常
用的大哥大,如果待機時間只有半天,就算你功能再好,也帶
不出門,最低限度是能使用一天,晚上回家能充電,這樣的實
用價值才高。

電源管理和硬體設計有很大的關連,如果 CPU、主機板沒有這
麼設計,那一切都是白搭的,x86 的我不熟 ;p,我們用 ARM7
來說明,其實也只能聊聊,因為我手邊沒有詳細資料。

電源管理並不是只有簡單的螢幕保護而已,一般嵌入式都是用
LCD螢幕,只要不開背光,就很省電了,真正吃電的怪獸在於
CPU 及 DRAM ,真正省電就要關閉這兩個。一般設計都會有好
幾個模式,一是正常模式,一是 standby 及 suspend 模式,
suspend 也就是通稱的 sleep 模式,最省電就是這個模式,
一切在「冬眠」,但是也最不容易「醒來」,而 standby 只
能算是坐著休息而已。

standby一般只是關閉週邊,而 CPU 及 RAM 還在正常模式跑,
能省的電不多,軟體設計上也容易些,問題並不大,suspend
則比較麻煩些,通常嵌入式的主機板都會包含了必備的週邊,
但仍然會有廠商要另外加入的硬體,例如無線網卡等,這時
也要考慮進去,由於主機板不知道你週邊要接什麼,所以週邊
的 I/O port 的電源要自己去控制,就算是空接,設 0 和設1
的耗電量都不一樣,這都要考慮進去。

suspend 的進入及醒來都不太容易,當初我也是研究了好久,
ARM7 設計的 suspend 模式是 CPU、Clock 全部關閉,完全不
耗電。而 RAM 比較麻煩一點,RAM 要不斷的充電才能保有資
料,此時就要讓 RAM 進入另外一種模式,使用另外較慢的
Clock 來充電,但此時是不能做資料存取的動作,我特別提到
這個是跟進入 suspend 有關,當初沒有想到這一層,才會花
了我好多精神在這上面,你可以想像一下電腦怎麼跑程式的,
磁碟資料放入 RAM 上,再後 CPU 由 RAM 載入二進位程式碼
來執行,如果 RAM 關了,不能存取,那 CPU 怎麼執行 suspend
的必要動作?若 CPU 關了,那就沒法叫 RAM 進入 suspend了。

在這情形下,就要用到 CPU 的 cache 了,如果程式碼不多,
那一般情形下,要執行的程式片斷會先放在 CPU cache 去,
cache 的電源是和 CPU 同進退的,所以就算 RAM 關了,也不
會影響到程式的執行的,再來就是一些執行所需的資料,要先
載入 CPU 的暫存器內,不能臨時再跑去 RAM 裡面拿,因為關
閉 RAM 了,所以一拿就會當了。

再來就是醒來的動作了,醒來是用按 power 鍵的動作,這個
power 鍵一按就是從位址零開始執行,它是不管你是被吵醒還
是重開機,都由零關始執行,所以你放在位址零的程式就要先
自己判斷,要檢查一下狀態,是普通開機還是 suspend 的醒
來,如果是 suspend 的醒來,那就要先還原 RAM 的正常狀態
然後載入 CPU 暫存的 suspend 前的一些資料,如剛剛的執行
位址點,然後再由 suspend 前的下一行程式開始執行。通常
這些動作都在 kernel 內完成,而且要用組合語言來寫,因為
很多動作有一定的順序,順序錯了,一切都掛了。

會不會覺得好像還蠻麻煩的?沒錯,嵌入式就是比較麻煩些,
而且不僅要懂軟體,硬體也要懂一些,不然很難理解,為什麼
要這麼做,而軟體也要出動古老的組合語言,不然就搞不定了。

--
本文章可非營利自由轉載,需註明文章作者及來源。

24
工作機會 / 中華電信徵人
« 於: 2005-05-06 17:49 »
http://www.cht.com.tw/  的公告區
http://www.cht.com.tw/CompanyCat.php?CatID=4&NewsID=703&Page=HotNewsDetail

貳、遴選方式:分二試舉行
  一、筆試:普通科目(佔 30%)、專業科目(佔 70%)
  二、口試:依筆試成績擇優錄取參加口試。
  第一試筆試成績與第二試口試成績合併計算總成績。成績計算請詳公告簡章。

參、報名日期:94 年 5 月 9 日 09:00 起至 94 年 5 月 16 日 24:00 止。

肆、報名方式:一律上網報名,每位應考人限報考一類科(依代號區分)。

伍、報名費:新台幣伍佰元整,不另收其他費用,報名後除資格不符者退報名費外,其餘概不退還。

25
好康報報 / for linux 的繳稅軟體
« 於: 2005-05-04 14:34 »
http://tax.nat.gov.tw/irc/irc_main.htm

線上申報 【Mac及Linux系統使用】(94年5月01日開放使用)
 
本系統目前適用之申報環境如下:
     Mac:
          作業系統-OSX
          瀏覽器-Safari 1.2
     Linux:
          作業系統-Redhat9,Fedora3
          瀏覽器-Mozilla 1.7x
          ***請注意!! 非使用指定版本作業系統及瀏覽器,請勿嘗試上傳申報,以免影響您的權益

26
程式討論版 / [教學] BASH 變數疊代範例
« 於: 2005-04-14 10:28 »
有稍微學過 BASH 的人都知道 eval 可用來做變數的疊代,
那有什麼用途呢?在大量變數名稱都很有相關性時,就會有用了,
有點像 C 的指標功能,某些時候還很好用呢!
講 shell 的書都會提到 eval 的用法,這邊就不說明,
直接舉一個實際範例:
代碼: [選擇]

[thyme@thyme test6_sh]$ cat eval.sh
#!/bin/sh
netman="網中人"
jou="老人"
three_son="三子"
breakfast="早餐"
lunch="午餐"
dinner="晚餐"
netman_breakfast="卡布奇諾咖啡"
netman_lunch="雞腿飯"
netman_dinner="歐式自助餐"
jou_breakfast="奶茶"
jou_lunch="排骨飯"
jou_dinner="炒飯"
three_son_breakfast="礦泉水"
three_son_lunch="涼麵"
three_son_dinner="魯肉飯"

for i in netman jou three_son; do
        for j in breakfast lunch dinner; do
                str_tmp1=$(eval echo \$$i)
                str_tmp2=$(eval echo \$$j)
                str_tmp3=$(eval echo \$${i}_${j})
                echo "${str_tmp1}的${str_tmp2}是${str_tmp3}"
               
        done
done
[thyme@thyme test6_sh]$ ./eval.sh
網中人的早餐是卡布奇諾咖啡
網中人的午餐是雞腿飯
網中人的晚餐是歐式自助餐
老人的早餐是奶茶
老人的午餐是排骨飯
老人的晚餐是炒飯
三子的早餐是礦泉水
三子的午餐是涼麵
三子的晚餐是魯肉飯

--
本文章自由轉載,需註明文章作者及來源。

27
如果你常在 Linux 上跑 Mozilla,你會發覺 Mozilla 有一項設計不是頂
好用的,那就是你再執行一次 Mozilla 時,它會出現一個視窗,說已
經有人在使用,請你選擇另一個 profile ,可是另一個使用者,就是自
己呀!為何要再叫自己選擇呢?嗯,我們這就來談談如何解決這個問題。

Mozilla 這麼設計當然有其理由,理由是什麼,我也不清楚,也許是為
了多人多工吧!其時 Mozilla 本身也留有解決這問題的方法,只不過沒
有特別為了這個寫個簡單的 Script 來處理而已。

第一步,我們要先看 Mozilla 有沒有正在執行,有很多方法可以知道,
我這邊提供一個直接由 Mozilla 本身去判斷的方法,先假設我的 Mozilla
放在 /usr/local/mozilla/ ,而 Mozilla 執行檔是 /usr/local/mozilla/mozilla
代碼: [選擇]

#!/bin/bash
/usr/local/mozilla/mozilla -remote "ping()" &> /dev/null
if [ $? -eq 0] ; then
  echo "mozilla running"
else
  echo "no no no"
fi

就是呼叫 mozilla 去執行 ping 自己的動作,回傳 0 就是有在跑,
很簡單吧,不用使用 ps 什麼再去尋找。

再來就是,如果 mozilla 還在執行中時,我們要通知該 Mozilla ,
讓它開新視窗即可,方法如下:
代碼: [選擇]

#!/bin/bash
/usr/local/mozilla/mozilla -remote "ping()" &> /dev/null
if [ $? -eq 0] ; then
  echo "mozilla running"
  /usr/local/mozilla/mozilla -remote "xfeDoCommand(openBrowser)"
else
  /usr/local/mozilla/mozilla -splash
fi

這次也是用 remote 參數來通知 Mozilla 去呼叫執行中的程式。
而其中的 splash 參數可以不用加,這個參數是告訴 Mozilla ,在正式
視窗跑起來前,先來一個片頭視窗,這又有什麼用呢?就是讓使用者
知道 Mozilla 有在跑了,不要心急,也會讓使用者有一個錯覺,好像
開啟的速度比較快。

還沒結束唷!還有一個很類似的問題,明明 Mozilla 全都關了,甚至
才重開機,怎會也跑出叫我選擇 profile 的畫面呢?這次就錯在 Mozilla
了,因為種種原因,它的 lock 檔沒有砍掉,就會出現這種情形,解決
方法就是先找出 lock 檔,再砍除,但是要注意,如果已經在執行中時,
就不能亂砍唷!
代碼: [選擇]

#!/bin/bash
/usr/local/mozilla/mozilla -remote "ping()" &> /dev/null
if [ $? -eq 0] ; then
  echo "mozilla running"
  /usr/local/mozilla/mozilla -remote "xfeDoCommand(openBrowser)"
else
  ls ~/.mozilla/*/*/lock >/dev/null && rm ~/.mozilla/*/*/lock
  /usr/local/mozilla/mozilla -splash
fi


最後,或許有人會問,我是用 Firefox ,又不是古董的 Mozilla ,那
怎麼辦?我也不清楚 Firefox 在這方面有沒有做更貼心的設計,但是
解決方法都類似,範例如下,我就不再多說明了。
代碼: [選擇]

#!/bin/bash
/usr/local/firefox/firefox -remote "ping()" &> /dev/null
if [ $? -eq 0] ; then
  echo "firefox running"
  /usr/local/firefox/firefox -remote "xfeDoCommand(openBrowser)"
else
  ls ~/.mozilla/*/*/lock >/dev/null && rm ~/.mozilla/*/*/lock
  /usr/local/firefox/firefox
fi

上段程式砍除 lock 的並沒有寫錯,Firefox 的 lock 放的位置不太一樣,
但是,上面的砍 lock 檔的方法對兩者都適用。

這堂課到此為止,各位同學下課囉!
--
本文章自由轉載,需註明文章作者及來源。

28
接上次還沒講完關於中文的部份。

在這之前先介紹一個函數--source 這個 source 功能和 BASH 的
source 類似,也和 C 的 include 類似。我們就利用這個函數自己
去載入翻譯檔就沒問題了。

修改一下前一篇的範例檔(此檔名仍為msgcat_exp1.tcl):
代碼: [選擇]

#!/usr/bin/wish
# Tcl/Tk 範例 2005/03/31 thyme

# mcload: 載入翻譯檔的目錄路徑
# ::msgcat::mcload "./msgs/"
# 等下自行判斷載入

# 看看目前是什麼語系
# 中括弧是執行的意思,就如 bash 的 ``
# 給變數的值是用 set
set language [::msgcat::mclocale]
puts "language is $language"

# 自己判斷載入
# 先檢查檔案在不在
if [ file isfile "./msgs/${language}.msg" ] {
# 載入翻譯檔
    source "./msgs/${language}.msg"
}


set hello_en "hello"
set ok ""
set hello_s ""

# 翻譯字串
namespace eval ::msgcat_exp1 {
        set hello_s [::msgcat::mc "hello"]
        set ok [::msgcat::mc "ok"]
}
# 先印原始字串
puts "$hello_en"

# 再印翻譯字串
puts "$hello_s"

puts "$ok"
exit


簡單說,就是自己判斷語系,然後自行載入翻譯檔就對了。

使用上一篇相同的翻譯檔,執行結果如下:
代碼: [選擇]

[thyme@thyme tk]$ export LC_MESSAGES=to
[thyme@thyme tk]$ ./msgcat_exp1.tcl
language is to
hello
tolow
susu
[thyme@thyme tk]$ export LC_MESSAGES=C
[thyme@thyme tk]$ ./msgcat_exp1.tcl
language is c
hello
hello
ok
[thyme@thyme tk]$ export LC_MESSAGES=zh_TW
[thyme@thyme tk]$ ./msgcat_exp1.tcl
language is zh_tw
hello
哈囉
確定


如果沒有該語系的翻譯檔,那會如何呢?不用擔心,它就什麼都不
翻譯,用你程式所寫的字串即是了。

各位同學,這堂課就上到這兒,班長,下課。
--
本系列文章自由轉載,需註明文章作者及來源。

29
不快點切入主題,會再被人點名,說我是來騙吃騙喝的!
(咦,午餐也要自己出錢買,茶水也要自己倒,怎麼個騙吃騙喝法?)

Tcl/Tk 的多國語言使用方法全在 msgcat 這個 function 上了,一切
由它開始。它使用概念和之前談過的 xgettext 類似,直接把一個字串
當做是 index ,再去跟據系統目前設定的語系,找出翻譯好的字串,
詳細使用方法請查 man n msgcat 。

來看看範例,此程式名稱為 msgcat_exp1.tcl :
代碼: [選擇]

#!/usr/bin/wish
# Tcl/Tk 範例

# mcload: 載入翻譯檔的目錄路徑
::msgcat::mcload "./msgs/"

# 看看目前是什麼語系
# 中括弧是執行的意思,就如 bash 的 ``
# 給變數的值是用 set
set language [::msgcat::mclocale]
puts "language is $language"

set hello_en "hello"
set ok ""
set hello_s ""

# 翻譯字串
namespace eval ::msgcat_exp1 {
        set hello_s [::msgcat::mc "hello"]
        set ok [::msgcat::mc "ok"]
}
# 先印原始字串
puts "$hello_en"

# 再印翻譯字串
puts "$hello_s"

puts "$ok"
exit

再來就是翻譯檔,再建立一個目錄 msgs ,及在此目錄下,建立一個
名為 to.msg 的檔:
代碼: [選擇]

# 某土話的語系叫 TO,檔名要改成小寫,附檔名是 .msg
# 下一行的 msgcat_exp1 要配合你呼叫的 program 的檔名
namespace eval ::msgcat_exp1 {
# 土話 hello 的翻譯為 tolow
        ::msgcat::mcset to "hello" "tolow"
# ok 的翻譯為 susu      
        ::msgcat::mcset to "ok" "susu"
}

也另外建一個檔 msgs/zh_tw.msg
代碼: [選擇]

# now 是 zh_TW ,要改成全小寫
# msgcat_exp1
namespace eval ::msgcat_exp1 {
# zh_tw 是要翻的語系,如果是法文就是 fr 之類的。
        ::msgcat::mcset zh_tw "hello" "哈囉"
        ::msgcat::mcset zh_tw "ok" "確定"
}


mcload 會自動去輸入的路徑找相關語系的翻譯檔,如 en_US 就找
en_us.msg ,zh_TW 就自動找 zh_tw.msg (一定會自動改成小寫),
所以翻譯檔的檔名不能隨便亂取。

再來看看執行結果:
代碼: [選擇]

[thyme@thyme tk]$ export LC_MESSAGES=en
[thyme@thyme tk]$ ./msgcat_exp1.tcl
language is en
hello
hello
ok
[thyme@thyme tk]$ export LC_MESSAGES=to
[thyme@thyme tk]$ ./msgcat_exp1.tcl
language is to
hello
tolow
susu


咦,怎麼不試中文的?因為我試中文會有亂碼,要用另一種方式,
喝個水,下篇再討論。

(報告站長,在 code 中的「程、現、設」 出現亂碼)

30
最近諸事不順,寫寫文章發洩一下。

在介紹之前,先提一下 Tcl/Tk ,
這也是一種 Shell Script,但是,有可提供簡單 GUI 的設計,
對於 X 上面的簡單圖形介面設計實在很方便,
如果你喜歡 Shell 的程式,又不希望太呆板,
改版容易,不用每次都 complie 一番,
那就試一下,你會喜歡的。

(呃,時間不夠,下星期再續)

頁: [1] 2 3