五專同學 – LionP

為什麼要稱他為 LionP, 因為他是獅子座,姓的第一個英文字母正好是P.在這個虛擬的網路世界中,暫且就先這麼稱呼吧.
在我記憶中,他做過最驚世駭俗的事,莫過於某次小考,他承認作弊吧.那次是電子邏輯的小考,考題還好,我記得 LionP 跟隔壁同學趁老師不注意時交換答案,老師似乎發覺了,但不確定,於是叫全班停筆,試圖找出兇手,班上沉默了許久,LionP這時很驚人地站了起來,說他作弊,老師就請他出去,LionP很瀟灑的就拿著書包出去了.班上同學,後來都覺得不值,反正老師又不知道是誰,也沒辦法拿我們怎麼樣.之後,LionP這一科被當掉~真的是很酷~
忘記是幾年級的時候,他的腿骨折受傷,花了整整一個學期,才恢復正常.也因此無法打籃球.他非常熱愛打籃球,也很喜歡聽英文歌.近代史,日本戰國史也非常在行,在考預官的時候,他幾乎沒看什麼書,就輕鬆考上,真的是很厲害.
拜他所賜,我也很喜歡日本戰國史,對織田信長,武田信玄,上杉謙信,毛利元就…等名將,如數家珍.
有一陣子,他在公館大亞打工的時候,遇到一位老師,教他紫微斗數,對此非常熱心,曾為班上一些同學排過命盤.我也給他排過,我忘記命盤格局的名字了,大致的意思是我屬於比較孤僻的人,不善於人交往.我覺得還蠻準的,不過我也相信自己的命運是可以自己改變的.
也有一陣子,他認識一個崇光女中的小女生(應該是崇光吧),交往了一陣子,後來則不知道怎麼了.
喔,對了,他也是一個極佳的牌搭子,我們下課的時候,常常在一起打橋牌.
專五的時候,我要去教務處申請成績單,因為要一起去打電動的緣故,於是就請他陪我一起去.到了教務處,我害羞不敢開口,他看不過去,就幫我開口問了.而我,居然連說謝謝都不好意思.這件事情,我一直銘記於心.後來的日子了,我常以此事為誡,告訴自己要大膽些,不要怕”問”.
五專以後,他考到雄技,到高雄唸書去了,也認識了一個女友.當兵時,則是當傘兵,雖然剛下部隊時,太操而使得腿再度疲勞性骨折,但也很順利的退伍了.
之後到了長榮做事,然後就訂婚.
接著~~就消失了~~
記得是兩三年前吧,我試圖打電話跟他聯絡,但卻找不到人,在此之前,雖然找不到人,也還能和他母親聊聊,這次連他的家人都找不到,就這麼消失了.
我知道他的父親或母親的老家是在新竹,而他的女友兼未婚妻則是住在高雄,因此我猜想他是舉家搬到新竹或高雄去了.
叨叨絮絮,零零散散的寫了這些,謝謝他給我的幫助,也藉此拋磚引玉,也許可以藉此找到他來參加今年的同學會~^_^

J2SE in linux安裝導引

