2007年10月15日 星期一

vpn server

WindowsXP VPN Server
The following page details the steps necessary to create a WindowsXP VPN Server
1.
Go to Start / Settings / Network Connections
2.
Start the New Connection Wizard
3.
Click on the Next button
4.
Select Set up advanced connection
5.
Click on the Next button.
6.
Click on Accept incoming connections
7.
Click on the Next button
8.
At the LPT1 page, skip it and just click on the Next button.
9.
Click on Allow virtual private connection
10.
Click on the Next button
11.
Add user accounts that you want to be able to connect to your WindowsXP computer.
12.
Click on the Next button.
13.
Highlight Internet Protocol (TCP/IP) and click on Properties
14.
Determine how you want the remote computers to get their IP address
19.
The above example will assign IP addresses to each client. Make sure the IP scheme is the same as on your server.
20.
Submitted by Andy Bloss
If the VPN server is behind a router, Port Mapping will need to be done on the router. Standard port usage is 1723 for PPTP. You might also need to configure your router for PPTP Passthrough. Port usage for IPSec is 500, 50-51. These ports will have to be forwarded to the VPN server's IP

2007年10月2日 星期二

如何遠端使用 X window 環境下的中文 terminal

解答:我們提供了crxvt這個中文終端機程式,以下以X server端(您的電腦)在Win32環境下使用X-win32為例 ,說明使用的步驟 :
登入工作站,將 /usr/local/X11R6/lib/X11/fonts/chinese/et24k.pcf.Z 拷貝到你的目錄下,將之解壓縮成et24k.pcf,再下載回你自己的電腦。
假設你的X-win32裝在c:\xwin32,將下載回來的et24k.pcf放到c:\xwin32\fonts\misc
編輯c:\xwin32\fonts\misc\fonts.dir,加入以下一行et24k.pcf et24k
在你的電腦上執行X-win32。
在工作站上執行"setnev DISPLAY yourIP:no"(no為顯示編號,通常用0)
在工作站執行crxvt,若成功便可在你的電腦上看到新開出的中文視窗。
如欲使用中文輸入法,可輸入指令"xcin -fnb et24k"


21.22. X-win32 如何安裝中文字型?
通常筆者都會使用 kcfonts,因為跟預設的系統比較合。
首先在 chinese/kcfonts 安裝好後, 將 /usr/X11R6/lib/X11/fonts/local/ 底下的檔案, 全都搬移到 C:\Program Files\StarNet\X-Win32 5.1\Lib\Fonts\ 底下,然後用 Font -> Add... -> local\,接著 Make FONTS.DIR, 並 Edit Alias File...:kc12x24 -kc-fixed-medium-r-normal--24-170-100-100-c-120-iso8859-1
kc15f -kc-fixed-medium-r-normal--16-160-72-72-c-160-big5-0
kc24f -kc-fixed-medium-r-normal--24-240-100-100-c-240-big5-0
kc8x15 -kc-fixed-medium-r-normal--15-170-100-100-c-80-iso8859-1
taipei16 -kc-fixed-medium-r-normal--16-160-72-72-c-160-big5-0
taipei24 -kc-fixed-medium-r-normal--24-240-100-100-c-240-big5-0
或是用 ports/x11-fonts/getbdf , getbdf -font "-dynalab-mingliu-medium-r-normal--16-*-*-*-c-*-big5-0" > mingliu16.bdf 來產生 16pt 的字型, 然後依序產生所需要用的字型。
在 Windows 底下也可以抓取 ttf2bdf.exe,將 C:\Windows\Fonts\mingliu.ttc 轉成 bdf,然後依照上面的方法也是可以使用的。

2007年10月1日 星期一

[轉貼] JSP+apache

想說這邊也留一份
獲得同意轉貼內容

原作SHIH-WEI LIN
@http://freebsd.ntut.idv.tw/document/freebsd_diablo_jdk_tomcat_apache2.html

Description :

過去在 FreeBSD 上安裝 Java 可說勞神又費時,如今 FreeBSDFoundation 上提供了專用的 Java JDK Packages 套件可說方便多了,我們可直接下載安裝真是相當方便又快速,省去了不少 Compiler 及安裝 Debug 時間,FreeBSD 真是一個優秀又方便的作業系統,在這篇文章中我將介紹如何在 FreeBSD 6.2R 上安裝 Java JDK Console 環境,以及將 Tomcat 5.5 裝到 FreeBSD 上並且跟原本系統上的 Apache2 結合。

Environment :

硬體:i386 PC Intel P3 500
記憶體網卡:512M RAM + Intel 網卡
作業系統:FreeBSD 6.2 Release

Setp 1.

安裝 FreeBSD 版本 Diablo JDK 1.5 環境:

#cd /usr/ports/java/diablo-jdk15 # 這邊我使用 ports 安裝 diablo-jdk5
#make install clean ; rehash # 剛安裝就直接 show 出錯誤:PS:" 這個錯誤警告是正常的,告訴我們得去 FreeBSDFoundation 抓取 diablo 版的 jdk 放到 /usr/ports/distfiles 下才可 make install "
===> diablo-jdk-1.5.0.07.01_1 :
Because of licensing restrictions, you must fetch the distribution
manually. Please access

http://www.FreeBSDFoundation.org/cgi-bin/download?download=diablo-caffe-freebsd6-i386-1.5.0_07-b01.tar.bz2

with a web browser and "Accept" the End User License Agreement for
"Caffe Diablo 1.5.0". Please place the downloaded
diablo-caffe-freebsd6-i386-1.5.0_07-b01.tar.bz2 in /usr/ports/distfiles.
.*** Error code 1

去官網抓完 FreeBSDFoundation diablo-caffe-freebsd6-i386-1.5.0_07-b01.tar.bz2 後放入 /usr/ports/distfiles 目錄後再次 make install 不到 1 分鐘即可安裝完成。
#make install clean ; rehash # 再次 make install ( 不到 1 分鐘 ) 即可於 FreeBSD 上安裝 Java JDK

#setenv JAVA_HOME /usr/local/diablo-jdk1.5.0 # 設定 Java 的環境路徑
#setenv CLASSPATH $JAVA_HOME/lib

#echo $JAVA_HOME # 查看 JAVA_HOME
/usr/local/diablo-jdk1.5.0
#java -version # 查看 java 版本
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build diablo-1.5.0-b01)
Java HotSpot(TM) Client VM (build diablo-1.5.0_07-b01, mixed mode)

#vi Hello_Diablo_Java.java # 於 Console 環境中寫個 Hello World 程式測試 FreeBSD Java Virtual Machine 環境。

/*
File Name: Hello_Diablo_Java.java
Adviser : 4wei
*/
12345678910111213
import java.lang.*; // 引用套件

public class Hello_Diablo_Java
{
public static void main(String args[])
{
Printer My_Printer = new Printer(); // 依據 Printer 類別建立 My_Printer 物件

My_Printer.Serial_Number = 5566; // 設定 Printer 物件的 Serial_Number 屬性

My_Printer.Hello(); // 呼叫 My_Printer 物件的方法
}
}



123456789
class Printer // 定義 Printer 類別
{
public int Serial_Number; // 定義 Printer 類別的屬性
public void Hello() // 定期 Printer 類別方法
{
System.out.println("Hello Diablo Java!"); // 印出 Hello Diablo Java!
System.out.println("S/N:" + Serial_Number); // 輸出 Serial_Number 屬性
}
}



#javac Hello_Diablo_Java.java # Compiler 寫好的 java Source Code
#java Hello_Diablo_Java # 執行 Compiler 完成後的 Hello_Diablo_Java.class 的 ByteCode,執行時 .class 不用 key,成功 show 出 Hello Diablo Java .......

Hello Diablo Java!
S/N:5566

Setp 2.

安裝 Tomcat 的 Web Server JSP 環境:

#cd /usr/ports/www/tomcat55 # 我安裝 Tomcat 時有出現不可安裝的錯誤,因為我先設定了 JAVA_HOME 的環境,可用 #unsetenv JAVA_HOME 指令先拿掉環境變設定再 make install 即可安裝 Tomacat
#make install clean ; rehash

#setenv JAVA_HOME /usr/local/diablo-jdk1.5.0 # 再次設定 Java 的環境路徑
#setenv CLASSPATH $JAVA_HOME/lib

#/usr/local/tomcat5.5/bin/catalina.sh start # 手動啟動 Tomcat
Using CATALINA_BASE: /usr/local/tomcat5.5
Using CATALINA_HOME: /usr/local/tomcat5.5
Using CATALINA_TMPDIR: /usr/local/tomcat5.5/temp
Using JRE_HOME: /usr/local/diablo-jdk1.5.0

#vi /etc/rc.conf # 加入開機啟動讓每次重開機 Java 環境路徑跟隨設定,同時將 tomcat55 enable 起來

export JAVA_HOME="/usr/local/diablo-jdk1.5.0"
export CATALINA_HOME=/usr/local/tomcat5.5
export CLASSPATH=$JAVA_HOME/lib
tomcat55_enable="YES"

重新開機,查看剛剛加入的環境設定有無生效 ....

# echo $JAVA_HOME # 查看 JAVA_HOME 路徑
/usr/local/diablo-jdk1.5.0
# echo $CLASSPATH # 查看 CLASSPATH 路徑
/usr/local/diablo-jdk1.5.0/lib/tools.jar:/usr/local/share/java/classes/:./

開個瀏覽器查看 http://Server主機IP:8180 即可看見 Tomcat

Setp 3.

安裝 mod_jk-apache2 將 Tomcat 與 Apache2 結合:

#cd /usr/ports/www/mod_jk-apache2/ # 用 ports 安裝 mod_jk_apache2
#make install clean

#vi /usr/local/etc/apache2/httpd.conf # 增加下面兩行,第一行安裝時就會加入只要把前面 # 號拿掉即可

LoadModule jk_module libexec/apache2/mod_jk.so
Include /usr/local/etc/apache2/mod_jk.conf

#cd /usr/local/etc/apache2/ # 切換到 apache2 的目錄下設定 mod_jk.conf 檔
#cp mod_jk.conf.sample mod_jk.conf
#vi mod_jk.conf
123456789101112

JkWorkersFile etc/apache2/workers.properties
JkLogFile /var/log/jk.log
JkShmFile /var/log/jk-runtime-status
JkLogLevel error

