星期二, 9月 06, 2005

星期二, 5月 24, 2005

用 subversion 作版本控制

  • 前言
      因為我時常在PC及Mac或 是其它公用電腦上進行開發的工作,常常是要面對同一份 code ,原本都是用 FTP 或隨身碟來保有最新版本的 code,不過這樣的作法實在不 make sense,於是開始想利用一些版本控制的工具來幫忙我做這些瑣事,這樣即便我換到不同的電腦上工作,都可以輕易取得最新版本的 code。

  • 環境
      我自己有一臺 FreeBSD 的 server,我打算在上面安裝 svn server 來存放最新版本的 code,而工作用的 PC 或 Mac 則使用 svn client 來取得最新版本。svn server 我是使用 subversion 這套軟體,而 PC 上我用 TortoiseSVNsvk, Mac 上則是用 svk。

  • SVN Server 的安裝
    1. 在 FreeBSD 的 ports 中就已經有 subversion 了,所以只需要安裝 /usr/ports/devel/subversion 就可以了。

    2. 安裝好 subversion 之後,便可以使用 svnadmin 指令來建立 Repository。比方說我要在自己的目錄下建立一個新的 Repository,就可以輸入下列指令:

      svnadmin create /home/eric/project/foo

      於是它就會在 /home/eric/project/foo 下建立好 Repository 了。

    3. 接著就是要設定一下權限,打開 foo/conf/svnserve.conf 這個檔案,加入下面三行設定(或是 demark 原本註解掉的設定),在這裡我不希望匿名使用者能存取 repository,所以我 anon-access 設成 none。

      [general]
      anon-access = none
      auth-access = write

    4. 這樣就可以使用這簡單的 repository 了。

  • SVN Client
       在這部分我主要是用在 Mac 或 Linux/FreeBSD 上用 svk 的方式來介紹(當然要安裝 svk 軟體,它並不是內建的),如果在 PC 上(Win32作業系統)使用 TortoiseSVN,其實步驟是一模一樣,只不過它整合到「檔案總管」,按右鍵就能操作了。

    1. 第一次建立 project 時,要先作 check out 的動作,svk 的用法就是:

      svk checkout svn+ssh://eric@servername/home/eric/project/foo

      從指令中我們可以看得出來這種作法是使用 SSH 作認證的機制,如果 svn server 有別的認證方式,就要看一下文件囉。

      輸入完指令,它會問你 URI 及 project 目錄,URI可以不用更改,目錄的話則看你要把 project 的檔案放在哪裡就輸入路徑吧。

    2. 等到 check out 作完後,如果你要新增檔案進 project 中(比方說 bar.c),則可以使用

      svk add foo/bar.c

      從 project 中移除檔案的話,則是用

      svk rm foo/bar.c

    3. 當你要對 project 作修改時,最好先檢查一下 repository 上是不是有新的版本,所以要作 update 的動作,而 svk 的用法是

      svk update foo/

      它就會將你的 project 相關檔案更新至 repository 上最新版本。

    4. 如果修改完某個檔案,要作 commit 動作時,則用

      svk ci foo/

      來 commit 你修改的結果到 repository 上。

  • 後記
      這只是一份簡單的 tutorial,如果你想對 subversion 有更進一步的了解及研究的話,可以參考它的文件,這裡提供一個中文翻譯的連結

星期五, 5月 13, 2005

在 Mac OS X 使用 TeX

目前要在 Mac OS X 下使用 TeX 相當方便,通常是建議使用 i-Installer 來安裝,詳細過程請見這裡

安裝好之後,英文的 LaTeX 環境就完成了,可是如果要使用中文的話,那麼還得另外安裝其他的東西。

目前要讓 LaTeX 可以處理中文的解決方案有兩種,一種是使用 XeTeX,另一種是安裝 CJK 和 ucs 套件。使用 XeTeX 的好處是,它是以 Unicode 來處理的,所以只要稍微設定一下,就可以像使用英文般地寫作,不用去考慮其他的問題。但是 XeTeX 的文件就只能給 xetex 和 xelatex 來編譯,我不知道目前有多少平台可以執行 XeTeX,看起來似乎只有 Mac OS X 10.2 以上才有辦法。而 CJK 應該是可以在大部份的平台上執行,但是它在處理中文上比較麻煩,稍後在使用 CJK 的部份我會再說明。