首先到 Sun(http://java.sun.com) 網站下載最新版的 j2se for linux.
假設你下載的是最新版的 1.4 版,檔名是 j2sdk-1_4_0-fcs-linux-i386.rpm.bin
並放到 /download 資料夾中
$chmod +x j2sdk-1_4_0-fcs-linux-i386.rpm.bin
$./j2sdk-1_4_0-fcs-linux-ie86.rpm.bin
此時會詢問你是否同意其版權,選擇 yes 以後,將會解出 j2sdk-1_4_0-fcs-linux-ie86.rpm
$rpm -ivh j2sdk-1_4_0-fcs-linux-i386.rpm
這樣子就安裝完成了,預設會安裝到 /usr/java/j2sdk1.4.0/ 下,接著要做一些設定
請用你順手的文書編輯器,編輯 /etc/profile
加入這幾行
# Java
export CLASSPATH=.:/usr/java/j2sdk1.4.0/lib
PATH=”$PATH:/usr/java/j2sdk1.4.0/bin”
把 CLASSPATH 和 PATH 都指向 /usr/java/j2sdk1.4.0/ 下~
登出再重新登入之後,應該就可以使用 j2se 了
讓我們編寫一個簡單的 java 程式來實驗看看,程式碼如下

class HelloLinux {
public static void main(String[] args) {
System.out.println("Hello Linux!!");
}
}

並命名為 HelloLinux.java
用 javac HelloLinux.java 編譯之.
用 java HelloLinux 執行之,注意,此處不可以用 java HelloLinux.class, 否則會發生錯誤!!這也是初學者常有的錯誤之一~
運行順利的話,你應該會看到
Hello Linux!!
Yes, Hello Linux
絕佳的學習指引:
http://java.sun.com/docs/books/tutorial/
碁峰有把這部分出書~現在已經出到 3rd Edition 了~不錯!

Freebsd 4.5初探心得

  1. bsd 的磁碟分割與 linux 大不同,bsd 是先分割出一個分割區之後,再在該分割區上分出掛載點及 swap 等.
  2. 沒有 ifup, ifdown, /proc/net/dev, 因此只能利用 ifconfig rl0 up, ifconfig rl0 down,
    ifconfig -l 來代替.
  3. 沒有 /proc/net/dev,因此無法利用他來看網路卡的 rx bytes, tx bytes, 但可以利用 netstat -I rl0
    -b 來看
  4. df -h 和 linux 的大致相同,但 Use% 換為 capacity
  5. 沒有 /etc/sysconfig/network-scripts/ifcfg-eth0, 統一存放在 /etc/rc.conf 裡面. 如果是rl0,
    那麼該檔裡面會有一行 ifconfig_rl0="…….". 當 rl0 欲設為 dhcp,那麼 ifconfig_rl0="DHCP"即可.若欲設為static,
    那麼就要設 ifconfig_rl0="inet 192.168.0.1 netmask 255.255.255.0"
  6. dhcp 無法在 rc.conf 中設定後,再用 ifconfig rl0 up 取得,而須利用 dhclient rl0 來取得
  7. 可用 /stand/sysinstall 這個管理工具來更動 rc.conf 中的內容

套件粉多,但預設都不會裝進去~~我想有可能是我不會選吧~
總之都是我後來自行安裝進去的.
安裝一套的速度頗快,不用一個小時就裝完了,很類似 debian, 都是先把 kernel 的東西裝進去之後,才讓你選套件.我想這就是快的原因吧.

努力過年

過年很努力的看了幾部電影
美國派II
BJ單身日記
Monster Inc.
名偵探柯南-往天國的倒數計時
美國派II 是不錯的娛樂片
BJ單身日記,有點悶,但我想對於一些單身的人來說,他們的感觸會比較多吧~女主角的演技蠻突出的,尤其是一開頭的部分~聽說女主角有因此入圍的樣子
Monster Inc. 承繼 Disney 的一貫特色~溫馨又感人
名偵探柯南,我想這就沒什麼好說的了~就是偵探片囉~
^_^
最近遠流有在推克麗絲蒂系列的推理小說,東方快車謀殺案跟另外一本忘了名字的特賣 69 元,有興趣的人可以去買來看,全套共 80 本,用信用卡付賬,一萬多元.(有點在拍賣的感覺, 8-p)

RAMDisk on Linux

dd if=/dev/zero of=/dev/ram bs=1k count=32768
mke2fs /dev/ram
mount –t ext2 /dev/ram /mnt/ramdisk
這樣就有個Ramdisk的Parititon
進一步的應用,
要修改的地方還有lilo.conf, fstab, rc.local…

Apache SSI 筆記

設定:
在 <directory xxxx> </directory>中的 options 加上 "+Include".
若不想執行外部程式,則改用 IncludeNoExec

慣例命名:
一般都以 .shtml 或 .shtm 來命名.

命令格式:
<!–#命令 引數1=xxx 引數2=xxx…->

命令可以是:

1.config: 可用於顯示錯或設定時間,檔案大小的格式

引數有: errmsg, sizefmt, timefmt
如:<!--#config errmsg="error" -->
<!--#config sizefmt="bytes"-->
<!--#config timefmt="%m/%d/%y"-->

2.echo:列印變數

如:<!--#echo var="DATE_LOCAL"-->

3.exec:執行外部程式

如:<!--#exec cgi="/cgi-bin/prog.cgi"-->
<!--#exec cmd="prog"--> 會啟動 shell 來處理

4.fsize:印出指定檔案的大小

如:<!--#fsize file="路徑"-->
<!--#fsize virtual="URL"-->

5.flastmod:印出檔案最後修改日期

如:<!--#flastmod file="路徑"-->
<!--#flastmod virtual="URL"-->

6.include:將某檔案含括進來

如:<!--#include file="路徑"-->
<!--#include virtual="URL"-->

7.printenv:印出所有環境變數

如:<!--#printenv-->

8.set:自行設定變數

如:<!--#set var="home" value="index.shtml"-->

SSI 預設的變數:

  1. DATE_GMT
  2. DATE_LOCAL
  3. DOCUMENT_NAME
  4. DOCUMENT_URI
  5. LAST_MODIFIED

流程控制:

<!--#if expr="${REMOTE_HOST}=/206\.171\.50/&&${DOCUMENT_NAME}=/${DATE_LOCAL}/"-->
<!--#else-->
<!--#endif-->
p.s.若是變數,要加上${}以示區別.

devfs 架設過程實錄

devfs, 讓我想起 Linuxer 第 20 期正好有這麼一篇介紹的文章.
大家可以參考這篇文章來作做看.
以下是我嘗試架設的過程,我使用的kernel是 2.4.7-10:
首先要先把 kernel 中的選項打開,但是第一次進去找,我始終都找不到這個選項,後來把 “Prompt for development and/or incomplete code/drivers” 此選項打開之後,才在 File System 裡面找到.
然後就把他打開,重新 build kernel.
依照慣例,把 vmlinux, vmlinuz, System.map 都複製到 /boot 之後
我很快樂的重新開機,結果,開不起來. poor.
原來是因為沒有安裝 devfsd 的緣故~ Linuxer 的文章中有提到,而我以為 kernel 裡面已經有了說~ sad ~
上網去找到 devfsd.tar.gz, 這是最新的版本,不是 1.3.9 的喔~
下載之後,執行 make 來重新編譯
無法編譯,依照編譯的錯誤訊息指示
我在 linux/devfs.h 裡面的 #define DEVFSD_NOTIFY_CREATE 後面加上
#define DEVFSD_NOTIFY_DELETE 7
這行
同時在 make 的時候改用下列敘述來 make (這是在make時指定環境變數的方法)
KERNEL_DIR=/usr/src/linux make
然後就 compile ok 了
接著執行
make install
依照文章指示,/etc/rc.d/rc.sysint 裡面還要有一行
[-e /dev/.devfsd -a -x /bin/devfsd] && /sbin/devfsd /dev
可是我的 /etc/rc.d/rc.sysint 檔案裡面早就已經有了
注意,這一行要放在很前面喔,否則我猜想可能會開不起來
於是再重新開機
果然就 ok 了~~
可是,文字模式下的滑鼠起不來
於是我又把 /etc/sysconfig/mouse 裡面的 DEVICE 改為 /dev/psaux
重新開機後,文字模式下的滑鼠就 ok 了
可是有些特定的設備,我還不會設定( 設定檔在 /etc/devfsd.conf )
比如我自己寫的一個 driver 還是起不來~~
devfsd 相關的套件,可以利用 Google 搜尋引擎找到.
個人覺得 devfs 與原來的 /dev 相容性蠻高的,幾乎不用作什麼修改.在Documents/filesystems/devfs/README 這份文件說的蠻清楚的,什麼有支援,什麼不支援,裡面都有說~
/dev/mouse 是確定不支援的,要改成 /dev/psaux;其他的一些 driver,我想修改 /etc/devfsd.conf 應該一切都能搞定,只是我還不會設.
coding 的話~~
現在所有中文有關 kernel 的書,講到的 register_chrdev() 都是舊的方法.
如果要支援 devfs 的話,直接使用
devfs_register_chrdev() / devfs_unregister_chrdev()
devfs_register_blkdev() / devfs_unregister_blkdev()
devfs_register() / devfs_unregister()
來註冊,跟原來的語法用法是很接近的
函數的原型參考,可以在 include/linux/devfs_fs_kernel.h 裡面找到
事實上在 devfs_fs_kernel.h 裡面
已經有利用 CONFIG_DEVFS_FS 來作判斷了
當 CONFIG_DEVFS_FS 有被定義的時候, devfs_register() / devfs_unregister() 是有東西的,如果沒被定義,那麼則是空殼子~
此外 devfs_fs_kernel.h 裡面有許多關於 devfs 的函數,而函數的實作則是放在 fs/devfs/base.c 裡面~
driver 寫的時候,建議的順序是這樣子的(看了兩三個driver的source才了解)
1.用 devfs_handle_t 宣告一個 handle.
2.用 devfs_register_chrdev() / devfs_register_blkdev() 註冊裝備的動作,MAJOR號碼以及名稱
3.再用 devfs_register() 去 /dev 裡面註冊一個設備檔案
當然如果有很多的話,可以先用 devfs_mk_dir() 去註冊一個目錄,再利用 devfs_register_series() 去註冊一狗票的設備檔案或者利用迴圈去註冊一狗票的設備檔案.
然後就 ok 了
release 的時候,則是:
1. 先 devfs_unregister() 掉設備檔案
2. 再 devfs_unregister_chrdev() / devfs_unregister_blkdev()

Stream Server – icecast 架設實錄

前兩個星期在 Linux fab 上看到一則新聞
說 icecast 已經釋出新版本了
But what is icecast?
仔細一看
才明白,原來他是一個 stream server,就類似微軟的 media service.
這樣講也許還不是很清楚,拿個實例來說吧:如廣播電台,目前廣播電台都已經可以在網路上收聽了,他們就是架設一個 server 並提供一個 url, 讓你在 media player 或 real player 裡面輸入,於是你就可以收聽到即時的節目了.又比如之前紅極一時的Naked News也是這樣子做的,只是他們輸出的是影音新聞節目.
架設的時候你必須到 icecast 網站先取得 icecast 套件,目前最新的版本是 1.3.11.
取得之後,依照 linux 的慣例安裝三部曲,輸入
./configure
make
make install
於是安裝完成~~
接下來我切換到套件預設的安裝路徑 /usr/local/icecast/
將 conf 裡面的 icecast.conf.dist 複製到 /etc, 並命名為 icecast.conf
修改裡面的
streamurl 為 http://redhat71
server_name 為 redhat71
接著就要啟用囉
請輸入
/usr/local/icecast/bin/icecast -c /etc/icecast.conf -b
以啟動 icecast server
當然到這裡都很簡單,只是依照套件內附的文件行事而已
接下來,要怎麼讓音樂播放出來呢??
這可讓我傷透了腦筋
最後才在 icecast 網站的 getting start找到方法.
我用的是 shout, 這同樣也是 icecast 網站提供的另外一個套件
請下載 shout ,依照 linux 慣例安裝三部曲來安裝.
接著,要製作 mp3 play list
我們可以利用如下指令來製作
find /mnt/cdrom -name *.mp3 -print >> /etc/mp3.lst
不過據我實驗的結果,中文的檔案名稱似乎無法用 find 來取得~~討厭~~
本來想把所有的 mp3 都用 stream server 來播放的~
最後就可以使用如下的指令來將 mp3 塞到 stream server 了
/usr/local/icecast/bin/shout localhost -P hackme -a -x -p /etc/mp3.lst -l -n “A sample name”
shout 可接的參數,在此就不再贅述,可以自行加上 –help 參數來取得.
(看到 localhost 了嗎??這表示你也可以從遠端來控制要播出的節目喔.)

boolean in C

在 C 裡面並沒有 boolean 這種型態的變數
而是使用整數型態來代替
因此常常我們會看到
#define TRUE 1
#define FALSE 0
但是
true 真的是 1 嗎? 那麼 -1 會不會比 1 來個更好,因為所有的 bit 都是 1?
而 false 真的是 0 嗎??
前幾天在看某個程式的 Source code 的時候
我發現它是這樣子定義的
#define TRUE (1==1)
#define FALSE (0==1)
真的很聰明~~
簡單的說
(1==1) 一定是真~~
(0==1) 一定是假~~
compiler 會自己去求出 (1==1) 跟 (0==1) 的值
這樣子就不用我們自己去定義一個特定的數值
將來轉換平台或環境的時候
可以減少轉換的阻礙~~
很簡單的方式,完全讓編譯器去決定 TRUE 跟 FALSE 的值~

RPM常用指令

rpm 的幾個必要用法:
安裝:
rpm -i lcdctld-1.0.0-1.i386.rpm
rpm -ivh lcdctld-1.0.0-1.i386.rpm #加上 vh 是顯示安裝進度及狀態
rpm -i ftp://your_site/lcdctld-1.0.0-1.i386.rpm #從 ftp 站下載並安裝
升級:
rpm -U lcdctld-1.0.1-1.i386.rpm
rpm -Uvh lcdctld-1.0.1-1.i386.rpm #加上 vh 是顯示升級進度及狀態
移除:
rpm -e lcdctld-1.0.0-1.i386.rpm
求助:
rpm –help
man rpm
如何了解目前 rpm 包的一個狀態(用個大陸用法”包”,別介意):
檢查是否有檔案被誤刪:
rpm -Va
查詢檔案屬於哪個包:
rpm -qf /usr/sbin/lcdctld
查詢包的資訊
rpm -qpi lcdctld-1.0.0-1.i386.rpm
查詢包裡面的檔案會被安裝到哪兒
rpm -qpl lcdctld-1.0.0-1.i386.rpm
怎麼建立包
建立包的程序,你可以參考上一篇的程序.
.spec 的格式說明
要注意的一點,一般一個包,裡面會包含 Source 和 Binary.
Header
.spec 檔是挺重要的檔案,有幾個 header,咱們必得放進去:
Summary:放一行簡單的說明
Name:放包的名稱
Version:放包的版本
Release:放包的釋出編號
Copyright:放包的版權宣告,譬如:GPL,BSD,MIT,public domain, distributable或 commerical
Group:包的分類,參考後面的附表一
Source:來源檔案的檔名,可以有多個,多個的時候,則用 Source0, Source1…
Patch:修正包的檔名,同樣地,可以有多個,多個的時候,用 Patch0, Patch1…
[*]BuildRoot:指定一個安裝路徑,通常命名為 name-root.
description 則可有可無~,建議是放上去,作一個詳細的說明,因為 Summary 提供的說明只有一行而已
Sections
prep:這個 section 一開始通常是放 %setup,%setup會先把SOURCES裡面的包解開放到 BUILD 目錄,再切換到該目錄下.再者就是 %patch,可以讓你對源碼作 patch 的動作,如果你前面的 header 有多個 patch 檔,那麼這裡只要用 %patch0 -p1 %patch1 -p2 就行了.
build:這個 section 則是建立.我參考 thttpd.spec, thttpd.spec 在這裡是放 configure 的動作,我認為此處也可以順便做 make的動作,反正都已經解開也patch過,Makefile 也出來了.不過一般似乎都是已經先 make 好了.
install:這個 section 就是放安裝的動作了,在這裡除了用笨方法 %{__mkdir}, install..等一些 shell script 去安裝之外,還可以用 make install 去安裝,這正好證實了我的推論,在 build section 中可以用 make.
clean:把之前在 prep section 解開放到 BUILD 的目錄給移除掉.
可有可無的Sections
pre:作安裝前的準備,yes, 就是 On_BeforeInstall
post:作安裝後的處置, yes, 就是 On_AfterInstall
preun:作移除安裝前的準備, 嗯, 就是 On_BeforeUnInstall
postun:作移除安裝後的擦屁股動作,就是 On_AfterUnInstall
files Section
這是一個很重要的 section, 他記錄了這個包有放什麼檔案到什麼地方.
簡單的用法就是寫
/usr/sbin/lcdctld
直接以絕對路徑+檔名指明,當然這樣子很累啦.
rpm 包有提供一些 macro 讓你省去這樣子的功夫.
%doc
%config
%dir
%defattr
%files
%doc 的位置是 /usr/doc/name-xx.xx.xx-xx, 你可以這麼用: %doc README INSTALL HISTORY ChangeLog
%config 就是指一些設定檔,例如: /etc/xxxxxx
%dir 表示特定屬於這個包的目錄,舉例來說就是 /etc/httpd/
%defattr 設定檔案的屬性,語法是 %defattr (mode,owner,group) filename
%files 看不懂,我猜應該跟直接列出檔名是一樣的
不過我看 thttpd.spec, %dir 可以直接用 /etc/httpd 來代替,前面不需要加上%dir, %defattr 則可以用 %attr 來代替.
changelog Section
這主要是讓維護包的人,可以放歷史紀錄,格式是
* Fri Dec 14 2001 Ellery Tsai
– do nothing, but eat, drink, sleep.
打包
打包的語法是:
rpm -ba lcdctld-1.0.0.spec
或
rpm -bb lcdctld-1.0.0.spec
ba 跟 bb 的差別是,ba 會連 source 和 binary 都打包,結果會產生兩個 rpm ,而 bb 只包 binary,只出現一個 rpm.
其他還有一些用法:
列出 files section 的檔案
rpm -bl lcdctld-1.0.0.spec
只做某些步驟,我猜想是便於內部測試用:
rpm -bc lcdctld-1.0.0.spec
rpm -bi lcdctld-1.0.0.spec
rpm -bp lcdctld-1.0.0.spec
建議
建議最好是先到 SOURCES 去手動一步一步來
先解開 tar 檔,並且先複製一份,並更名為 name-xx.xx.xx.orig,這主要是為了方便製作 patch 用.接著,依照說明去作:
patch
configure
make
make install
在 make install 的時候,順便把檔案位置都記下來,然後再把位置放到 .spec 檔中的 files section 裡面.
如果在前面幾個步驟,有需要修正一些東西,那麼表示你要做一個 patch 檔
作 patch 檔的語法如下:
diff -uNr name-xx.xx.xx.orig name-xx.xx.xx > name-xx.xx.xx-linux.patch
接著到 .spec 檔裡面的 patch header, 作修正.
最後
Yes, That’s All.
資料來源:RPM HOW-TO
此份文件在 \\xserver\linux\Datasheet\Linux-HOWTOs\English_pdf 這裡有.
附表一:
Amusements/Games
Amusements/Graphics
Applications/Archiving
Applications/Communications
Applications/Databases
Applications/Editors
Applications/Emulators
Applications/Engineering
Applications/File
Applications/Internet
Applications/Multimedia
Applications/Productivity
Applications/Publishing
Applications/System
Applications/Text
Development/Debuggers
Development/Languages
Development/Libraries
Development/System
Development/Tools
Documentation
System Environment/Base
System Environment/Daemons
System Environment/Kernel
System Environment/Libraries
System Environment/Shells
User Interface/Desktops
User Interface/X
User Interface/X Hardware Support