# Sample JkMounts. Replace these with the paths you would
# like to mount from your JSP server.
JkMount /*.jsp Server主機 Doamin or IP
JkMount /servlet/* Server主機 Doamin or IP
JkMount /examples/* Server主機 Doamin or IP




#cp workers.properties.sample workers.properties # 設定 workers.properties 檔
#vi workers.properties
1234567
worker.list= Server主機 Doamin or IP

worker.jsp-hostname.port=8009
worker.jsp-hostname.host= Server主機 Doamin or IP
worker.jsp-hostname.type=ajp13
worker.jsp-hostname.lbfactor=1




#touch /var/log/mod_jk.log # 自行產生 mod_jk.log 檔
#chown www:www /var/log/mod_jk.log # 更改 mod_jk.log 擁有者權限
#apachectl restart # 重新啟動 apache
#/usr/local/etc/rc.d/tomcat55 restart # 重新啟動 tomcat

#vi usr/local/tomcat5.5/webapps/ROOT/test.jsp # 最後自己也可以寫個 test.jsp 檔測試一下,放到 Tomacat 的 web 目錄下有無成功
1234
<%@ page contentType="text/html; charset=MS950"%>
<%
out.println("測試 jsp 與 Apache2 結合成功 ^^ ");
%>



最後開啟瀏覽器輸入 http://Server主機 Doamin or IP/test.jsp 便可 show 出 測試 jsp 與 Apache2 是否結合成功 ^^

2007年9月20日 星期四

[轉錄OpenVPN on FreeBSD

這篇 quick guide OpenVPN with FreeBSD, PF and Windows XP 寫得蠻清楚的
http://www.ubergeek.co.uk/howtos/openvpn-freebsd-pf-windows-howto.html
以及找到 Richliu 的 wiki 上的 OpenVPN 也很好懂
http://wiki.richliu.com/index.php/OpenVPN
不過我還是在看了 howto 和 man 之後才了解大部分的事
筆記一點東西



* bridged or routed ?

一開始看 howto 的說明, openvpn 有兩種分配 ip 給 client 的方法
想說其實用 vpn 的人不多、IP也夠, 想說用 bridged 的方式就好
但接著看到他推薦 routed 比較好設就馬上改變心意 XD
難怪 google 到的前幾名都是怎麼設 routed 的..
用 routed 的話, /etc/rc.conf 要加上 gateway_enable="YES"
* 裝 OpenVPN

用 ports 裝一下 security/openvpn 就好
記得在 /etc/rc.conf 加上 openvpn_enable="YES"



* logging

就 syslog 一下...
/etc/syslog.conf 加上 !openvpn *.* /var/log/openvpn.log



* firewall 設定 nat forwarding

設好 nat forwarding 這樣才會有正確的 vpn routing
上面那篇用 pf, ipfw 應該也行啦, 只是趕時間就沒查 ipfw, 直接依樣畫葫蘆了

* CA(Certificate Authority) key

要有 openssl, 然後可以用 openvpn 提供的 easy-rsa script
build-ca: 生 CA
build-key-server: 生 server key
build-key: 生 client key, 基本上一個 client 一個 key
build-dh: 生 Diffie Hellman parameters, openvpn 要用的

生完 keys 後, server 要有 ca.crt, server.crt, server.key,
client 要有 ca.crt 和 client key(如果要用的話)



* login authentication

我考慮過兩種方法

1. certificates & keys: 需要一個 client 生一個 key. 正常是每個 client
使用一個 key, 也是有人設成多人用一個 key 啦.... 要的話 server 的設定要加
上 duplicate-cn 就是
2. username & password: 用 shell 帳號, 應該還可以搭配 NIS. 在 server 的
設定加上 plugin /usr/local/lib/openvpn-auth-pam.so login 若要單純用帳
號密碼登入不使用 client key, server 的設定再加上 client-cert-not-required
和 username-as-common-name

方法 2 如果考慮到被聽走密碼的可能, 可以再加上 tls 加密, 用
openvpn --genkey --secret ta.key 產生 tls key, server 與 client 兩邊都要
有這個 key, 並在 server 設定 tls-auth ta.key 0, 在 client 設定
tls-auth ta.key 1



* server 及 client 的設定

基本上改範例就行了
authentication 的設定要依照要用的方式設, 要用哪種就加上相關設定

-- server.conf --
# routed 用的 device
dev tun
# udp server, 若 client 有要設 proxy 要用 tcp
port 1194
proto udp

# vpn nat 的 ip pool, 隨便設一段跟範例不一樣的 private subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt

# 把 client 的 default gateway 搶過來, 用 vpn server 去 routing
push "redirect-gateway"
# 設台 DNS server
push "dhcp-option DNS 168.95.1.1"
# vpn ip pool 的 routing
push "route 10.8.0.0 255.255.255.0"

# 用 shell 帳號登入, 並用 username 作辨識
plugin /usr/local/lib/openvpn-auth-pam.so login
username-as-common-name
# 不使用 client key
client-cert-not-required
# 使用 tls
tls-auth ta.key 0
# CA keys 和 Diffie hellman parameters, 放在和設定檔同一目錄下
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem

# 最大 client 可連數目
max-clients 100

# 其他照範例設的
# 如果該台機器有多個 IP, 再加上 local
keepalive 10 120
cipher BF-CBC # Blowfish (default)
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
-- client.ovpn on Windwos --
client
dev tun
proto udp
remote 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
comp-lzo
verb 3
cipher BF-CBC # Blowfish (default)

# 用帳號密碼登入
auth-user-pass

# keys
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1

# For Vista security issue, client 是 Vista 的要加
route-method exe
route-delay 2

2007年9月17日 星期一

[轉錄]啟用Apache2 的mod_deflate來壓縮網頁提高傳輸效能

星期四, 十一月 10, 2005
啟用Apache2 的mod_deflate來壓縮網頁提高傳輸效能
今天為了讓Apache 2能夠啟用網頁壓縮,本來是找有經驗的朋友幫忙看用mod_gzip來壓縮會不會比較好,畢竟gzip壓縮網頁輸出是很多人都在採用的技術。後來翻Apache 2 Module mod_deflate 資料才發現,原來很多人用mod_gzip其實是因為Apache 1.x系列沒有內建網頁壓縮技術,所以才去用的。Apache 2官方在開發的時候,就把網頁壓縮考慮進去,內建了mod_deflate這個模組,所以Apache 2就不需要使用到mod_gzip,但2者運作的原理頗為類似。啟用mod_deflate這個網頁壓縮的模組,功能和效率和mod_gzip是差不多的,甚至還好一些,且不需要再另外找mod_gzip模組,apache 2就有內建,將模組前面的註解拿掉就可以使用。yblog.org啟用後,所消耗的頻寬流量便下降許多,可以同時提供給更多人瀏覽頁面的頻寬資源,考量本站使用的文件格式後,實作的方法如下:
在http.conf檔案裡有關載入模組的地方,加上這一行:
LoadModule deflate_module modules/mod_deflate.so接著,在http.conf檔案後面,加上這一段:
DeflateCompressionLevel 9AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-httpd-phpAddOutputFilter DEFLATE js css這樣的作法可以壓縮一般網頁中會用到的html、xml、php、css、js等格式檔案輸出,雖然會佔用掉伺服器處理器的一點點處理器時間,瀏覽者在接收網頁資料時也會消耗極短暫的一點點處理器時間(短到使用者不可能察覺),不過卻可以大幅減少資料傳輸量,減少網路頻寬被吃掉的情形。DeflateCompressionLevel 9是指壓縮程度的等級,從1到9,9是最高等級。據了解,這樣做最高可以減少8成大小的傳輸量(看檔案內容而定),最少也能夠節省一半。DeflateCompressionLevel 預設可以採用 6 這個數值,以維持耗用處理器效能與網頁壓縮品質的平衡。至於已經是壓縮過的圖片格式如jpg,音樂檔案如mp3、壓縮檔如zip之類的,就可以不需要再壓縮了,因為這種檔案你一開放伺服器傳輸時壓縮,處理器時間會跑不完。有關這個mod_deflate的效能,這篇文章Apache 2 mod_deflate Benchmark分析得很好,也值得參考。要檢查加上模組的成果,可以馬上透過這個網站來看看壓縮效率如何Real-Time Compression Check以優格網首頁為例,25445 bytes變成7828 bytes,壓縮後的比例約省下了70%。而以永遠的真田幸村為例,首頁從69045 bytes變成18001 bytes,節省了74%,傳輸速度快了的3.8倍,不過處理速度沒有變慢。至於Lighttpd這套也很紅的網頁伺服器軟體平台,也支援mod_deflate來壓縮網頁提高傳輸效能。而微軟Window伺服器的IIS平台,IIS5得搭配外掛的模組才能實現壓縮功能,IIS6、IIS7則有內建,但壓縮的效能都沒有Apache系列好就是了。XD
真田幸村是我最傾慕的歷史人物,真誠、盡忠、懷抱理想與大義名分、不向賊人妥協,這也是對己期待的投射,盼有朝一日能有此氣度。願幸村紅鎧策馬赤備突擊的身影,帶給我們更多的勇氣。

2007年8月6日 星期一

FreeBSD 如何 mount iso image? 2006/1

FreeBSDmount 一個燒錄用的 iso 檔,並不像 GNU/Linux 般的容易。無法直接使用 mount 指令給 mount 上來,這究竟是怎麼一回事?


在 GNU/Linux 有個 loop device(/dev/loop*),可以給燒錄用的 iso 檔使用,就是把 iso 檔使用 -o loop 參數直接 mount 上來,查看裡頭的內容細節,這本是非常平常的事。可是,到了 FreeBSD,發現並沒有 loop device 可以用,這下要怎麼把 isomount 上來呢?

首先想到的是 FreeBSD Handbook,找了一下,藏在第 17 章,而且敘述也很簡短,不過,總算是能用了。原來 FreeBSD 有一個虛擬的 memory disk device(/dev/md*),他有多種用途,其中的 vnode 型態就可以給 iso 檔來用。

但手續上就比較麻煩一點,例如,我們想把 xxx.isomount 上來的話,首先要去製作一個 vnode type 的 memory disk,並把 iso 檔內容映射至這個 md device,然後再來 mount 這個 md device:

mdconfig -a -t vnode -f xxx.iso -u 0
mount -t cd9660 /dev/md0 /mnt/iso
這樣就行了,要把他 umount 也是要兩個動作:
umount /mnt/iso
mdconfig -d -u 0
是否有此 md device 可以使用 mdconfig -l 來得知。

好像有點給他麻煩,我試著寫了兩個很醜的 sh script 來做這些動作,如果有人有更好的寫法,請不吝借我一用:

#!/usr/bin/env sh
# vim:ts=2 sw=2 et
# isom.sh : mount iso on FreeBSD box using md device.
# Edward G.J. Lee (08/02/06)

if [ $# -eq 0 ]
then
echo
echo "Usage: `basename $0` youriso"
echo
exit 1
fi

file $1 | grep 'ISO 9660' > /dev/null 2>&1
IFIOS=$?

if [ $IFIOS -eq 0 ]
then
if [ ! -d $HOME/mnt/iso1 ]
then
mkdir -p $HOME/mnt/iso1
fi
mdconfig -a -t vnode -f $1 -u 0
mount -t cd9660 /dev/md0 $HOME/mnt/iso1
if [ $? -eq 1 ]
then
mdconfig -d -u 0
echo
echo "mount failed."
echo
exit 1
else
echo
echo "mount under $HOME/mnt/iso1"
echo
exit 0
fi
else
echo
echo 'This is not an iso file, abort!'
echo
exit 1
fi
不過,你要讓這個 user 有 md device 讀寫權限,否則就要使用 root 的身份來 mount。umoun 是寫在另外一個 sh script:
#!/usr/bin/env sh                                                             
# vim:ts=2 sw=2 et
# isoum.sh : umount iso from FreeBSD md device
# Edward G.J. Lee (08/02/06)

umount $HOME/mnt/iso1
mdconfig -d -u 0
當然,由於我的環境很單純,只有我一個人在用,所以就固定在 /dev/md0 了。雖然麻煩了點,不過 FreeBSD 的做法還真的感覺有點 hacker 風格呀!:-)

2007年8月3日 星期五

X window 字型

  1. 安裝 outta-port/mingliu 繁體中文字型。

    # cd /usr/ports/chinese
    # fetch http://netlab.cse.yzu.edu.tw/~statue/outta-port/mingliu.shar
    # sh mingliu.shar
    # cd mingliu
    # make MASTER_SITE_OVERRIDE= install clean

    接著編輯 /etc/XF86Config, 在 Section "Module" 區段, 加入 Load "xtt"

    Section "Module"
    :
    Load "xtt"
    EndSection

    Section "Files" 區段, 加入 FontPath "/usr/X11R6/lib/X11/fonts/TrueType/"FontPath "/usr/X11R6/lib/X11/fonts/local/"

    Section "Files"
    :
    FontPath "/usr/X11R6/lib/X11/fonts/TrueType/"
    FontPath "/usr/X11R6/lib/X11/fonts/local/"
    EndSection

    先檢查 fontconfig 的字型設定是否正確, 以 fc-list :lang=zh-tw 檢查是否有安裝繁體字型, 或是 fc-list :lang=zh-cn 檢查是否有安裝簡體字型, 如果確定字型已經放到 fonts.conf 指定的目錄下, 試著手動執行 fc-cache -f -v 後再試試看。

    接著檢查 X11 Core Font 的字型設定是否正確, 進入 X Window 後,以 xlsfonts | grep big5 檢查是否有安裝繁體字型, 或是 xlsfonts | grep gb2312 檢查是否有安裝簡體字型, 如果確定字型已經放到 XF86Config 指定的目錄下, 試著手動執行 xset +fp /usr/X11R6/lib/X11/fonts/TrueType/ 後再試試看。

    請參考 輸出字型 一節。

2007年8月2日 星期四

嘸蝦米輸入法安裝[gcin]

如已有liu57a.gtab,請直接跳到第4步驟)

1.修改liu57a_tra_big5.cin如下:
代碼:
%ename liu57a
%cname 嘸蝦米
%selkey 1234567890
%keyname begin
a A
b B
c C
d D
e E
f F
g G
h H
i I
j J
k K
l L
m M
n N
o O
p P
q Q
r R
s S
t T
u U
v V
w W
x X
y Y
z Z
, ,
. .
' ’
[ 〔
] 〕
%keyname end
%chardef begin
a 對
aa 寸
..
..
]]v ︼
]]v ︾
%chardef end


2.用kwrite或gedit等支援中文utf-8的editor開啟liu57a_tra_big5.cin,然後以utf-8另存新檔,檔名可自定,舉例:liu57a_tra_utf8.cin
(ps:不要用iconv轉檔,因實測結果發現片假名、平假名的部分不會出現…)

3.此時的liu57a_tra_utf8.cin已是utf-8了。執行代碼:
gcin2tab liu57a_tra_utf8.cin
mv liu57a_tra_utf8.gtab liu57a.gtab


,就可產生liu57a.gtab。

(第4步驟請用root)
4.把liu57a.gtab 拷到/usr/share/gcin/table/
然後用支援utf-8的editor編輯 /usr/share/gcin/table/gtab.list
加入代碼:
嘸蝦米 9 liu57a.gtab
存檔
如此一來,就大概安裝完成了,接下來是一些細部設定工作。


5.第5步驟是為了讓嘸蝦米更方便打字:

執行gcin-setup
選擇「外觀鈴聲行為設定」-「空白鍵選項-按空白立即送出第一字(嘸蝦米)」-「ok」

選擇「內定輸入法 & 開啟/關閉」-「嘸蝦米」-「ok」

6.重新啟動X,即可享用嘸蝦米with gcin

附上.xinitrc
代碼:
export XMODIFIERS="@im=gcin"
export GTK_IM_MODULE="gcin"
export LC_ALL=zh_TW.UTF-8
gcin&
icewm-session

嘸蝦米輸入法安裝[xcin]

.修改liu57a.cin如下:
代碼:

%gen_inp
%ename liu57a
%cname 嘸蝦米
%selkey 0123456789
%keyname begin
a A
b B
c C
d D
e E
f F
g G
h H
i I
j J
k K
l L
m M
n N
o O
p P
q Q
r R
s S
t T
u U
v V
w W
x X
y Y
z Z
, ,
. .
' ’
[ 〔
] 〕
%keyname end
%chardef begin
a 對
aa 寸
..
..
]]v ︼
]]v ︾
%chardef end


2.執行
代碼:
cin2tab liu57a.cin

會產生liu57a.tab

(以下用root)
3.然後把liu57a.tab拷到/usr/lib/xcin/tab/big5/
4.修改/etc/xcinrc,把嘸蝦米的設定加進來

代碼:
(define zh_TW.Big5
'((DEFAULT_IM "liu57a")
(DEFAULT_IM_MODULE "gen_inp")
(DEFAULT_IM_SINMD "phone")
(PHRASE "default.phr")
(CINPUT (liu57a cj .....))
...

代碼:
(define liu57a@big5
'((SETKEY 11)
(AUTO_COMPOSE YES)
(AUTO_UPCHAR YES)
(AUTO_FULLUP NO)
(SPACE_AUTOUP YES)
(SELKEY_SHIFT NO)
(SPACE_IGNOR NO)
(SPACE_RESET YES)
(AUTO_RESET YES)
(WILD_ENABLE YES)
(BEEP_WRONG YES)
(BEEP_DUPCHAR YES)
(END_KEY NO)
(AUTO_SELECT NO)
(SINMD_IN_LINE1 NO)
))


然後把 (CINPUT (liu57a cj .....))裡的jyutping0去掉

完成後,請重新啟動xcin,或者是重新啟動X-window也可以。
代碼:
killall xcin
xcin&

2007年8月1日 星期三

如何使用游戏手柄gameport

6.1 part
Port: linux-js-2.2 Path: /usr/ports/devel/linux-js
Info: The Linux joystick interface ported to FreeBSD
Maint: jylefort@FreeBSD.org
B-deps:
R-deps: WWW:
To load the linux_js kernel module immediately, type the following commands: kldload joy (if PC joystick support is desired)
kldload uhid (if USB joystick support is desired)
kldload linux_js
To load the linux_js kernel module at boot, add the following lines to /boot/loader.conf:
joy_load="YES" (if PC joystick support is desired)
uhid_load="YES" (if USB joystick support is desired)
and add the following line to /etc/rc.conf:
linux_js_enable="YES"
To test a joystick, type the following command:
jstest /dev/input/jsXXX To calibrate a joystick,
type the following command:
jscal -c /dev/input/jsXXX To save the calibration data at system shutdown and restore it at boot, add the following line to /etc/rc.conf: jscal_enable="YES"
===============================================
5.x or others
如果你生于70年代,那麼你一定還記得《魂鬥羅》、《戰斧》、《名將》吧。想再聽一次令人熱血沸騰的《魂鬥羅》的主題曲嗎?好,現在就讓我們重溫我們的兒時之旅。
我們的討論範圍包括任天堂紅白機模擬器(Fceu),世嘉五代模擬器(DGen/SDL),和街機模擬器(Xmame),有同好願意幫助補上其他模擬器的資料嗎?
Fce Ultra這是一個跨平台的任天堂紅白機模擬器,可以運行在 Dos/Windows/BeOS/MacOS/MacOSX/和Unix下(需要SDL庫支持)是我用過的Linux/FreeBSD下最好的紅白機模 擬器,支持絕大部分常見的MAP格式,支持zip格式的壓縮rom、全屏模式、網絡聯機、遊戲桿輸入,甚至遊戲作弊。遺憾的是作者似乎不打算繼續發展這個 項目,然而你仍然可以在http://fceultra.sourceforge.net/files/ 下找到該模擬器不定期發表的最新版本,目前的最新版本為0.96。
編譯安裝這個模擬器是一件相當簡單的事:下載fceu096src.tar.gz,展開 到一個臨時目錄下,進入該目錄,將Makefile.unixsdl拷貝成Makefile,然後運行make,如果一切順利,將在該目錄下生成fceu 的執行程序。在指令行輸入"$ ./fceu"將得到指令行幫助,試試"$ ./fceu -fs contra.zip",看到你久違的《魂鬥羅》畫面了嗎?"-fs"選項將使fceu在全屏幕方式下運行。
Fce ultra假定axis0為遊戲桿的X軸向,axis1為遊戲桿的Y軸向,對于大多數Gameport遊戲桿,這個假設是成立的,但我的Topway USB Joypad單人手柄向系統報告自己是一個4軸向遊戲桿/20按鍵手柄(實際使用2軸向10 按鍵),axis2為x軸向,axis3為Y軸向,有效按鍵0-9。這可能是由于Game-pad制造商為了減少成本,讓單人手柄與雙人手柄共用芯片的結 果,而我的Gamtec Twin USB Game-pad雙人手柄同樣報告自己是一個4軸向/20按鍵手柄,其中axis0為Player1的X軸向,axis1為Player1的Y軸向, axis2為Player2的X軸向,axis3為Player2的Y 軸向,手柄1的有效按鍵為0-9,手柄2的有效按鍵為10-19。是的,這個結果看起來相當的怪誕,但這不是廠商或是驅動編寫者的錯,畢竟,支持 Joystick重映射應當是應用程序的職責,但這卻造成相當一部分USB遊戲桿在 Fce Ultra下無法正常使用,有哪位紅白機迷願意為她寫個補丁嗎?
Linux用戶在編譯運行之前應當先檢查是否已安裝了SDL的運行庫和開發庫(當然還要 有gcc)。Redhat/Mandrake的發行版均有這個安裝包,你可以運行 "sdl-config --version"來檢查你的SDL庫的版本號,確保你的SDL庫版本在1.1以上,否則在編譯時可能會遇到麻煩。
FreeBSD用戶需要確保sdl12 (/usr/ports/devel/sdl12),gmake (/usr/ports/devel/gmake)等ports已經安裝,sdl12會在/usr/local/bin/下安裝sdl11-config 這個執行文件,由于FreeBSD的ports包含了許多不同版本的SDL庫(甚至包括在linux模擬環境下運行的linux-sdl),因此需要以不 同的配置程序名加以區別。記住為sdl11-config創建一個符號連接,像這樣:"# cd /usr/local/bin; ln -s sdl11-config sdl-config",fceu編譯時需要通過這個標準的SDL環境配置程序以確定所需的SDL庫和頭文件的路徑,另外,你需要執行"gmake"以明 確表示你使用gnu-make而不是系統缺省的bsd-make
在寫完這個主題後大約一個星期,我興奮地發現,FreeBSD終于將FCEU正式加入了 PORTS,如果你使用cvsup 同步PORTS,那麼進入"/usr/ports/emulators/fceu",然後"make && make install"就大功告成了。
DGen/SDL這是基于windows的世嘉模擬器DGen的SDL環境移植版,支持全屏模式、分屏模式、zip格式的壓縮rom、遊戲桿輸入和遊戲作弊,你可以在http://www. pknet.com/~joe/dgen-sdl.html找到該模擬器的最新版本,目前的最新版本是1.23。
與Fce Ultra一樣,DGen/SDL同樣不支持遊戲桿重映射,甚至假定系統報告的第一遊戲桿設備為Player1,第二遊戲桿設備為Player2,並且限 制遊戲手柄的最大按鍵數為16!但SEGA MD上留下了我太多難以割舍的回憶,因此我為她編寫了遊戲桿重映射的PATCH,由于DGen/SDL 原本的遊戲桿支持的代碼是由另一位hacker加上的,並且使用了完全不同的事件映射模式,這花了我2個小時去弄清楚代碼是如何工作的,這個補丁耗費了我 整個週末並讓我錯過了與PPMM的晚餐:-< 然而應用這個PATCH是非常簡單的,你只需在展開的dgen-sdl-1.23目錄下執行"patch-p1<../dgen-sdl-1.23 -jsmap. patch",記住你需要用你下載的patch文件的路徑替換指令裡的"../dgen-sdl-1.23-jsmap.patch",但直到目前為止, 我仍然沒有收到DGen/SDL的作者關于這個PATCH的任何答復,因此,這個PATCH是"非官方的",是否使用她取決于你對我的信任,如果這個 PATCH給你帶來麻煩或是快樂,或者你有任何意見或是建議,請讓我知道。
得益于autoconf腳本的幫助,編譯模擬器的源代碼是相當簡單的,下載dgen- sdl-1.23.tar.gz,展開到一個臨時目錄,進入該目錄,如果你需要遊戲桿重映射的Patch,請先按上文的方法應用Patch,之後順序執行 "./configure","make"就可完成編譯,FreeBSD的用戶則需要首先符號連接sdl-config,安裝gnumake,並執行 "gmake"而不是"make"。然而該版本的autoconf測試宏中有兩處錯誤地包含了SDL/SDL.h而不是SDL.h,在Redhat Linux下,由于SDL-devel將SDL的頭文件放在了/usr/local/SDL/下,而/usr/include/是系統的標準包含路徑,因 此,Redhat的用戶在編譯時不會遇到任何麻煩,其他Linux發行版和*BSD的用戶恐怕就沒這麼幸運了,當你運行"./configure"時,配 置腳本會抱怨找不到SDL/SDL.h這個頭文件從而引起SDL環境測試失敗,你可以修改acinclude.m4和aclocal.m4這兩個宏定義文 件然後重新運行autoconf以生成configure 腳本或是幹脆自己直接修改configure腳本。
如何使用PATCH提供的遊戲桿重映射功能你可以按照sample.dgenrc文件中給出的例子修改遊戲桿的映射以適應你的要求,這是一個我的遊戲桿設置的例子:
# joy_pad1_up = j0a1(-16384) 表示Player1的上方向設為遊戲桿設備0的第1軸# 向的負方向,只有當該方向的軸向位置絕對值超過16384時,才認為該事件發生。# 這個設置讓你可以避免遊戲桿傳回的噪音信號幹擾你對遊戲主角的控制,對于# 飛行搖桿類的遊戲桿(如Logitech WingMan 3D)是一個很有用的設置,軸向位置# 絕對值的取值範圍是1~32767joy_pad1_up = j0a1(-16384)joy_pad1_down = j0a1(+16384)joy_pad1_left = j0a0(-16384)joy_pad1_right = j0a0(+16384)# joy_pad1_a = j0b3表示Player1的A鍵被定義為遊戲桿設備0的第3按鈕joy_pad1_a = j0b3joy_pad1_b = j0b0joy_pad1_c = j0b1joy_pad1_x = j0b2joy_pad1_y = j0b6joy_pad1_z = j0b7joy_pad1_mode = j0b9joy_pad1_start = j0b8
在Linux下,你可以通過jstest的輸出以確定該如何填寫配置項,一個類似于GXMAME的圖形化前端會使這一工作簡單許多,有誰對這個主意感興趣嗎?
這個PATCH可以在Linux下完美地支持各種遊戲手柄,然而在FreeBSD上使用 UHID手柄時卻響應緩慢,這可能是FreeBSD的UHID驅動傳回了大量的噪音信號導致的,但XMAME-0.70.1卻能在這樣的噪聲信號下正常處 理遊戲桿輸入,我是FreeBSD的忠實FANS,然而我並不在意FreeBSD的這些不是很"UNIX"的特性,個人認為與其繼續修改模擬器以適應 FreeBSD下的噪音環境,還不如修改FreeBSD的UHID驅動,畢竟一件這樣的工作的有趣程度取決于對社會幸福總量的貢獻:-D,如果你是 FreeBSD的FANS,那麼UHID驅動入口是個不錯的開始,你可以在/usr/src/sys/dev/usb/uhid.c找到她。www.usb.org提供了更多深入的細節
XMAME
所有的MAME Fans請起立,注視這個LOGO並高呼3聲MAME萬歲
無需多說,著名的多街機模擬器MAME的UNIX平台版本,支持各種Unix的變體,甚至是PS2上的Linux! 她能夠模擬自1975年起發行的超過4000個大型街機遊戲。如果你尚不了解MAME為何物,那麼,請先去www.mame.net朝聖。
不要去找RPM,DEB或是PORTS,我們需要的是最新的遊戲列表和最好的遊戲效果,況且,如果你只需要一個執行文件就能工作,那麼有什麼理由需要安裝包呢?
這裡的描述均基于xmame-0.70.1,你可以在x.mame.net找到最新發行 版本的源代碼包,解開壓縮包。刪除Makefile(這是一個指向makefile.unix的符號連接),然後將makefile.unix 拷貝成Makefile(在修改出現錯誤時有一個後備文件總是一件好事),我們剩下所有要做的就是修改Makefile文件以適應我們的系統。總體來說, Makefile選項是一目了然的。但在此之前,還是需要先解釋一些背景知識以方便我們做出適當的選擇。
XV,OpenGL(xgl),DGA,SVGALIB,SDL,GGI及其他XV
XV是X視頻擴展的縮寫,設計用于加速視頻播放的X應用程序,她允許應用程序創建不依賴 于當前顯示模式色深度的視頻緩衝區,並直接向視頻緩衝區寫入RGB或是YUV值,由視頻硬件實現色彩空間轉換和拉伸,這意味著,即使當前的顯示色深度是 256色,應用程序也能夠以16bits或是32bits色深播放視頻。她還可以在不需要root權限的情況下實現全屏播放,因此,這是我們的最佳選擇之 一。注意XFree86-4.0.2以後的版本才有XVideo支持,你可以通過執行"xvinfo"來了解你的顯卡是否支持Xv擴展,你應當看到類似這 樣的輸出:
X-Video Extension version 2.2screen #0Adaptor #0: "ATI mach64 Video Overlay"number of ports: 1port base: 61operations supported: PutImagesupported visuals:depth 16, visualID 0x23depth 16, visualID 0x24depth 16, visualID 0x25depth 16, visualID 0x26depth 16, visualID 0x27depth 16, visualID 0x28depth 16, visualID 0x29depth 16, visualID 0x2anumber of attributes: 17"XV_DEVICE_ID" (range 0 to -1)client gettable attribute (current value is 89)"XV_LOCATION_ID" (range 0 to -1)client gettable attribute (current value is 90)"XV_INSTANCE_ID" (range 0 to -1)client gettable attribute (current value is 91)"XV_SET_DEFAULTS" (range 0 to 1)client settable attribute"XV_AUTOPAINT_COLORKEY" (range 0 to 1)client settable attributeclient gettable attribute (current value is 1)"XV_COLORKEY" (range 0 to -1)client settable attributeclient gettable attribute (current value is 6208)"XV_DOUBLE_BUFFER" (range 0 to 1)client settable attributeclient gettable attribute (current value is 1)"XV_ENCODING" (range 0 to 12)client settable attributeclient gettable attribute (current value is 1)"XV_FREQ" (range 0 to -1)client settable attributeclient gettable attribute (current value is 1000)"XV_TUNER_STATUS" (range -1000 to 1000)client gettable attribute (current value is 4)"XV_MUTE" (range 0 to 1)client settable attributeclient gettable attribute (current value is 1)"XV_VOLUME" (range -1000 to 1000)client settable attributeclient gettable attribute (current value is -1000)"XV_BRIGHTNESS" (range -1000 to 1000)client settable attributeclient gettable attribute (current value is 0)"XV_CONTRAST" (range -1000 to 1000)client settable attributeclient gettable attribute (current value is 0)"XV_SATURATION" (range -1000 to 1000)client settable attributeclient gettable attribute (current value is 16)"XV_COLOR" (range -1000 to 1000)client settable attributeclient gettable attribute (current value is 16)"XV_HUE" (range -1000 to 1000)client settable attributeclient gettable attribute (current value is 0)maximum XvImage size: 2048 x 2048Number of image formats: 4id: 0x32595559 (YUY2)guid: 59555932-0000-0010-8000-00aa00389b71bits per pixel: 16number of planes: 1type: YUV (packed)id: 0x59565955 (UYVY)guid: 55595659-0000-0010-8000-00aa00389b71bits per pixel: 16number of planes: 1type: YUV (packed)id: 0x32315659 (YV12)guid: 59563132-0000-0010-8000-00aa00389b71bits per pixel: 12number of planes: 3type: YUV (planar)id: 0x30323449 (I420)guid: 49343230-0000-0010-8000-00aa00389b71bits per pixel: 12number of planes: 3type: YUV (planar)
3dfx用戶
請確保你的Xfree86版本在4.2.0以上,否則,你可能會在使用XVideo擴展時遇到麻煩(包括XFree86崩潰)。
S3用戶
如果你的顯卡早于Savage3D(Virge,Trio64,etc),那麼拆下來,出門送給第一個你遇見的人。
nVidia用戶
請使用XFree86-4.2.0及以後的XFree86發行版本內建的nVidia驅動,或是向nVidia抱怨使用他們的非開源驅動出現的稀奇古怪的問題。
ATI用戶
如果xvinfo告訴你沒有合適的適配器,或是XMAME抱怨沒有合適的視頻模式可用的話,不要慌張,GATOS提供了你想要的XVideo驅動,鼠標留下的黑色方塊不是太大的問題,切換到文本控制台再切換回來就行。
OpenGL
在任何情況下,如果有XV,就不要用OpenGL,她對二維光柵遊戲沒有什麼幫 助,並且與XV相比,她的加速效果相當糟糕。你可以使用glxinfo來確認你的XFree86是否支持glx擴展,在我的Redhat-9(ATI RAGE MOBILITY M1 AGP)上,她的輸出是這樣的:
name of display: :0.0Xlib: extension "XFree86-DRI" missing on display ":0.0".display: :0 screen: 0direct rendering: Noserver glx vendor string: SGIserver glx version string: 1.2server glx extensions:GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_EXT_import_contextclient glx vendor string: SGIclient glx version string: 1.2client glx extensions:GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_EXT_import_contextGLX extensions:GLX_EXT_visual_info, GLX_EXT_visual_rating, GLX_EXT_import_contextOpenGL vendor string: Mesa project: www.mesa3d.orgOpenGL renderer string: Mesa GLX IndirectOpenGL version string: 1.3 Mesa 4.0.4OpenGL extensions:GL_ARB_imaging, GL_ARB_multitexture, GL_ARB_texture_border_clamp,GL_ARB_texture_cube_map, GL_ARB_texture_env_add,GL_ARB_texture_env_combine, GL_ARB_texture_env_dot3,GL_ARB_transpose_matrix, GL_EXT_abgr, GL_EXT_blend_color,GL_EXT_blend_minmax, GL_EXT_blend_subtract, GL_EXT_texture_env_add,GL_EXT_texture_env_combine, GL_EXT_texture_env_dot3,GL_EXT_texture_lod_biasglu version: 1.3glu extensions:GLU_EXT_nurbs_tessellator, GLU_EXT_object_space_tessvisual x bf lv rg d st colorbuffer ax dp st accumbuffer ms cavid dep cl sp sz l ci b ro r g b a bf th cl r g b a ns b eat----------------------------------------------------------------------0x23 16 tc 1 16 0 r y . 5 6 5 0 0 16 0 0 0 0 0 0 0 None0x24 16 tc 1 16 0 r y . 5 6 5 0 0 16 8 16 16 16 0 0 0 None0x25 16 tc 1 16 0 r y . 5 6 5 8 0 16 8 16 16 16 16 0 0 None0x26 16 tc 1 16 0 r . . 5 6 5 8 0 16 8 16 16 16 16 0 0 None0x27 16 dc 1 16 0 r y . 5 6 5 0 0 16 0 0 0 0 0 0 0 None0x28 16 dc 1 16 0 r y . 5 6 5 0 0 16 8 16 16 16 0 0 0 None0x29 16 dc 1 16 0 r y . 5 6 5 8 0 16 8 16 16 16 16 0 0 None0x2a 16 dc 1 16 0 r . . 5 6 5 8 0 16 8 16 16 16 16 0 0 None
支持glx擴展與堪用是兩回事,XMAME在沒有硬件加速支持的OpenGL驅動下大約能跑到5fps就不錯了,這個速度還不到期望速度的1/10,試試看去Utah-GLX碰碰運氣吧,也許會有驚喜。
DGA
DGA是Direct Graphics Access的簡稱,是一種使程序繞過X-服務器直接修改幀緩衝顯存的方法。由于直接操作硬件,只有以root身份運行的應用程序才能使用DGA方式,在 我看來,這種視頻加速的手段過于野蠻。然而借助于直接顯存操作,DGA應用程序獲得了野獸一樣的速度,有人見過CELELON-733能把 Strikers 1945 III跑到60fps 嗎?如果你的CPU比較慢,那麼這可能是你較好的選擇。
警告:決不要給XMAME設置suid權限,別的用戶會通過SUID root的XMAME獲得root身份!
SVGAlib
這是一個使控制台應用程序能夠進行圖形模式輸出的庫,她能夠識別許多圖形芯片,並通過直 接驅動硬件來工作。除非你沒有安裝XFree86,否則,不要使用這個庫驅動XMAME,與DGA模式一樣,她需要root權限,並且,使用 SVGAlib的XMAME無法在FreeBSD上正常工作。
SDL
這是一個跨平台的多媒體支持庫,包括了音頻/視頻/遊戲桿/3D加速等接口,SDL能夠 根據當前的運行環境選擇適當的驅動手段(XV, DGA, SVGALib, AAlib, etc)這可以在在一定程度上使你免于糾纏各種稀奇古怪的視頻加速接口。你可以通過運行"sdl-config --version"檢查系統是否安裝了SDL支持庫以及庫的版本號。這幾乎總是最好的選擇,在FreeBSD下,這也是唯一能夠獲得可用的遊戲桿支持的 方法。不過XMAME的SDL驅動版本似乎不支持超過當前顯示模式色深度的顯示,也就是說,如果你當前的顯示模式是1024x768 16bits色深,你將不能夠運行諸如 Strikers 1945 II,Strikers 1945 III這樣的需要32位顯示色深度的遊戲,而XMAME的X11版本無論使用XV或是DGA 均不存在這樣的問題,這不能不說是一個小小的遺憾。
GGI,Glide及其他
我喜歡開源軟件之間的競爭,然而SDL小組很活躍,並且已做的足夠好了,我總可以在 XV,DGA,SDL之間找到適合我的選擇。因此,我對GGI沒有太多的興趣,也許她對Sorlaris用戶會有所幫助。3dfx的用戶可能會對 Glide感興趣,但我沒有這種顯卡,因此也無法提供這方面的更多幫助。如果有誰試過XMAME的xfx,svgafx,openstep或是 photon2選項,請分享一下經驗好嗎?
以下是一個Makefile文件的範例
...# 去掉這行的注釋以使用聯網遊戲功能# XMAME_NET = 1......# 去掉這行的注釋以使用68000的x86匯編優化引擎(需要安裝NASM)# X86_ASM_68000 = 1# 去掉這行的注釋以使用DRC MIPS3引擎# X86_MIPS3_DRC = 1
# gcc on x86# 將這行注釋掉CFLAGS = -O -Wall -Wno-unused
# gcc on x86 with some optimizations# 去掉以下兩行的注釋,以打開一些優化開關,如果你不是i686芯片,去掉"-mcpu=i686"# CFLAGS = -O2 -Wall -Wno-unused -mcpu=i686 -fomit-frame-pointer# -fstrict-aliasing -fstrength-reduce -ffast-math......# 選擇適合你的CPU類型,去掉前面的注釋# Valid x86 options that work with any version of gcc.# CFLAGS += -march=i386# CFLAGS += -march=i486# CFLAGS += -march=i586# CFLAGS += -march=i686# CFLAGS += -march=pentium# CFLAGS += -march=pentiumpro
# Valid x86 options that work only with newer versions of gcc.# CFLAGS += -march=pentium-mmx# CFLAGS += -march=pentium3# CFLAGS += -march=pentium4# CFLAGS += -march=k6# CFLAGS += -march=k6-2# CFLAGS += -march=k6-3# CFLAGS += -march=athlon# CFLAGS += -march=athlon-tbird# CFLAGS += -march=athlon-xp# CFLAGS += -march=athlon-mp# CFLAGS += -march=athlon-4......# Linux# Linux用戶去掉這行的注釋ARCH = linux
# FreeBSD# FreeBSD用戶去掉這行的注釋# ARCH = freebsd......# On x86-based OSes, if supported, you can use standard joystick driver.# Linux用戶去掉這行的注釋# JOY_I386 = 1......# NetBSD/FreeBSD USB joystick support.# FreeBSD用戶去掉這行的注釋# JOY_USB = 1......# GNOME用戶去掉這行的注釋以支持esound輸出# SOUND_ESOUND = 1# SOUND_ALSA = 1# SOUND_ARTS_TEIRA = 1# SOUND_ARTS_SMOTEK = 1# 去掉這行的注釋以支持SDL音頻輸出# SOUND_SDL = 1# SOUND_WAVEOUT = 1......############################################################################ Select your display method; choose only one.############################################################################ 選擇一種(只允許一種)顯示方式,去掉注釋符號# Note: x11 is the only one supported on almost all platforms. For BeOS,# use SDL.
# X11# 編譯x11版本(xmame.x11)請去掉下一行的注釋。如果你的顯卡有XV或DGA支持,這是最好的選擇DISPLAY_METHOD = x11
# SDL library# 編譯SDL版本(xmame.SDL)請去掉下一行的注釋。要使用SDL遊戲桿支持則必須使用這個版本# DISPLAY_METHOD = SDL
# SVGALib, only supported under Linux# 編譯svgalib版本(xmame.svgalib)請去掉下一行的注釋。# DISPLAY_METHOD = svgalib
# GGI, only tested under Linux# DISPLAY_METHOD = ggi
# OpenGL under X11# 編譯OpenGL版本(xmame.xgl)請去掉下一行的注釋。# DISPLAY_METHOD = xgl
# Glide under X11# DISPLAY_METHOD = xfx
# Glide in console mode# DISPLAY_METHOD = svgafx
# OpenStep bitmaps# DISPLAY_METHOD = openstep
# Photon 2.x (QNX6), currently buggy, but working...# DISPLAY_METHOD = photon2......# MIT-Shared Memory X Extensions# 使能MIT風格共享內存擴展,不要注釋她X11_MITSHM = 1
# Use Xv extension for hardware scaling.# 使能Xvideo擴展,不要注釋她X11_XV = 1
# Enable XFree86 DGA. This also causes "make install" to set the suid bit# on the executable.# 使能DGA擴展支持,如果你可能需要使用DGA方式(當XV不可用時)的話,去掉這行的注釋# X11_DGA = 1
# Work around a bug in the XFree86 tdfx driver that prevents the original# mode from being restored when leaving DGA2 mode.# 我沒有3dfx卡,3fdx用戶試試吧# TDFX_DGA_WORKAROUND = 1
# The XIL library (Solaris 2.5.1 and higher)# Solaris 9 Sparc 宣稱這個庫被廢棄了。# X11_XIL = 1......# Uncomment this to use XInput devices, e.g. additional mice as# trackballs.# 如果你要玩雙打槍戰遊戲(Space Gun,etc),去掉這行注釋,這使XMAME能夠接受X-WINDOW下第二鼠標的輸入# XINPUT_DEVICES = 1......# The name of your sdl-config executable# FreeBSD用戶可能要把"sdl-config"改成"sdl11-config"SDL_CONFIG = sdl-config
編譯XMAME如果你想使用x86匯編優化的68000核心,你必須首先安裝 nasm,Redhat Linux發行版包含了這個包。 FreeBSD用戶則可以在/usr/ports/devel/nasm/找到這個ports,如果你還沒有安裝這個ports,進入這個目錄 "make && make install"就行。然後使用GNU-MAKE來MAKE工程,像這樣"gmake"(linux用戶用"make"也一樣) 編譯完成後,你可能會得到xmame.x11, xmame.xgl, xmame.SDL或是xmame.svgalib這樣的執行文件,具體是哪一個取決于你選擇的顯示驅動,你可以把她放到任何你喜歡的目錄裡,我習慣把她 放在"/usr/local/bin/" 下。
如何在指令行模式下使用XMAMExmame.SDL
你可以用下面這條指令以全屏模式啟動Strikers 1945的遊戲,並讓xmame使用SDL遊戲桿驅動:
$ xmame.SDL -fullscreen -jt 7 ./s1945.zip
xmame.x11
下面這條指令以全屏模式啟動Strikers 1945的遊戲,並強制xmame使用XVideo加速,並使用新版的Linux 遊戲桿驅動:
$ xmame.11 -x11 1 -xv -jt 4 ./s1945.zip
下面這條指令以全屏模式啟動Strikers 1945的遊戲,並強制xmame不使用XV而使用DGA加速,並使用舊版的Linux遊戲桿驅動:
# xmame.11 -x11 1 -noxv -jt 1 ./s1945.zip
xmame默認'5'是Player1投幣,'1'是Player1開始,試一試吧,你 還有你往日的身手嗎?你可以按"TAB"鍵彈出設置菜單,修改缺省的鍵盤/遊戲桿設置以符合你的口味。"xmame.xxx --help"可以得到xmame的命令行幫助,更詳細的幫助可以參考xmame手冊(英文) M.A.M.E 32中文f明 是另一個有關mame主題不錯的中文文檔
使用GXMAME圖形前端如果你覺得命令行過于專業而你想讓娛樂變得輕鬆一些的 話, GXMAME是個不錯的主意。這是一個GNOME環境下的xmame的前端(不要害怕,只要安裝了gtk+的庫,她在諸如 KDE這樣的窗口環境裡也一樣能運行),與mame32(著名的windows下的mame圖形界面)及其相似的外觀與操作習慣,相信你會喜歡的。
關于xmame-0.71.12003年7月19日,xmame-0.71.1正式發行了,然而事情變得有點復雜:注意配置文件中的這一行,不要取消這行的注釋,否則編譯將會失敗。
# X86_MIPS3_DRC = 1
在Redhat Linux 9 (GCC 3.2.2 20030222)上,她成功地編譯並且運行了,然而在FreeBSD-4.8 STABLE上,即使我禁用了X86_MIPS3_DRC引擎,編譯卻仍然失敗了。我知道FreeBSD小組在7月14日將缺省編譯器升級到了 gcc-3.3,並且正在解決一部分ports編譯出錯的問題,于是猜測這可能與編譯器有關,7月21日,FreeBSD小組將缺省編譯器回滾到了gcc -2.95.4,我重新編譯了一次,仍然無法通過(我沒有測試過在Linux下的gcc-2.95 的編譯情況如何),我猜測XMAME需要gcc-3.2,于是,我編譯了/usr/ports/lang/gcc32以使FreeBSD使用與 Linux相同的編譯器,這個猜想立即得到了驗證-- 編譯通過了,並且XMAME運行正常。
在你向FreeBSD的mail-list發出你的BUG-REPORT之前,請先檢查 你的編譯器版本,或是使用xmame-0.70.1 (她在2.95/3.2/3.3上編譯都沒問題),mail-list裡的問題已經足夠多了,請給FreeBSD小組多一些PATCH、建議或是時間。
使用遊戲桿當然使用遊戲桿,我沒興趣用鍵盤玩遊戲,如果你不在乎這個,那麼跳過這一節。
感謝 Vojtech Pavlik,感謝Suse與Intel,Linux用戶擁有Unix環境下最出色的Joystick驅動支持,包括USB 接口,Gameport接口甚至Win2000不支持的並口遊戲桿都可以支持。Redhat-7.x以上版本已經自帶了這個驅動,並且隨內核發布了可裝載 驅動模塊。如果你重編譯了核心或是使用了其他的核心發布,請確保你編譯了相應的模塊。否則以下描述很可能對你不適用。
USB接口HID遊戲桿我們這裡所說的USB遊戲手柄是指不帶力回饋功能的標準 UHID設備(M$稱為人體工程學輸入設備)這是目前市面上最容易買到,也最容易被驅動的遊戲手柄,你只需選擇一個選擇一個usb接口,插上手柄,在 /var/log/message裡你可以看到發現新的HID設備的的信息,以root身份運行"modprobe joydev",然後執行"jstest /dev/input/js0"(對于Redhat Linux,/dev/js0也同樣指向該設備)jstest將報告該遊戲手柄的軸向個數和按鈕個數,當你按下按鈕時jstest報告哪個軸向發生了變化 以及哪個按鈕被按下。
Gameport遊戲桿這是在史前時代流傳下來的遊戲桿接口標準,Linux對她們有很好的支持。一個最常見的Gameport接口2軸 6鍵手柄的驅動方式看起來會像下面這樣,你可以使用"jstest /dev/js0"來驗證遊戲手柄是否已被正確驅動。
# modprobe # modprobe ns558# modprobe analog js=gamepad# modprobe joydev
如果你安裝了kernel-source你可以在/usr/src/linux-2.4.xx/Documentation/joystick.txt裡找到關于 js參數的詳細描述。
Type Meaningnone No analog joystick on that portauto Autodetect joystick2btn 2-button n-axis joysticky-joy Two 2-button 2-axis joysticks on an Y-cablefcs Thrustmaster FCS compatible joystickchf Joystick with a CH Flightstick compatible hatfullchf CH Flightstick compatible with two hats and 6 buttonsgamepad 4/6-button n-axis gamepadgamepad8 8-button 2-axis gamepad
並口遊戲桿對于並口遊戲桿,Linux同樣有出色的支持,最常見的PSX並口手柄可以用以下指令驅動
# modprobe gamecon gc=0,7# modprobe joydev"
gc參數形式是這樣的:gc=port,pad1,pad2,pad3, pad4,pad5。這裡gc的第一個參數0表示使用並口1作為輸入端口,第二個參數7表示pad1是SonyPSX遊戲桿(大部分常見的PSX跳舞毯也 可以同樣的方式驅動),其他參數類型見下表,你可以在/usr/src/linux-2.4.xx/Documentation/joystick- parport.txt找到完整而精彩的描述。
Type Joystick/Pad0 None1 SNES pad2 NES pad4 Multisystem 1-button joystick5 Multisystem 2-button joystick6 N64 pad7 Sony PSX controller
另一個並口遊戲桿驅動db9的參數形式是這樣的:db9=port,type。她支持以下類型的並口遊戲桿
Type Joystick/Pad0 None1 Multisystem 1-button joystick2 Multisystem 2-button joystick3 Genesis pad (3+1 buttons)5 Genesis pad (5+1 buttons)6 Genesis pad (6+2 buttons)7 Saturn pad (8 buttons)8 Multisystem 1-button joystick (v0.8.0.2 pin-out)9 Two Multisystem 1-button joysticks (v0.8.0.2 pin-out)10 Amiga CD32 pad
FreeBSD與NetBSD共享一套uhid設備驅動代碼,對于USB遊戲手 柄有最基本的支持,在我的PC上FreeBSD-5.1current下的SDL庫(1.2.5)能夠驅動我的Topway 單人手柄,但卻堅持認為我的Gametec USB雙人手柄有-1個按鈕:-< 而使用BSD uhid接口的xmame-0.70.1 則幹脆認不出任何遊戲手柄設備,但Taik0說UHID遊戲手柄設備在*BSD上可以使用,並且成功地在xmame-0.57.1上驅動了他的 JOYSTICK,我相信這可能與遊戲桿設備有關,你可以按照他給出的CASE試一試,或許這對你適用。但借助SDL的支持,xmame-0.70.1完 美地支持了UHID單人手柄,需要注意的是你必須對/dev/uhid0擁有寫權限,否則將無法使用手柄。
FreeBSD能夠支持ISA聲卡上的Gameport接口,但似乎對于PCI聲卡上的 Gameport接口不感興趣,無論是4- STABLE還是5-CURRENT,Alex Teslik給出了一個不用修改代碼就能讓FreeBSD支持Logitech Wingman Attack joystick的方法,然而我在4.8-STABLE(2003-07-18)和5-CURRENT(2003-07-18)上測試均未成功,雖然 FreeBSD已經驅動了我的CMEDIA PCI聲卡。kldstat -v的輸出是這樣的:
2 1 0xc1db4000 2000 joy.koContains modules:Id Name216 isa/joy3 1 0xc1d94000 4000 snd_cmi.koContains modules:Id Name211 pci/snd_cmi4 1 0xc1d99000 14000 snd_pcm.koContains modules:Id Name210 snd_pcm
而Alex Teslik給出的結果是這樣的
4 1 0xc3053000 3000 joy.koContains modules:Id Name99 isa/joy100 pci/joy5 1 0xc305a000 14000 snd_pcm.koContains modules:Id Name101 snd_pcm
我沒有興趣只是為了驅動遊戲手柄而回滾內核代碼,這麼做沒有意義,由于手邊沒有ISA聲 卡,我無從得知FreeBSD對于ISA-GAMEPORT的支持究竟如何,但至少SDL的JOYSTICK驅動中包含了對FreeBSD的 GAMEPORT的支持(SDL12/src/joystick/bsd/SDL_sysjoystick.c 2003-06-02),因此,如果你有被列在FreeBSD兼容列表裡的ISA的聲卡,和GAMEPORT口的遊戲手柄,你應當不會失望。
後記我實在沒有想到這個主題會涵蓋如此之多的內容,而其中的很多內容是我不熟悉 的,因此,如果你發現了任何問題,或者有任何的建議、意見或是補充,請給我發EMAIL,從而讓更多的人能夠分享。我的EMAIL是 h u a n g s o n g @ l i n g t u . c o m,原諒我讓您手動輸入郵件地址,垃圾郵件真的很煩人:-< 請不要向我詢問任何與模擬器ROM下載有關的問題,我不會回答的。

2007年7月21日 星期六

Jail in FreeBSD 5.3(下)

體驗完單人模式 jail, 那麼來把多使用者模式 jail 也跑起來吧。還有些 設定要做: 在主系統的 /etc/rc.conf 放一行:
ifconfig_lo0_alias0="inet 127.0.0.115/32"
這行是設定 jail 要用的 IP。一般是用 alias 的方式。 再加上這幾行:
jail_enable="YES"
jail_list="conair"
jail_conair_hostname="conair"
jail_conair_ip="127.0.0.115"
jail_conair_rootdir="/usr/jails/conair"
jail_conair_exec="/bin/sh /etc/rc"
jail_conair_devfs_enable="YES"
jail_conair_devfs_ruleset="devfsrules_jail"
上面這幾行是 FreeBSD 5.3 之後才有的設定。jail_list 是設定系統裡面 有那些 jail(s)。jail_xyz_hostname, jail_xyz_ip, jail_xyz_rootdir 是每個 jail (上述範例的 xyz 以 conair 代入) 單獨的相關設定, 依實際 情況而有所不同。jail_xyz_exec, jail_xyz_devfs_enable, 以及 jail_xyz_devfs_ruleset, 基本上是固定的, 不用更動。
Jail 設定
多使用者模式 jail, 就當一般的 FreeBSD 系統來設定吧! 照上述的方法進 入 jail 單人模式, 把以下幾個檔案設定好: /etc/hosts第 13 和 14 行, 該 jail 的 IP 和 hostname 要設好。 /etc/resolv.conf至少放 DNS server。 /etc/master.passwd這就是系統帳號存放的地方了。重點就是, 要新增一個可以遠端登入的 帳號。最簡單的方法是用 adduser 或者 sysinstall 開好就行了。 root 的密碼也要設好。 /etc/group別忘了把自己的帳號加進 wheel。 /etc/rc.confsshd_enable="YES"開啟 sshd 才能遠端登入, 因為 jail 是沒有 console 的。 /etc/ssh/ssh_host_*key自 5.3 起, 第一次啟動 sshd 的時候, 會要求使用者打一些資料進去, 幫助系統產生 ssh key。不過呢, jail 啟動的時候是沒有 terminal 的, 這會導致第一次啟動 jail 的時候有 5 分鐘的停頓。有以下兩個 方法, 可以避開這 5 分鐘的延遲:1. 手動執行 /etc/rc.d/sshd start, 亂打一些東西進去。2. 手動執行下列三行指令:/usr/bin/ssh-keygen -t rsa1 -b 1024 -f /etc/ssh/ssh_host_key -N ''/usr/bin/ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ''/usr/bin/ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ''/etc/crontab在 jail 裡面 adjkerntz 要特別關掉。至於其它的 periodic jobs, 依各人需要自行調整。 以上是基本的設定, 接下來看 jail 裡其它的設定檔: /etc/periodic.confperidoc daily 有些事 jail 裡面不用做:
daily_status_security_chksetuid_enable="NO"
daily_status_security_chkmounts_enable="NO"
daily_status_disks_enable="NO"
daily_status_security_kernelmsg_enable="NO"
daily_status_network_enable="NO"
關於 mail, 因為 jail 沒有 127.0.0.1, 所以它無法像一般的 sendmail只聽 127.0.0.1, 反而會直接聽某某 IP。因此 sendmail 要整個關掉。/etc/rc.confsendmail_enable="NONE" 這時候在 /etc/periodic.conf 也要做相對應的修改, 叫它不要寄信出來:/etc/periodic.confdaily_output="/var/log/daily.output"daily_status_security_output="/var/log/security.output"weekly_output="/var/log/weekly.output"monthly_output="/var/log/monthly.output"沒有閱讀 periodic output 習慣的人, 可以將它們都改成 /dev/null。
啟動 jail
到此在 host 上以及 jail 內, 該設定的都差不多了。自 5.3 起, FreeBSD 提供了非常方便的 jail 管理機制, 可以任意的啟動, 關閉任一個 jail。 現在來試一試。 在主系統上# /etc/rc.d/jail start conair 接著 ssh 127.0.0.115, 用剛剛的新加的帳號登入。到目前都沒問題的話, 恭禧你, 已經成功的安裝好一個 jail 了! 接下來就依一般使用 FreeBSD 的方式來使用該 jail 吧。
/etc/rc.d/jail 用法
# /etc/rc.d/jail stop 停止列在 /etc/rc.conf jail_list 中的所有 jails # /etc/rc.d/jail start啟動列在 /etc/rc.conf jail_list 中的所有 jails # /etc/rc.d/jail stop jail1停止列在 /etc/rc.conf jail_list 中的特定 jail # /etc/rc.d/jail start jail1啟動列在 /etc/rc.conf jail_list 中的特定 jail
進階議題
網路連通問題 Host 上若同時設有對內及對外的 IP, 且設給 jail 內部的 private IP, 那麼 jail 設定好後, 還需在 host 上設定 NAT, jail 才能對外連線。在 其它場合, 例如 jail 是對 public IP, 或 jail 及 host 同為 private IP, 已外有執行 NAT 的主機, 則無此限制。
Share ports tree among jails 幾乎所有人使用 jail 的第一個疑問就是, 要怎麼共享 ports tree? 有很 多方法, 例如 nullfs, unionfs, hardlink, NFS 等。mount_nullfs(8) 和 mount_unionfs(8) 看起來很嚇人 (see BUGS), hardlink 也不是好主意。 比較通用的方式是用 nfs。 如何設定 NFS server 和 NFS client 不在本文的討論範圍內, 故將焦點集 中在如何在 jail 內正常使用 NFS mount 進來的 ports tree。 首先, 為了效率, 以及 jails 之間不互相干擾 make ports 程序, 要將 work 目錄調開。設定的方法是把 WRKDIRPREFIX 設定到一個不在 ports tree 裡面的地方。設定的地方是 jail 的 /etc/make.conf, 例如: WRKDIRPREFIX=/tmp 另外還有一個常用的工具程式, portupgrade, 也會寫東西進 /usr/ports, 這也要調開。可以設定的地方之一是 jail 的/etc/login.conf, 裡面多設 一個環境變數, 把 PORTS_DBDIR 改到 /var/db/pkg。除此之外, jail 內的 /etc/csh.login, /etc/profile 也都可以設定這個環境變數。
在 jail 中跑 DNS server FreeBSD 5.3 內建的 bind 已經昇級到 bind 9, 而且預設是以 chroot (不 是 jail!) 方式執行。於 jail 中再 chroot 是沒有問題的, 不過由於 5.3 還有 devfs, 而預設 bind 9 在執行的時候還會再 mount devfs, 這在 jail 內會造成問題。因此要對這點要做點特別調整。把 mount devfs 以及 停止 devfs 相關動作的方式, 是在 jail 內的 /etc/rc.conf 中, 加入 named_chroot_autoupdate="NO" 不過目前為止 named 尚不能正確啟動。接下來解析由 /etc/rc.d/named 啟 動 bind 時需要那些元素:
配置完成的 named_chrootdir (預設是 /var/named)
需要 /dev/null 和 /dev/random
/etc/namedb symbolic link 到 /var/named/etc/namedb 目前欠的就是第 2 點提到的兩個 device nodes。建立它的方式是由 host 中去建立: cd /usr/jails/conair/var/named/devmknod random c 245 0; mknod null c 2 2這樣就可以了。 好了, 接下來一切照舊。:) 在新裝好的 jail 中啟動 bind 的話, 建議先 跑一下 make-localhost, 還有調整一下 named.conf。在 FreeBSD 5.3 裡 面, bind 預設也只有聽 localhost, 不對外服務。而 jail 裡面是沒有 127.0.0.1 的, 所以要把 listen-on { 127.0.0.1; }; 這裡的 127.0.0.1 換成配給 jail 的 IP。
Jail 管理基本知識及工具
以下以列舉在 FreeBSD 5.3 上, 系統提供的 jail 相關訊息以及工具, 及實際應用。 ps利用 ps 指令可以得知某 process 是在 host 或是某一 jail 內運行。在 jail 內的 process, 於 ps 顯示時, 會在 STAT 欄位顯示 J # ps ax grep J這個指令可以列出目前處於 jail 內的 process。但儘止於此, 要得知是屬於那一個 jail 則要用到 procfs。 /proc 在 host 上, 要得知某 process 是屬於何 jail, 可以利用 /proc。但是 5.3 預設並沒有把 /proc 掛上系統, 所以得在 /etc/fstab 加上這一行:
/proc /proc procfs rw 0 0
把 /proc 掛上系統
# mount /proc
把 /proc mount 上來後, 以如下方式觀看該 process 的 status:# cat /proc//status在最後會得知該 process 位於那一個 jail (以 hostname 表示) jls 列出正在運行的 jail# jlsjls 會列出下列幾個欄位 JID, IP Address, Hostname, Path。其中的 JID 是系統配的, 接下來會經常用到它。killallFreeBSD 5.3 的 killall 多了個 -j option, 接 jls 看到的 JID。用 途是將屬於某個 jail 的 process 都砍光。jexec 相關的應用jexec 的用途是, 將 process 由 jail 外送入 jail 內執行。看某 jail 內的 process 列表# jexec ps axwww看某 jail 內的 top# jexec top看某 jail 內的使用者# jexec w 使用 jexec 把 ps / top 送進 jail 內看 process, 有一個很大的好 處是, uid : username 的對照, 會以該 jail 內的為準。 sysctl以下是幾個和 jail 有關的 kernel state 的說明
security.jail.set_hostname_allowed 可於 host 環境中設定, 為 1 的時候在 jail 中可以更改該 jail 的 hostname。預設為 1。
security.jail.socket_unixiproute_only 可於 host 環境中設定, 為 1 的時候表示 host 只幫 jail 把 IP 封包往外送(FreeBSD 還支援 Netware, Appletalk 等等通訊協定)。 預設為 1。
security.jail.sysvipc_allowed 可於 host 環境中設定, 為 1 的時候表示可以在 jail 中使用 shared memory, message queues, 還有 semaphores。預設為 0。 要在 jail 中提供用到上述三者的服務, 如 BBS, 或者 PostgreSQL 時, 要將它設為 1。
security.jail.getfsstatroot_only 可於 host 環境中設定, 為 1 的時候表示在 jail 裡面可以看到 其它 mount point, 反之則只能看到 jail 所在的 mount point。 預設為 1。
security.jail.allow_raw_sockets 可於 host 環境中設定, 為 1 的時候表示在 jail 裡面可以產生 raw sockets。最大的用處是允許在 jail 中使用 ping 指令。預 設為 0。
security.jail.jailed 在 host 和 jail 環境中都是唯讀的, 用途在於幫助 /etc/rc.d 的 shell scripts 判斷是不是身處 jail 之中。 可以直接使用 sysctl 指令, 亦可在 /etc/sysctl.conf 或 /boot/loader.conf 中, 設定上述的 kernel state。
Jail 昇級
Jail 內的 FreeBSD 系統, 和一般的 FreeBSD 系統一樣, 也是要昇級的。 不過手續稍微不一樣。其一, 要先在 host 上 buildworld 好。其二, 在 installworld 的時候要指定 DESTDIR。其三, mergemaster 時要多接一個 -D 的參數。以 conair 為例, 在 host 上執行下列指令:
# cd /usr/src
# make installworld DESTDIR=/usr/jails/conair
# mergemaster -D /usr/jails/conair
這些過程比較複雜且煩瑣, 處理的時候要花點耐心。
結語
自 FreeBSD 4.0 起, jail 為 FreeBSD 提供了良好的資訊安全機制, 更佳 的硬體資源利用方式, 以及更方便的系統管理模式。圍繞著 jail 所衍生的 資安機制, 系統工具, 及管理技巧, 也一直持續的在發展。除了 FreeBSD 5.3 本身之外, 於 ports 中還有許多本文尚未提及的 jail 管理工具, 有 興趣的人可以嘗試看看。如今 jail 已是被廣泛應用, 以及持續發展的技術, 如果您尚未使用過 jail, 何不從現在開始?
延伸閱讀
ps(1), killall(1), jail(2), login.conf(5), sysctl.conf(5), loader.conf(5), jail(8), jexec(8), jls(8), sysctl(8)

Jail in FreeBSD 5.3(上)

作者:evilc
什麼是 jail, 和 FreeBSD 有什麼關係?
Jail 是自 FreeBSD 4.0 起獨有的功能, 發展至今已 4 個年頭。和 chroot 有點像, 但又比 chroot 更強大。Jail 和 chroot 的相同的地方是, 皆會 將某個 process 及其 children 的根目錄 "/", 切換到某一個目錄下, 將 它們關起來。但 jail 可以關的就更多了, 除了可以在存取檔案系統方面做 限制, 在 process 這個層次也做了類似概念的隔離。TCP/IP stack 層次, 也有一定程度的限制。
Jail 的組成, 如同 chroot 般, 首先需要一個目錄, 再視用途, 把必要的 應用程式放進去。以往在建 chroot 環境的時候, 傾向於只把必要的東西放 進去。但在建 jail 的時候, 反而傾向把完整的系統放進 jail 裡。除了已 經裝好系統的目錄之外, jail 還需要有自己的 hostname, 以及自己的 IP。
運行中的 jail 亦是系統的一部份, 共享各種硬體資源, 如 CPU time, memory, disk space, network bandwidth 等等。一般將提供 jail 運行的 主系統稱之為 host。一個空的 jail (不包含 ports) 大約要佔用 150 MB 左右的磁碟空間。日後依 jail 利用方式的不同, 空間的使用也會有很大的 差異。而 CPU time, memory, network bandwidth 方面, 則視 jail 內提 供的服務, 以及執行的應用程式而定。故一個 host 能提供多少 jails, 乃 是依硬體規格及實際負載而定, 系統管理者需依情況評估及調整。
Jail 適合用來做什麼?
一個 jail 幾乎可以被視為一台獨立的 server。因此一般 server 能做的事, jail 幾乎都能做。例如 web server, mail server, shell server, database server... 都是可以 "養" 在 jail 裡面的。
Jail 仍不適合用來做什麼?
Jail 的概念是隔離, 而不是分割, 也不是模擬。某些系統資源, 像是 System V IPC (message queues, shared memory, semaphores) 目前也不 在目前 jail 能隔離的範圍內。又如在檔案系統層次, 雖然和主系統隔離了, 但所使用的磁碟空間, 卻是沒辦法強制限定只能用多少。在 TCP/IP 層次, jail 被限定只能有一個 IP, 連 lo0 127.0.0.1 都沒有。因此, 像是防火 牆, 路由器等等工作, jail 是無法勝任的。又如 BBS, PostgreSQL server 等等, 會使用到 System V shared memory, semaphores 的服務, 也得小心 調整。
FreeBSD 5.3 的 jail 有什麼新奇功能?
Jail 自 FreeBSD 5.0 起逐一修正了許多大大小小的問題, 也新增了如 jls, jexec 等等系統工具。但要說到讓人感到耳目一新, 有全新的感受, 就非得推 FreeBSD 5.3 了! Devfs 有了給 jail 專用的規則, df 能做到不 顯示 host 上其它的 mount point, 且 /etc/rc.d 已完全支援 jail! 如今 啟動 jail 時十分的乾淨, 沒有任何看了心煩的訊息。
安裝 jail
首先, 要把 jail 所需的資源先規劃好。假設 IP, hostname, path 如下:
jail IP: 127.0.0.115
jail hostname: conair
jail path: /usr/jails/conair
以上假設, 是每個 FreeBSD 系統都可以設定的。但在實際的應用上, 則依 客觀條件的不同而有所不同。 接著來把系統裝進去 jail 要使用的目錄。在安裝之前, 要先 buildworld。 這要花一點時間, 視機器的速度而定。
# cd /usr/src; make buildworld
Buildworld 做完後, 要 installworld 到上面規劃的目錄去, 還要把 jail 的 /etc 做出來。這些事有些瑣碎, 也有點危險 (不小心少打幾個字元, 會 reset 主系統的 /etc), 故建議自行寫 shell script 處理。下面是個簡單的範例: newjail.sh
------------------ newjail.sh -------------------------
#!/bin/sh
if [ -z $1 ]; then
echo "specify dest dir such as $0 /some/dir"
exit
fi
if [ ! -d $1 ]; then
echo "dest dir $1 does not exist, mkdir first"
exit
fi
echo "Install a new jail into $1"
D=$1
cd /usr/src
make installworld DESTDIR=$D
cd etc
make distribution DESTDIR=$D
cd $D/etc
ln -sf /var/named/etc/namedb
cd $D
ln -sf dev/null kernel
------------------ newjail.sh -------------------------
我把它放在 /usr/local/sbin/newjail
# cp newjail.sh /usr/local/sbin/newjail
# chmod +x /usr/local/sbin/newjail
安裝 jail base system
# mkdir -p /usr/jails/conair
# /usr/local/sbin/newjail /usr/jails/conair
接著要在主系統上設一個 IP 給它。
# ifconfig lo0 inet 127.0.0.115/32 alias
該有的都有了, 來試試 jail 的 "single user mode"
# jail /usr/jails/conair conair 127.0.0.115 /bin/sh
一些常用指令都可以拿來試試看, 例如 ps, df, top, sockstat, netstat 等等。可以再開一個窗同時比較看看, jail 內和 jail 外有什麼不一樣。

Simple Optimization for PHP and MySQL

Simple Optimization for PHP and MySQL
Saturday April 29 2006 03:23

Here is a list of a few very simple tips for optimizing your php/mysql applications. Keep these in mind while developing.


MySQL

MySQL is interpreted from right to left so you should put the most significant limiters as far to the right as possible.


Only select fields you need, instead of selecting * (everything).


Don't put things that changes very rarely in the database, instead put it in a global array in some include file.


Use indexes on the columns in the WHERE clause and on the columns you want to ORDER BY.


Indexes are great if you search the table alot, but it slows down insertion.


Use the EXPLAIN command to analyze your indexes.


If you only want one line as a result from the database you should always use LIMIT 1. This way mysql stops searching when it finds the first line instead of continuing through the whole database, only to find that there weren't any more lines that matched the query.


If you use $line = mysql_fetch_array($result) you'll get two ways of accessing the columns, $line[0] and $line['columnname']. If you only use the $line['columnname'] you should use $line = mysql_fetch_assoc($result) instead, then there will not be any $line[int index] array.


Sometimes mysql_free_result() end up wasting more memory than it saves. Check the difference with memory_get_usage().


Don't ask the database for the same stuff over and over again, save the result.


Use NOT NULL as default value as much as you can, it speeds up execution and saves one bit.


Use datatypes that fits your data, not too large. For example, INT can hold values up to 4294967295 unsigned, which is often unnecessarily big. Use MEDIUMINT or SMALLINT where applicable.


Make use of the default values, only insert values that differs from the default values to speed up the insertion.





PHP:

Many code blocks might slow down the interpretation a little bit.





is faster than







Don't concatenate when you don't need to.

"SELECT id FROM tabell WHERE id = $_SESSION[id] LIMIT 1"

is faster than:

"SELECT id FROM tabell WHERE id = ".$_SESSION['id']." LIMIT 1"


Surrounding your string by ' instead of " will make things interpret a little faster since php looks for variables inside "..." but not inside '...'. Of course you can only do this when you don't need to have variables in the string.


The previous item makes it all boil down to

'SELECT id FROM tabell WHERE id =
'.$_SESSION['id'].' LIMIT 1'

as the fastest way of concatenating querys.




When echoing strings it's faster to separate them by comma instead of dot.

echo "echoing ",$variable," something";

Note: This only works with echo, which is a function that can take several strings as arguments.



echo is faster than print.


Set the maxvalue for your for-loops before and not in the loop.

$maxvalue = 100/10;
for($i=0; $i<$maxvalue; $i++){
// Some code
}


is faster than:

for($i=0; $i<100/10; $i++){
// Some code
}


because the value is calculated once instead of ten times.



Unset your variables to free memory, especially large arrays.



If possible it's of course always better to generate static html pages every time something is updated or as often as an update might be relevant instead of querying the database every time.

Choosing right data type
http://dev.mysql.com/doc/refman/5.0/en/data-size.html
Optimizing Queries with EXPLAIN
http://dev.mysql.com/doc/refman/5.0/en/explain.html
Other Optimization Tips http://dev.mysql.com/doc/refman/5.0/en/tips.html
A HOWTO on Optimizing PHP http://phplens.com/lens/php-book/optimizing-debugging-php.php

[轉錄]FreeBSD Tinderbox (上)

ublished by Gea-Suan Linat July 17, 2006 in , , , and .
這篇主要是給 FreeBSD Ports maintainer/committer 看的,如果你看不懂,呃… 到 #bsdchat 上問看看吧 :p

Tinderbox (在 misc/tinderbox 裡) 主要是拿來測試 port 是否可以正常的編出來,順便產生 package。網頁在 http://tinderbox.marcuscom.com/ 這,其中的 README 寫得蠻清楚的,建議仔細看。

Tinderbox 的好處在於他會產生一個 chroot 的環境 (在 Tinderbox 官方說明文件裡的 “Jail” 指的是 chroot 的環境,下面提到 Jail 都是指這個,而非 FreeBSD 的 jail),然後在裡面進行編譯的工作,這可以測試在系統什麼都沒有裝的情況下是否能正確編譯。主要是要看有沒有漏設 *_DEPENDS。

另外,Tinderbox 可以在 6.x 的機器上建立出 5.x 甚至 4.x 的 Jail 並進行編譯,這使得以往要在多台機器上測試的情況可以在一台機器上測試完畢。

再來,Tinderbox 可以對每個 Jail/PortsTree/Build 自訂環境變數 (關於什麼是 PortsTree 與 Build,在後面會提到),於是你可以利用這些東西建立出設定不同的 Perl version (4.11 系統裡的 5.00503,或是 5.6.x,或是目前建議用的 5.8.x),這對於 p5-* 的 maintainer 相當方便。

接下來開始講 misc/tinderbox 的安裝,Tinderbox 需要一個 Database,裝 mysql 4.1 之後的版本,接著裝 databases/p5-DBI 與 databases/p5-DBD-mysql{41,50,51,…},然後才裝 Tinderbox。

裝好後東西都丟在 /usr/local/tinderbox 下,原則上不動這個目錄,直接找個夠大的空間 cp -R 過去,像我自己是丟在 /da1/tb 下。

丟進去以後改 /da1/tb/scripts/tinderbox.ph,改前面幾行的設定就好,重點在於第一行的路徑要設對就可以了。改好後跑 cd /da1/tb/scripts && ./tc init,然後看看 /da1/tb 下面是不是多了一堆目錄。

接著建立 Jail,挑你想要測試的環境建立:

#
# 4.11-RELEASE
./create Jail -j 4.11 -d “FreeBSD 4.11-RELEASE” -t RELENG_4_11 -u CVSUP -H cvsup.tw.freebsd.org
#
# 4-STABLE
./create Jail -j 4 -d “FreeBSD 4-STABLE” -t RELENG_4 -u CVSUP -H cvsup.tw.freebsd.org
#
# 5.5-RELEASE
./create Jail -j 5.5 -d “FreeBSD 5.5-RELEASE” -t RELENG_5_5 -u CVSUP -H cvsup.tw.freebsd.org
#
# 5-STABLE
./create Jail -j 5 -d “FreeBSD 5-STABLE” -t RELENG_5 -u CVSUP -H cvsup.tw.freebsd.org
#
# 6.0-RELEASE
./create Jail -j 6.0 -d “FreeBSD 6.0-RELEASE” -t RELENG_6_0 -u CVSUP -H cvsup.tw.freebsd.org
#
# 6.1-RELEASE
./create Jail -j 6.1 -d “FreeBSD 6.1-RELEASE” -t RELENG_6_1 -u CVSUP -H cvsup.tw.freebsd.org
#
# 6-STABLE
./create Jail -j 6 -d “FreeBSD 6-STABLE” -t RELENG_6 -u CVSUP -H cvsup.tw.freebsd.org

執行後他會跑 cvsup 將指定的版本抓回來,然後 make world 將 Jail 建立出來。

portupgrade under jail

使用上一篇的host 共用 ports 的方法
portupgrade 升級軟體,你會發現因為沒有辦法寫入 /usr/ports (要更新 INDEX.db) 而失敗
我發現這個問題可以想辦法避開寫入 /usr/ports 就可以了,在 portupgrade 的 manpage 裡面有提到 PORTS_DBDIR 這個變數
PORTS_DBDIR Alternative location for the ports database files.
Default is ``$PORTSDIR''.於
是只要在 /usr/local/etc/pkgtools.conf 裡面設定:
ENV['PORTS_DBDIR'] ||= '/tmp'
指到 /tmp 就可以解決了。

Jail installtion

1.enviroment Setting
buildworld
make installworld DESTDIR=/da1/jail0
make distribution DESTDIR=/da1/jail0
2.add users
改 /da1/jail0/etc/master.passwd
pwd_mkdb -d /da1/jail0/etc /da1/jail0/etc/master.passwd (rebuild password)
add your home dir
3. edit rc.conf
ifconfig_fxp1_alias0="inet 192.168.1.10/24"
jail_enable="YES"
jail_list="testbase"
jail_testbase_devfs_enable="YES"
jail_testbase_devfs_ruleset="devfsrules_jail"
jail_testbase_exec="/bin/sh /etc/rc"
jail_testbase_hostname="testbase"
jail_testbase_ip="192.168.1.10"
jail_testbase_rootdir="/da1/jail0"
pf_enable="YES"
4.pf setting
nat on fxp0 from 192.168.1.0/24 to any -> (fxp0)
nat on fxp1 from 192.168.1.0/24 to any -> (fxp0)
5. other setting ex.resolv.conf , hostname
6.start jail
/etc/rc.d/jail start
7.generate ssh key 請自己去 /etc/rc.d/sshd 翻
ps. 如果要跟 host 共用 ports directory,可以用 mount_nullfs 以 read-only 掛上來 (security issue),然後修改 /etc/make.conf,把本來會寫入的部分都改到 /tmp 下:
DISTDIR= /tmp/distfiles
WRKDIRPREFIX= /tmp/WRKDIR
ps2.
像是 jail 弄好之後發現沒有帳號可以登入,在 jail host 上:
cd /jail_path/etc
vim master.passwd
pwd_mkdb -d . master.passwd
其實也可以這樣:
vipw -d /jail_path/etc
不知道現在的書還會不會教這些…

[轉錄]为FreeBSD中的Firefox安装Flash插件

要在FreeBSD中為Firefox安裝Flash插件需要以下步驟:

a) install www/linuxpluginwrapper

b) install www/linux-flashplugin7

c) cp /usr/local/share/examples/linuxpluginwrapper/libmap.conf-FreeBSD6 /etc/libmap.conf

d) ln -s /usr/local/lib/npapi/linux-flashplugin/* /usr/local/lib/firefox/plugins/

[轉錄]功能強悍的 Window Manager - IceWM!

Tetralet | 11 二月, 2006 15:19

雖然 GNU/Linux 一直給人生人勿近的印象,但別就這樣以為在 GNU/Linux 上就沒有好用的圖形介面。事實上,如果不要抱持著太深的偏見,GNU/Linux 的桌面環境只要稍加調校就能夠讓人驚豔不已。


X Window System 簡介

X Window System 是在 Linux 上,類似 Microsoft Windows 的一個圖型介面環境,它可以簡稱為 X Window、X11 或 X,其實它的年紀可是比 Microsoft Windows 還大呢!

在 X Window System 的架構裡,X Client 是那些在 X 上執行的應用程式,它會呼叫 Xlib,Xlib 使用 X Protocol 和 X Server 溝通。而 X Server 則是負責控制硬體,依 X Client 的請求而將結果顯示在使用者螢幕上,因此如果將 X Server 視為本機的顯示服務程式也不為過。而夾在中間的則是 Window Manager,Window Manager 管理包含視窗裝飾在內的許多 X Resources,比如說它會決定視窗的位置、管理視窗的操作及視窗的大小、決定視窗邊框的樣式及一些使用者和視窗的互動方式等等。

註一: 以上 Window Manager 的說明文字經過 Jserv 前輩的指正。感謝!
註二: Jserv 前輩表示他會寫一篇釐清 Window Manager 觀念的文章。敬請期待!

IceWM 簡介

IceWM 是一個非常輕巧快速且功能齊全的 Window Manager,在外觀及操作上極為類似 Motif、OS/2 及 Microsoft Windows。如果您受夠了肥大的 KDE 或是 GNOME,那麼 IceWM 可能會是您的最佳選擇。

安裝 IceWM

在 Debian GNU/Linux 裡安裝 IceWM 絕非難事,只要一行指令就搞定了:

apt-get install icewm

如果您同時在您的系統上安裝了多個 Window Manager,那麼請修改系統的設定,讓 X Window 啟動時呼叫 IceWM:

update-alternatives --config x-session-manager
update-alternatives --config x-window-manager

或者您也可以在您的 ~/.xinirc 中自行指定。例:

#!/bin/sh
# $Xorg: xinitrc.cpp,v 1.3 2000/08/17 19:54:30 cpqbld Exp $

# /etc/X11/xinit/xinitrc
#
# global xinitrc file, used by all X sessions started by xinit (startx)

xset +dpms
xset dpms 300 480 600

export LC_CTYPE=zh_TW.UTF-8
export LC_MESSAGES=zh_TW.UTF-8
export XMODIFIERS="@im=gcin"
export GTK_IM_MODULE=gcin
/usr/bin/gcin &

icewm-session

飛快!

IceWM 給人的第一印象就是:快!快!快!因為它的程式碼不大,並且對於系統資源也要求不高,官方網站說只要 X 可以跑,IceWM 就可以跑,就算是是 386 機器也行。在此可以約略得知 IceWM 是如何的輕巧快速了。

相容性

因為 IceWM 本身預設上並不是專為其它 Desktop 環境所設計的,所以它的相容性極佳,不管是 KDE 或 GNOME 多可以在 IceWM 上執行無誤。IceWM 同時也支援了 Desklet(系統工具匣)、透明底圖... 等等常見的功能,所以有不少人乾脆捨 KDE/GNOME,直接拿 IceWM 來當桌面使用了。

簡易的操作介面

由於 IceWM 在外觀及操作上刻意模仿 Motif、OS/2 及 Microsoft Windows,所以由 Microsoft Windows 跳槽過來的人們在操作 IceWM 時就免於重新適應之苦了。

比如說,Microsoft 上的【程式集列表】、【快速啟動列】、【系統工具列】、【小時鐘】等等,在 IceWM 上都可以看到。另外,像是在應用程式的標題列上點兩下是視窗放大,再點兩下則是還原,這些操作方式在 IceWM 裡都可以見到。

另外,修改您的 ~/.icewm/preferences 如下:

# Support win95 keyboard keys (Penguin/Meta/Win_L,R shows menu)
Win95Keys=1 # 0/1

# Auto hide task bar after delay
TaskBarAutoHide=1 # 0/1

那麼,在 IceWM 裡按下【Win】這個鍵時,下方的系統工具列就會跳出來,而等上一定的時間後它又會縮回去,而這和 Microsoft Windows 的操作也是極為類似的。

虛擬桌面

在預設上,IceWM 會啟動 4 個虛擬桌面,這對於習慣同時開啟多個應用程式的人們可以說是難得的福音。以筆者為例,個人喜歡把日常事務擺在第一個桌面裡、root 的工作擺在第二個桌面,第三個桌面擺的則是遠端的 SSH、rdesktop、xvncviewer 之類的遠端操作環境,第四個桌面擺的則是一些在背景執行的程式,像是 XMMS 或是用來編譯程式的 chroot 環境等等。這樣的分門別類後將有助於增加工作效率。像是在切換至第二個桌面時,直覺上就知道這個桌面裡擺的全是以 root 權限執行的程式,當然會更加小心謹慎得操作,這樣多多少少能避免一些無心之過所導致的災難性後果。

IceWM 的虛擬桌面

您可以修改您的 ~/.icewm/preferences:

WorkspaceNames=" 1 ", " 2 ", " 3 ", " 4 "

來自訂虛擬桌面的名稱及數量。

另外,請同時修改您的 ~/.icewm/preferences 如下:(因為它和 XCIN 的快捷鍵重覆了)

KeySysWorkspace1="Super+F1"
KeySysWorkspace2="Super+F2"
KeySysWorkspace3="Super+F3"
KeySysWorkspace4="Super+F4"

之後,【Win】+【F1】就會直接跳至第一個虛擬桌面,【Win】+【F2】就會直接跳至第二個虛擬桌面... 同時,您還可以使用【Ctrl】+【Alt】+【←】和【Ctrl】+【Alt】+【→】直接切換至 上/下一個虛擬桌面。或是按下【Ctrl】+【Alt】+【Shift】+【←】和【Ctrl】+【Alt】+【Shift】+【→】直接將應用程式移至上/下 一個虛擬桌面。或是按下【Ctrl】+【Alt】+【Shift】+【1】直接將應用程式移至第一個虛擬桌面。在操作 IceWM 時這些快捷鍵將會是很方便的小技巧。

將視窗『釘』起來

在操作 GIMP 時,會不會覺得它的工具視窗常常被正在操作中的前景視窗蓋住實在不怎麼好用?在 IceWM 裡,您可以將視窗『釘』在別的視窗之上,它就永遠不會被別的視窗蓋住了:

把 GIMP『釘』在其它視窗之上

其它 Linux 桌面的特性

除了虛擬桌面之外,一些 Linux 桌面常見的特性,像是:

*

將視窗捲起(【Alt】+【F12】)
*

隱藏視窗(【Alt】+【Shift】+【F12】)
*

全螢幕顯示(【Alt】+【F11】),當應用程式不支援全螢幕顯示時這可是超好用的。
*

將所有視窗縮至工具列(【Alt】+【Shift】+【F9】)
*

顯示桌面(【Alt】+【Ctrl】+【d】)

等等,都可以在 IceWM 裡找到。而這些快捷鍵都可以在 ~/.icewm/preferences 中加以修改:

KeyWinRollup="Alt+F12"
KeyWinHide="Alt+Shift+F12"
KeyWinFullscreen="Alt+F11"
KeySysMinimizeAll="Alt+Shift+F9"
KeySysShowDesktop="Alt+Ctrl+d"

快捷鍵

IceWM 還有一個讓人津津樂道的優點,就是它使用了超多的快速鍵組合,幾乎可以取代滑鼠的所有動作,比如說:

*

【Alt】+【F4】= 關閉視窗
*

【Alt】+【F6】= 下一個視窗
*

【Alt】+【Shift】+【F6】= 上一個視窗
*

【Alt】+【F9】= 縮至最小
*

【Alt】+【F10】= 放至最大
*

【Alt】+【空白鍵】= 呼叫視窗選單
*

【Alt】+【Tab】= 顯示視窗列表並切換至下一個視窗
*

【Alt】+【Shift】+【Tab】= 顯示視窗列表並切換至上一個視窗
*

【Ctrl】+【Alt】+【Del】= 系統關機/登出/鎖定/重新啟動 IceWM 對話視窗
*

【Ctrl】+【Alt】+【Esc】= 視窗列表
*

【Ctrl】+【Alt】+【空白鍵】= 快速啟動。可以用來直接執行應用程式。

對於一些鍵盤快手而言,IceWM 提供的這些快捷鍵實在是非常方便!當然了,這些快捷鍵全都可以自訂,您可以在 ~/.icewm/preferences 依自己的喜好來任意指定這些快捷鍵組合。

自訂呼叫應用程式的快捷鍵

除了以上 IceWM 所內建的快捷鍵之外,您還可以在 ~/.icewm/keys 中自行指定呼叫應用程式的快捷鍵。比如說:

key "Super+t" x-terminal-emulator

那麼當您按下【Win】+【t】時,系統就會呼叫 x-terminal-emulator 這個應用程式了。

當然了,我們可以稍加變化:(請安裝 aumix 套件)

key "Super+Up" aumix -w +5
key "Super+Down" aumix -w -5
key "Super+Right" aumix -w +1
key "Super+Left" aumix -w -1

那麼我們就可以用【Win】+【↑】【↓】【←】【→】來直接控制音量大小了。

類似的手法:

key "Super+Prior" xmms -r
key "Super+Next" xmms -f
key "Super+Insert" xmms -t
key "Super+Delete" xmms -q

我們就可以用【Win】+【PageUp】【PageDown】來控制 XMMS 播放上一首、下一首,用【Win】+【Insert】來讓 XMMS 暫停/開始 播放,或是用【Win】+【Delete】來關閉 XMMS。

另外,我們還可以使用:(請安裝 xmacro 套件)

key "Menu" /bin/sh -c "echo -e "ButtonPress 2nButtonRelease 2n" | xmacroplay "$DISPLAY""

來用【Menu】這個鍵來模擬按下滑鼠中鍵貼上的動作。

其實只要花點心思,IceWM 的快捷鍵是可以千變萬化的!

系統工具列上的小圖示

IceWM 在系統工具列上預設就有【現在時間】、【即時 CPU 負載】、【網路即時流量】、【監看 POP、IMAP 的 E-mail】等小圖示,所以您只要一按下【Win】這個鍵,您就可以直接由系統工具列得知這些即時資訊:

IceWM 的系統工具列

當然了,如果您不喜歡這些圖示,您可以由 ~/.icewm/preferences 把這些功能關閉。如上圖中,就沒有【監看 POP、IMAP 的 E-mail】這個圖示。
在 X Window 上眾多的 Window Manager 中,還找不到幾個有這些貼心的功能的呢!

快速啟動列:

和 Microsoft Windows 類似的,IceWM 也有快速啟動列:

IceWM 的快速啟動列

方法是修改 ~/.icewm/toolbar 如下:

prog Mozilla mozilla /bin/sh -c 'LC_ALL=zh_TW.UTF-8 mozilla'
prog XTerm xterm crxvt-big5
prog Konqueror kde konqueror

這個檔案的格式為:

#
顯示名稱
圖示
指令
prog Mozilla mozilla /bin/sh -c 'LC_ALL=zh_TW.UTF-8 mozilla'

修改後按下【Ctrl】+【Alt】+【Del】重新啟動 IceWM 即可生效。

設定按下【Ctrl】+【Alt】+【Del】時所執行的命令

在 IceWM 裡,按下【Ctrl】+【Alt】+【Del】後,會出現以下視窗:

在 IceWM 裡按下【Ctrl】+【Alt】+【Del】時所出現的畫面

您必須在 ~/.icewm/preferences 中加以修改:

# Command to shutdown the system
ShutdownCommand="sudo /sbin/shutdown -h now"

# Command to reboot the system
RebootCommand="sudo /sbin/shutdown -r now"

# Command to lock display/screensaver
LockCommand="xlock"

並安裝設定好 sudo 及 xlockmore/xlockmore-gl 套件,這些按鈕才能有作用。

自訂佈景主題

IceWM 也可以讓您自訂佈景主題,您可以把您的佈景主題放到 ~/.icewm/themes 下,然後修改 ~/.icewm/preferences:

Theme="icedesert/default.theme"

其中的 icedesert 為您的佈景主題目錄。

在 IceWM 裡,您可以修改您的滑鼠遊標圖示、視窗標題、視窗按鈕、邊框、桌面背景... 等等。請參考 IceWM Themes Howto page 來取得更多設定佈景主題的技巧。

易於設定:

IceWM 的設定檔十分簡易,大多只要看一下設定檔上的簡短說明就會設定了,所以雖然有不少的 IceWM 的圖形介面設定程式,但多數人還是選擇直接修改它的設定檔。像 IceWM 的官方網頁上面就寫:

如果您想尋找什麼選項的話,您可以直接查看 ~/.icewm/preferences。
它經過了精心的配置,您應該輕易得就可以找到您所尋找的東西-
比如說,您想改變一些 quickswitch 選項,只要試著在偏好檔尋找 "QuickSwitch" 即可。

IceWM 功能強大卻還能保持輕巧快速,加上又如此易於設定,實在是不可多得的 Window Manager!推薦大家能試用看看!

Debian_Desktop :: 迴響 (9) :: 靜態連結網址 :: 引用 (0)

2007年7月19日 星期四

[轉錄]FreeBSD ports send-pr 初體驗

Published by Hubert at 5:57 pm under FreeBSD

剛好在實驗室有幾個 library 很常用,不外乎 jrtplib, ortp, osip, eXosip。可是 ports 裡的 jrtplib 是 3.1.0,大概是 2004 年的版本,所以我就想來試試看吧,把他送進 ports 之後,要升級或者是移除都方便許多……

所以我先找到 chinsan 長輩在 tw.bbs.comp.386bsd 發表的這篇,也參考了一下 FreeBSD Porter’s Handbook,還有 rafan 及 clsung 長輩的文章。

我的流程大概是這樣:

ports 施工:

# fetch -o /usr/ports/distfiles source-url
# cd /usr/ports/
# cp -r port-name port-name.orig
# vim Makefile
# vim pkg-desc
# make makesum
# 不幸的話,在 files 裡面加入 patch 檔

產生 pkg-plist,你可以參考 Automated package list creation

# mkdir /var/tmp/port-name
# mtree -U -f /etc/mtree/BSD.local.dist -d -e -p /var/tmp/port-name
# make depends PREFIX=/var/tmp/port-name
# make install PREFIX=/var/tmp/port-name
# (cd /var/tmp/port-name && find -d * \! -type d) | sort > pkg-plist

# vim pkg-plist
(不見得他產生的東西都會正確,例如:有時候你會希望用變數取代絕對路徑、有時候你想把某些東西拔掉)

施工完成的測試:

FreeBSD Porter’s Handbook 的建議順序:

1. make install
2. make package
3. make deinstall
4. pkg_add package-name
5. make deinstall
6 .make reinstall
7. make package

除此外,你可以用 devel/portlint 來做測試。

send-pr:

我這邊是偷懶用 devel/porttools 來送。porttools 裝好之後,還是不外乎用 port test 測試看看,port diff 看一下結果,如果都沒有問題的話,就直接用 port sumbit 送出去了。那些欄位的要求,我想 chinsan 長輩的文件寫得很清楚歐 :p

你可以編輯 .porttools 方便你用 devel/porttools 處理 port。

EMAIL=”foo@bar.com”
FULLNAME=”Yi-Huan Chan”
ORGANIZATION=”"
BUILDROOT=”/tmp”
ARCHIVE_DIR=”"
DIFF_MODE=”.orig”
DIFF_VIEWER=”more”
PORTLINT_FLAGS=”abct”

你可以發現我的 DIFF_MODE 設定為 “.orig”,那也和我一開始取名的方式有關,你可以依照自己的需求改變這個參數。

port submit 之後就等著去信箱領取號碼牌了,像是我之前處理的某兩個……

http://www.freebsd.org/cgi/query-pr.cgi?pr=95461
http://www.freebsd.org/cgi/query-pr.cgi?pr=95534

然後看有沒有好心人幫你送上去,處理完之後,你就可以看到你處理過的 port 出現在 ports tree 裡面了。

[文件] send-pr 的基本介紹

發信人: chinsan.bbs@bbs.ilc.edu.tw (我只是小小新手唷), 看板: FreeBSD
標 題: [文件] send-pr 的基本介紹
發信站: 山水蘭陽 (Sat Dec 3 23:01:26 2005)
轉信站: ptt!ctu-reader!news.nctu!ilcbbs


====== 授權方式 ======
姓名標示-非商業性-相同方式分享 2.5 (Attribution-NonCommercial-ShareAlike 2.5)
http://creativecommons.org/licenses/by-nc-sa/2.5/


====== 前言 ======
感謝 nung 大長輩在 MSN 上再次提醒了我的欠稿 XD
(本來答應要寫份關於 send-pr 的文件,結果寫的蠻簡陋)

如果沒有他的提醒,我可能一直都沒丟出這份文件..
此外,再次感謝他對我在 LDAP 上的教導 :)


====== send-pr 簡介 ======
/usr/bin/send-pr 這支 shell script在 *BSD 環境中相當好用,怎麼說呢?
它的應用範圍:
就 ports 而言,可以透過 send-pr 將做好的新 port 、送 patch
或是問題狀況回報總部。
當然囉.. www, docs, i386, ia64 等不同領域的問題也都可以透過 send-pr 來完成。

另外,還有其他方式的 send-pr
www介面的 send-pr
http://www.freebsd.org/send-pr.html

圖形介面的 send-pr
sysutils/gtk-send-pr

當然,也可以複製一份 shell script,然後修改成自己想要的方式。


====== send-pr 使用 ======
send-pr 會先用你的 $EDITOR 進入PR樣本來編輯,通常會有下面這樣

(略過前面一堆東西,先從 header 介紹起)
To: FreeBSD-gnats-submit@freebsd.org

From: chinsan
Reply-To: chinsan
通常發信的 From 跟 Reply-To 都填一樣就好,
前面是名字,後面先加空白,再把 <> 括號內填入可收信的 e-mail
(這裡純舉例,不要真的填 chinsan =.=!)
Cc:
如果 port 有 maintainer 的話,則順便這邊填上他的 email
也可以用 send-pr -c 該maintainer的 e-mail

X-send-pr-version: 3.113
X-GNATS-Notify:

(以下開始進入 send-pr 的 body)
>Submitter-Id: current-users
>Originator: chinsan
^^^^^^^ 填自己名字或全名。

>Organization:
看要不要填『單位』,有填沒填無所謂
也可以設定 $ORGANIZATION 省得每次填 send-pr 要重填一次
另外,
1. 用 <> 括號括起來的文字都是那欄資料的描述文字,
2. 真正要寫的部分,不要寫在 <> 括號內,
<> 括號內的字只是說明給自己看而已
3. <> 括號跟裡面的文字都可以砍掉,或不砍都可以
4. 通常可不可以填多行會有註明 (multiple lines)
而 (one line) 就是只能寫一行。
5. 以下所有出現 <> 括號的地方都是該欄的說明文字,
請不要把字填在 <> 括號內。

>Confidential: no
^^ 通常用 no 就可以了,也就是公開的

註:
除非你找到重大漏洞,在該重大漏洞獲得解決前,
有需要用到"保密",以免他人一起遭殃

>Synopsis:
這邊就是該問題報告的『標題』,
標題要下得簡潔有力,並且請填 1 行就好。
似乎很多人都會先看這邊寫什麼,如果亂填一通或是文不對題
那就會被人連看都不看就 close 掉。

通常像是 ports 的話,Synopsis 會以類似下面的命名規則:
[性質] 分類/該 port 名稱: 簡潔描述本 PR 內容、目的
性質:通常有 [NEW PORT]、[PATCH]、[UPDATE]、[MAINTAINER]等等
分類:該 port 位於 /usr/ports 內的分類目錄名稱,
比如 gcin 位於 /usr/ports/chinese/gcin ,
所以就是 chinese

>Severity: 請在 non-critical 或 serious 或 critical 三者選一
看問題嚴重性,通常都是 non-critical,
如果不嚴重卻填很緊急(critical),那就蠻 xxoo...

>Priority: 請在 low 或 medium 或 high 三者選一
問題的處理態度是否需要優先或普通或不急慢慢來,
通常無關 security 的小 bug、update 填 low 就好。

>Category: 問題有下面這幾種分類:
advocacy, alpha, amd64, bin, conf, docs, gnu, i386, ia64,
java, kern, misc, ports, powerpc, sparc64, standards,
threads, www
通常 ports 的問題就填 ports 就好,
www 類的就填 www。kernel 類的填 kern,自己找適合的問題歸類就好

>Class: <[sw-bug|doc-bug|change-request|update|maintainer-updae]>
以 ports 方面的 PR 為例:ports 的安裝問題通常填 sw-bug
升級 update
新增/移除 change-request
port maintainer 自己提的就填 maintainer-update

>Release: FreeBSD 4.11-STABLE i386
這邊是 send-pr 自動幫你產生的(uname -rsm),不用改

>Environment:
System: FreeBSD bbs.ilc.edu.tw 4.11-STABLE FreeBSD 4.11-STABLE #0: Sat Jan 29
這邊也是會自動抓 uname -a 的訊息,
如果要補充使用環境也可以在這邊填(可多行)

>Description:
請精準描述問題狀況,把問題講清楚、說明白,並把相關所有出現的訊息附上

>How-To-Repeat:
這邊附上如何讓問題重新產生(操作程序、執行動作),也可把相關疑似有問題
的程式碼貼出來

>Fix:
如果知道怎麼修正的話,就在這邊可填上說明或程式碼。
不知道就請跳過。
如果有 patch 的話,請用 attatchment 附檔方式,
也就是 send-pr -a 你放patch的地方,這樣 send-pr 的 Fix: 這區
就會幫你弄好了

* * *
FreBSD PR 的 feedback 期限是 1 個月
maintainer feedback 期限是 2 週
reply,followup 要順便 CC 給 bug-followup@freebsd.org

* * *

此外如果不太會傳統的 send-pr 或者機器 policy 不開 MTA
也有網頁式介面 http://www.freebsd.org/send-pr.html
不過若用網頁回報方式,它不會認 TAB 跟 spacing 的區別而都弄成 spacing
如果堅持要用 Web 來送 code 的話,那麼建議先壓成檔案,然後附上可取得該檔的 URL
還有,最下方有個防止惡搞機器人的簡易確認機制。


* * *

send-pr 之後就會在你填的 Originator 那欄的 Email Address 收到確認信
會有如下資料,告知 GNAT 已經收到了,而你的 PR 編號為 ports/78996
可以透過信中 URL 來察看狀態

來源: FreeBSD-gnats-submit@FreeBSD.org
收信: chinsan
日期: Fri, 18 Mar 2005 20:10:02 GMT
標題: Re: ports/78996: [MAINTAINER] chinese/gcin: update to 0.8.9

Thank you very much for your problem report.
It has the internal identification `ports/78996'.
The individual assigned to look at your
report is: freebsd-ports-bugs.

You can access the state of your problem report at any time
via this link:

http://www.freebsd.org/cgi/query-pr.cgi?pr=78996

>Category: ports
>Responsible: freebsd-ports-bugs
>Synopsis: [MAINTAINER] chinese/gcin: update to 0.8.9
>Arrival-Date: Fri Mar 18 20:10:02 GMT 2005


====== send-pr 補充事宜 ======
FreBSD PR 的 feedback 期限是 1 個月
maintainer feedback 期限是 2 週
reply,followup 要順便 CC 給 bug-followup@freebsd.org


====== send-pr 的另外一種運用方式 : send-pr + ssmtp ======

如果機器沒反向DNS解析的話...該怎麼辦呢?

因為垃圾郵件太多,FreeBSD 的 mailing list 主機做了些限制:
一定要從可以做反向DNS解析(具 RDNS record)的機器發出的信才接收。

這部分請參考 dryice 的 send-pr + ssmtp 解法:
http://www.douzhe.com/docs/jh/5/231360.html


====== patch檔 跟 new port 的 shar 檔 如何產生? ======

- diff/patch 篇: 大致以 "diff -ruN 舊 新"產生

- shar 的時機: 通常是 new port (要新增port)才會用到的
指令類似:
shar `find 該port的目錄 -print` > /path/to/your.shar

我自己作法通常都是像這樣:
shar `find dokuwiki -print` > ~/dokuwiki.shar
send-pr -a ~/dokuwiki.shar -c 長輩的e-mail

關於 diff/patch 以及 shar ,將在日後的 Porter Handbook 中譯有進一步解說


==
以上是我之前 send-pr 的經驗啦 :p
可參考 http://tinyurl.com/6j2kg
aka http://www.freebsd.org/doc/en_US.ISO8859-1/articles/
problem-reports/article.html

不知道有沒有其他長輩要補充? :Q


--
靜中見真境,淡中識本然
--
◢◣ - ● -
◢██◣◢◣ ` Origin: 宜蘭資教.山水蘭陽 telnet://yilan.twbbs.org
~~ ﹌ ~﹌ ﹉ From : 220-135-110-151.HINET-IP.hinet.net