XeTeX 也可以利用 i-Installer 來安裝,只要在 i-Directories 的部份選擇 Jonathan Kew's i-Directory @ SIL,就可以看見 XeTeX 了。
裝好之後,抓這個檔案下來,解壓縮之後,把 fontspec 這個目錄放到 ~/Library/texmf/xetex/ 下,這樣就可以指定字型了。首先要使用前先 \usepackage{fontspec},再呼叫 \setromanfont{Apple LiSung Light},就會設定 Apple LiSung Light 為文件字型。另外還要設定中文的斷行:\XeTeXlinebreaklocale "zh",否則斷行會不正常。

至此,XeTeX 的設定就完成了,如果要搭配 TeXShop 之類的編輯軟體,在 XeTeX 的網頁有設定的說明。

XeTeX 和 CJK 是可以並存的,安裝 CJK 可以參考這個網頁的說明,但是要注意的是,在 b 的 iii 這步,原本它是說把 *.enc 放到 /usr/local/teTeX/share/texmf.local/pdftex/enc/,如果遇到找不到字型的問題,請把 *.enc 放到 /usr/local/teTeX/share/texmf.local/fonts/enc/pdftex 裡。

在 LaTeX with CJK 中使用中文還得去定義一個 macro,再把中文包起來。

像是這樣
\newcommand{\cjk}[1]{\begin{CJK}{UTF8}{cyberbit}#1\end{CJK}}
然後再用
\cjk{這是中文}

只要抓這個檔,並放到 /usr/local/teTeX/share/texmf.local/tex/latex/ucs
這樣就可以把中文當英文一樣直接使用了,但是斷行會發生問題,我還不知道如何解決。

CJK 還有個問題,就是 section, chapter 這些會放到目錄裡的字不能使用中文,在李果正的網頁提到了一個過渡性的解法

參考資料裡的網頁分別有 XeTeX 和 LaTeX with CJK 的中文使用範例。

參考資料:
http://www.oikos.com.tw/v4/viewtopic.php?pid=21803
http://www.ece.uci.edu/~chou/unicode-tex.html

星期一, 4月 18, 2005

PuTTY on MacOSX!

之前下載 PuTTY 的原始碼回來稍微看過一下,發現它有 port 到 Mac 上的版本。但是 0.57 版之前都只有使用 Carbon API 來實作,因為 PuTTY 主要的核心都是用 C 寫的,所以用 Carbon API 是十分合理的。

但 最近發現 PuTTY 更新到 0.58 ,我又看了看它的 source code,居然發現多了一個資料夾 macosx,然後發現裡面都是 *.m,原來這一版已經有用 cocoa 作一些 entry(wrapper) 及 GUI 的部分,而且只要簡單的 make 一下就有 PuTTY.app 可以用了(大心)。

不過還是有點缺點,就是不能換字型,用起來還是有點不順手。不過它讓我知道原來用 obj-C 寫的 code 也能與 C 寫的共用(因為主要的 kernel 還是用 C 寫的)。來研究一下好了~


PuTTY設定畫面

PuTTY使用畫面

星期四, 3月 17, 2005

簽署/加密信件

緣由


通常在使用 E-Mail 的時候,有兩件事我們會有安全上的考量:

  1. 讓收件的人確定是我本人寄出的郵件。

  2. 別人寄給我的信可以用「我的方式」加密,而且只有我能解密。


底下我將會使用 Thunderbird 這套 mail client 來當例子,來介紹如何 簽署/加密 信件。

首先對於我要介紹的加密系統作點簡單的解釋。我們要採用的加解密模式是使用 key-pair policy,也就是我會有兩把 keys,其一為 public key,另一把為 private key。public key 是要公告給大家知道的,而 private key 必須將它保護起來。你的加密程式會把你要加密的東西和指定的 key 做一些運算後,產生新的輸出,這個輸出可能是加密或簽署過的文件。

當我們要簽署文件時,我們是使用 private key 來做簽署,這樣擁有你 public key 的人就可以使用它來驗證這份簽署的有效性,因為只有你自己擁有這把 private key,如此才能保證簽署的人就是你自己。而如果別人寄給你的信想加密的話,他可以用你的 public key 加密後再寄出,然後你就能用自己的 private key 解開這份加密後的文件。要注意的是,這些情況要成立,public key 跟 private key 比需是相互對應的。

所以,我們現在需要一個加密程式,然後再產生自己專屬的 key-pait 。

GnuPG


我們將會用 OpenPGP 這個加密系統來做加密,我選擇使用 Gnu 的實作版本--GnuPG來當我的加密程式。你可以下載別人作好的 binary 程式回來使用,不過我這裡會介紹抓原始檔回來編譯的方法(如果你不熟悉終端機的操作,就下載 binary 回來用吧)。

到 http://www.gnupg.org/download/index.html 下載最新的 source 回來,然後做下列指令:
# tar zxvf gnupg-<version>.tar.gz
# cd gnupg-<version>
# ./configure
# make
# sudo make install clean

這樣應該就可以順利把 gnupg 裝好了。

產生 Key-pair


在終端機下執行 gpg --gen-key ,然後它會問你以下問題:

請選擇妳要使用的金鑰種類:
(1) DSA 和 Elgamal (預設)
(2) DSA (僅能簽署用)
(5) RSA (僅能簽署用)
妳要選哪一個? 1

因為我們要產生 key-pair,所以我們選擇 1


DSA 金鑰對會有 1024 位元長.
ELG-E 金鑰的長度可能介於 1024 位元和 4096 位元之間.
妳想要用多大的金鑰尺寸? (2048) 4096

這裡我們就產生所支援的最長位元,位元愈大雖然資料量變大,但是也更加安全。

請指定這把金鑰的有效期限是多久.
0 = 金鑰不會過期
= 金鑰在 n 天後會過期
w = 金鑰在 n 週後會過期
m = 金鑰在 n 月後會過期
y = 金鑰在 n 年後會過期
金鑰的有效期限是多久? (0)

這裡是詢問你 key-pair 的使用期限,如果你要一直使用同一套 key-pair 的話就選 0

確定了之後,它會要你輸入真實姓名及 E-Mail 帳號:

妳需要一個使用者 ID 來辨識妳的金鑰; 這個軟體會用真實姓名,
註釋和電子郵件地址組合成使用者 ID 如下: "Ke-Huan Lin (Jedi) "

真實姓名: abcde
電子郵件地址: abcde@fg.hi
註釋:
妳選擇了這個使用者 ID:
"abcde "

變更姓名(N), 註釋(C), 電子郵件地址(E)或確定(O)/退出(Q)? o

然後按下 o ,它會要求你輸入一個密碼保護你的 private key:

妳需要一個密語來保護妳的私鑰.

請輸入密語:

接著它就會開始製作金鑰。(4096 bits 可能會有點久)完成時會顯示:

gpg: 金鑰 9FB16F65 已被標記成徹底信任了
公鑰和私鑰已經被建立及簽署了.

gpg: 正在檢查信任資料庫
gpg: 3 個勉強信任以及 1 個完全信任是 PGP 信任模型的最小需求
gpg: 深度: 0 有效: 1 已簽署: 0 信任: 0-, 0q, 0n, 0m, 0f, 1u
pub 1024D/9FB16F65 2005-03-17
金鑰指紋 = 5B0A 562A DB9A C9F6 58E7 954C 0919 B9D5 9FB1 6F65
uid abcde
sub 4096g/23D35AD9 2005-03-17


使用 Thunderbird 來作簽署或加密


首先,我們必須為 Thunderbird 安裝 Enigmail 這個 extension,這樣它才能支援 OpenPGP 的加密系統。

裝好之後我們就要設定一下 Enigmail, 到選單列的 Enigmail -> Preferences 來設定,這裡我們只需要將
GnuPG executable path 設定成 /usr/local/bin/gpg 就可以了。

當我們開始寫信時,會有個 OpenPGP 的選項,如果你是第一次使用,它會要求你選擇 key-pair,如果上述的步驟你都沒有問題的話,你就可以找到你剛產生的 key-pair 而選擇它。我們可以選擇我們要 Sign(簽署)或是 Encrypt(加密)這封信件,如果我們要簽署信件時,選擇 Sign message 就可以了,然後當你信件打完之後,它會要求你輸入 private key 的密碼(別忘了你是用 private key 加密),如此便會寄出簽署過的文件。(你可以把 Enigmail 的 Auto decrypt and verify 的選項關掉,看看寄出什麼樣的東西)

至於加密文件,如果你沒有別人的 public key,你用自己的 public key 加密是沒有意義的(因為這樣只有你自己能解密),如果要匯入別人的 public key,通常大家會以一個純文字檔的方式釋出,當你拿到這個檔案時,就可以到終端機下輸入

# gpg --import < 檔案名

這樣就可以匯入別人的 public key,你也就可以使用它來加密。如果你要輸出你的 public key ,就使用下列指令:

# gpg -a --export > 檔案名

然後你就可以散佈這個檔案,讓別人能用你的 public key 來加密信件寄給你。注意:只有簽署的信件是沒有加密的,所以只會在本文下方加上數位簽章(只能由你的 public key 來驗證);而加密的文件則是一堆亂碼,必須要用 private key 才能解開。

對應 Sign(簽署)的動作叫作 Verify(驗證),而對應 Encrypt(加密)的動作叫作 Decrypt(解密)。

基本的簽署/加密方式就介紹到這裡,剩下的就讓大家自己去試囉。

星期三, 3月 02, 2005

FreeBSD 5 日誌 (2)

以下公開幾個我的設定檔及常用的軟體:
  1. ~/.xinitrc (使用 wrapper 進 X 時的script)
    #!/bin/sh
    scim -d
    gnome-session


  2. ~/.vimrc (用 vim 時的設定)
    set termencoding=utf-8
    set encoding=utf-8
    set fileencodings=big5,utf-8,gbk,euc-jp,euc-kr,utf-bom,iso8859-1
    autocmd BufNewFile,BufRead w3mtmp* set fileencoding=utf-8

    syn on
    set showcmd
    set ruler
    set history=50


  3. ~/.cshrc (用 /bin/tcsh 的環境設定)
    set prompt = '%n@%m %~%# '
    set dspmbyte = utf8
    alias ls 'ls -wG'
    alias irssi 'irssi -c irc.seed.net.tw -n ericsk'
    alias telnet 'telnet -8'

    setenv LANG zh_TW.UTF-8
    setenv LC_CTYPE zh_TW.UTF-8
    setenv XMODIFIERS "@im=SCIM"
    setenv GTK_IM_MODULE xim


  4. office 軟體:我目前是用 /usr/ports/editors/gnome2-office
    word processing 就是 AbiWord
    data sheet 就是 Gnumeric
    看 pdf 的話,其實 /usr/ports/graphics/gpdf 還不錯用

  5. terminal 我是用 gnome-terminal, 支援分頁也支援 M7N

  6. web/mail 當然就是 /usr/ports/www/firefox 跟 /usr/ports/mail/thunderbird 啦

  7. 看電影, avi格式等等就用 /usr/ports/multimedia/vlc
    rmvb 就用 /usr/ports/multimedia/linux-realplay

  8. 聽音樂, /usr/ports/multimedia/beep-media-player
    是以 xmms 為 base, 但我覺得比 xmms 還好用

  9. 純文字編輯, gedit 就夠強了,也支援一些語言語法高亮度顯示。

  10. Messenger就用 /usr/ports/net/gaim 囉~

星期二, 2月 15, 2005

FreeBSD 5 日誌 (1)

  1. 設定 .cshrc (因為我 shell 是用 tcsh)
    set prompt = '%n@%m%# '
    set dspmbyte = utf8
    alias ls 'ls -wG'
    alias telnet 'telnet -8'
    alias irssi 'irssi -c irc.tw.freebsd.org -n ericsk'
    setenv LANG zh_TW.UTF-8
    setenv LC_ALL zh_TW.UTF-8
    setenv LC_CTYPE zh_TW.UTF-8

  2. 裝 /usr/ports/misc/screen。然後用
    http://www.csie.ntu.edu.tw/~r92030/project/big5/18
    覆蓋掉 /usr/local/share/screen/utf8encodings/18

    複 製一份 /usr/local/etc/screenrc 到 ~/.screenrc ,然後加入 defencoding utf8。如果開一個 screen 要連 big5 的BBS的話, <Ctrl+A>:encoding big5

    使用 putty 遠端登入時, 別忘了把 Window -> Translation 裡的 character set 改為 UTF-8

  3. 準備裝 X, 我選擇用 X.org 的, 所以安裝 /usr/ports/x11/xorg 。
    很歡樂地 sudo make install clean
    然後用 xorgcfg 產生出一個 xorg.conf.new 檔,依照自己的需求修改一下,我會在 Mouse 的地方加上
    Option "ZAxisMapping" "4 5"
    支援滾輪

    在 Screen 的地方加上
    DefaultDepth 24
    SubSection "Display"
    Viewport 0 0
    Depth 24
    Modes "1280x1024" "1024x768"
    EndSubSection

    完成後把它複製一份到 /etc/X11/xorg.conf

  4. Desktop Environment 我是選用 gnome2, 但我不想裝太多雜七雜八的軟體,所以我裝
    /usr/ports/x11/gnome2-lite
    /usr/ports/www/firefox (瀏覽器)
    /usr/ports/mail/thunderbird (收發郵件,讀news,讀RSS等)
    /usr/ports/net/gaim (MSN, Yahoo...etc)

    其實 /usr/ports/x11-wm/xfce4 輕便又美觀,我也蠻推荐的,只是新版 (4.2.0) 好像有怪怪的輸入法模組,大概是我不會設定吧...Orz

  5. 字 型的話我是裝 unicode 的 mingliu: /usr/ports/chinese/mingunittf/ 。我自己又從M$拿了 kaiu.ttf 及 arialuni.ttf 放在 ~/.fonts/ 下,然後記得到 /etc/X11/xorg.conf 裡加入 FontPath:

    FontPath "/usr/X11R6/lib/X11/fonts/TrueType/"

    新字型可以加到 ~/.fonts/ 下面,裝完記得 sudo fc-cache -f -v ,重新再啟動 X 就會有新字型了。(前面在make xorg時有 WITH_CJK=1 的話,中文字型名稱就不會爛掉了)

  6. 用 kcwu大大 patch 過的 xcin 以支援 utf8
    把 http://www.csie.ntu.edu.tw/~r92030/tmp/libtabe-0.2.6.tar.gz
    http://www.csie.ntu.edu.tw/~r92030/tmp/xcin-2.5.3.pre3.tar.gz
    放到 /usr/ports/distfiles 下,然後到 /usr/ports/chinese 下抓
    http://www.csie.ntu.edu.tw/~r92030/tmp/xcin+libtabe-draft.shar
    執行 sh xcin+libtabe-draft.shar 以產生新的 xcin 及 libtabe entries

    到 /usr/ports/chinese/libtabe.new 下 make makesum ; make install clean,然後再在 /usr/ports/chinese/xcin25.new 下 make makesum ; make install clean 。裝完之後就可以用 utf-8 的 xcin。別忘了改一下 ~/.cshrc ,加入 setenv XMODIFIERS "@im=xcin" (當然 $LANG 已經設成 zh_TW.UTF-8 了)

  7. 開始使用 x+gnome2
    在 $HOME 裡加入一個 .xinitrc 檔,裡面的內容就

    #!/bin/sh
    exec xcin &
    exec gnome-session

    然後打 startx 就可以了。

FreeBSD 5 日誌 (0)

  1. 下載 5.3-R 的 iso 檔回來作成開機光碟,然後安裝(除了自己 /home 割出想要的大小外,其它都auto partition)

  2. 設定時區,root密碼,使用者,安裝cvsup-without-gui,然後重開機

  3. 把 /usr/share/examples/etc/make.conf 複製一份到 /etc 下,然後改一下 CPUTYPE, CFLAGS, SUPFILE 等等變數設定,我在裡面加上了 WITH_CJK=1, 及 KERNCONF=ERICSK 方便make

  4. 到 /usr/src 下先 make update 更新 source, 然後是下列步驟
    • make buildworld
    • 到 /usr/src/sys/i386/conf 下把 GENERIC 複製一份到 ERICSK然後按照機器狀況設定音效卡要 device sound, USB隨身碟會用到 device da 所以 scbus 要開
    • make buildkernel
    • make installkernel
    • 重開機,進入 single user mode
    • mount -a
    • mergemaster -p
    • 到/usr/src下 make installworld
    • mergemaster
    • 重開機搞定

  5. 要開啟 sshd, 到 /etc/rc.conf 下加入一行 sshd_enable="YES"

  6. 更改 ports 找檔案的地方,在 /etc/make.conf 下加入
    MASTER_SITE_OVERRIDE= \
    ftp://freebsd.nctu.edu.tw/pub/FreeBSD/distfiles/${DIST_FILES}/

  7. 裝 /usr/ports/security/sudo 這樣以後少用 root 登入。設定檔預設會放在 /usr/local/etc/sudoers

  8. 裝 /usr/ports/editors/vim-lite 有好用的 vim 然後設一下 .vimrc

  9. 要掛上音效模組
    #kldload snd_driver
    在/boot/loader.conf內加入 snd_driver_load="YES"
    要增加音效模組的 virtual channels (就是同時可以很多程式放聲音)
    # sysctl hw.snd.pcm0.vchans=4
    # sysctl hw.snd.maxautovchans=4