2009/05/15

String::CRC::Cksum module for 64-bit Perl

When I used the following command to install String::CRC::Cksum on my 64-bit Ubuntu,
perl -MCPAN -e "install String::CRC::Cksum"
the following error message is shown and perl rejected to install it:
Use of uninitialized value in bitwise xor (^) at at /usr/local/share/perl/5.10.0/String/CRC/Cksum.pm line 73.
I managed to google the solution but in vain. Finally, I realized the problem is caused by 64-bit integer on my 64-bit Ubuntu.

To fix this problem, force to install String::CRC::Cksum module first:
$ sudo cpan
Terminal does not support AddHistory.

cpan shell -- CPAN exploration and modules installation (v1.9205)
ReadLine support available (maybe install Bundle::CPAN or Bundle::CPANxxl?)

cpan[1]> force install String::CRC::Cksum
and then patch it (/usr/local/share/perl/5.10.0/String/CRC/Cksum.pm, "chmod" first! it's read-only):
--- Cksum.pm    2009-05-15 00:33:20.000000000 +0800
+++ Cksum.pm 2009-05-15 00:25:36.000000000 +0800
@@ -70,7 +70,7 @@

for(my $i = 0; $i < $n; ++$i) {
my $c = unpack 'C', substr $_[0], $i, 1;
- $cksum = ($cksum << 8) ^ $crctab[($cksum >> 24) ^ $c];
+ $cksum = ($cksum << 8) ^ $crctab[(($cksum >> 24)&255) ^ $c];
++$size;
}

@@ -111,7 +111,7 @@
while($size != 0) {
my $c = $size & 0377;
$size >>= 8;
- $cksum = ($cksum << 8) ^ $crctab[($cksum >> 24) ^ $c];
+ $cksum = ($cksum << 8) ^ $crctab[(($cksum >> 24)&255) ^ $c];
}
$cksum = ~ $cksum;

2009/05/10

將 Ubuntu 從 8.04 升級到 9.04

Ubuntu 9.04 已經出來一陣子了,口碑還不錯。而 Ubuntu 8.04 是 LTS 版 (Long Term Support),所以不能直接升級到 9.04,必須用以下方法來升級。

首先要修改一項和更新有關的設定 (系統->管理->軟體來源->更新):將 顯示新的發行版本發布長期支援的發布 改為 正常發布




接下來,執行更新管理員 (系統->管理->更新管理員),應該會看到 有新的發行版,只要按 升級 就可以將 8.04 升級到 8.10:



升級過程約需要三十至六十分鐘。等升級完畢,再執行一次更新管理員,從 8.10 再升級到 9.04 即可。

PS: 升級完畢,可用以下指令刪除一些不必要的 package,節省空間:
sudo apt-get clean

2009/04/27

辨認 GNU/Linux 的發行版本 (distro)

網路上有多少 GNU/Linux 的發行版本 (distro)?看看這張令人眼花撩亂的 族譜 吧,我相信沒有幾個人有興致去數清楚的。但弄清楚你正在使用的 GNU/Linux 是哪一個版本可能是相當重要的課題 (透過 ssh 去登入主機的使用者,不見得知道該主機作業系統的詳細資料)。

由於 GNU/Linux 的發行版本很多,多數又有繼承演化的關係,要辨認出每個版本不是一件容易的事。以下是一些簡單的辨別方法,越前面的越精確,但不見得都適用,若該方法行不通,請退而求其次,試試下一個方法。

執行 lsb_release -a


這是最精確的方法,以下是一些輸出範例:

No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 8.10
Release: 8.10
Codename: intrepid
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 4.0 (etch)
Release: 4.0
Codename: etch
LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarch
Distributor ID: CentOS
Description: CentOS release 5.2 (Final)
Release: 5.2
Codename: Final
執行 ls /etc/*release 再執行 cat /etc/*release

有許多發行版本的資訊都寫在 /etc/*release 的檔案之中,例如:
  • /etc/lsb-release (Ubuntu)
  • /etc/SuSE-release (SuSE)
  • /etc/redhat-release (RedHat, CentOS)
  • /etc/mandrake-release (Mandrake)
  • /etc/distro-release (AsteriskNOW)
執行 ls /etc/*version 再執行 cat /etc/*version

有另一些發行版本的資訊是寫在 /etc/*version 的檔案之中,例如:
  • /etc/debian_version (Debian, Ubuntu)
  • /etc/slackware-version (Slackware)
執行 cat /etc/issue

嚴格說來,這不是正確的方法,因為此檔案是用來儲存一些要秀給使用者登入時看的訊息。但很多 distro 都會在這個檔案寫上自己的發行名稱,所以也是不錯的參考資料。例如:
  • Ubuntu 8.10 \n \l
  • Ubuntu 8.04.2 \n \l
  • Debian GNU/Linux 4.0 \n \l
  • CentOS release 5.2 (Final) Kernel \r on an \m
執行 cat /proc/version

此方法的訊息更不明確,但也不失為一個判斷的依據。例如:
  • Ubuntu 8.10 => Linux version 2.6.27-11-generic (buildd@yellow) (gcc version 4.3.2 (Ubuntu 4.3.2-1ubuntu11) ) #1 SMP Wed Apr 1 20:53:41 UTC 2009
  • Ubuntu 8.04.2 => Linux version 2.6.24-23-server (buildd@vernadsky) (gcc version 4.2.3 (Ubuntu 4.2.3-2ubuntu7)) #1 SMP Mon Jan 26 00:55:21 UTC 2009
  • Debian 4.0 => Linux version 2.6.22-3-vserver-amd64 (Debian 2.6.22-6) (maks@debian.org) (gcc version 4.1.3 20071019 (prerelease) (Debian 4.1.2-17)) #1 SMP Sun Nov 4 18:41:00 UTC 2007
  • CentOS 5.2 => Linux version 2.6.18-92.el5 (mockbuild@builder16.centos.org) (gcc version 4.1.2 20071124 (Red Hat 4.1.2-42)) #1 SMP Tue Jun 10 18:49:47 EDT 2008

2009/04/17

我的 Firefox 擴充套件點點名

將個人喜好的 Firefox 擴充套件記錄如下,也推薦給大家:
  • Favicon Picker 3 讓你自訂 bookmark 的圖示。
  • Firebug 超強網頁除錯工具,內行人應該都知道。
  • User Agent Switcher 改變 Firefox 送出的 User-Agent 字串,內行人應該都知道。
  • Flashblock 擋下不必要的 flash 花招,並在該處留白,想看時再自己點選。
  • Google Bookarks Button Reloaded 將自己的 bookmark 放在 Google 上。
  • Hide Menubar 將很少用到的 Firefox 選單列隱藏起來,需要時按 ALT 即可顯現出來。
  • Mozilla Archive FormatUnMHT 收到惱人的 .mht 檔案嗎?用這個可以開啟喔! (進一步介紹)。
  • PDFescape 讓你線上「編輯」 PDF 文件 (進一步介紹)。
  • Tab Mix Plus 強化 Firefox 的分頁瀏覽功能。
  • Wired-Marker 閱讀網頁的最佳夥伴 (進一步介紹)。

2009/04/10

我的 Ubuntu 軟體點點名

用 Ubuntu 越久,就越覺得方便。需要甚麼功能的軟體,絕大部分用 Synaptic 就可以下載安裝。將好用的軟體記錄如下,也推薦給大家 (不含 Ubuntu 固定會安裝的)。
  • KchmViewer 電子書 .chm 檔案的檢視器。套件:kchmviewer (曾試過 GnoCHM 和 ChmSee,這兩者的搜尋功能都不好用)
  • hexedit 非文字檔的編輯工具。套件:hexedit
  • unrar 解壓縮程式,可與 file-roller 整合。網路上有那麼多免費、公開的壓縮軟體,搞不懂為什麼那麼多人喜歡將檔案壓成 .rar。套件:unrar
  • minicom 終端機模擬軟體 (terminal emulator),透過 RS232 連到某些設備的 console。套件:minicom (進一步介紹)
  • Wire Shark 封包抓取和分析軟體。套件:wireshark (進一步介紹)
  • Virtual Box 虛擬機器。套件:virtualbox-ose,但我推薦 官方網站 的版本,不管用哪一套都需安裝 scim-bridge-client-qt (進一步介紹)
  • Sox 聲音檔轉換工具 (命令列模式)。套件:sox、libsox-fmt-all
  • VLC media player 影音播放軟體。套件:vlc
  • Wave Surfer 聲音檔處理、分析工具,可檢視聲音波形、區間播放等。套件:wavesurfer

2009/03/10

Subversion, Grep, Diff

我很習慣用 grep 來找 source code 當中的字串;也很習慣用 diff 來比較兩個 source tree 的差異。如:
grep -r STRING *
diff -ur DIR1 DIR2
這兩個指令很好用。但是遇到 Subversion 的 working copy 時,就會受到 .svn 目錄的干擾。所幸這兩個指令都提供排除非必要目錄的方法:
grep --exclude-dir=.svn -r STRING *
diff -x .svn -ur DIR1 DIR2

老實說,常會忘記這些參數,也常弄混。因此建議在 .bashrc 當中加上以下設定,這樣以後不管是不是 working copy 都可以安心使用 grep -r 和 diff -r 了:
alias grep='grep --exclude-dir=.svn'
alias diff='diff -x .svn'

2009/02/02

在 64-bit Ubuntu 上安裝 32-bit 的 package

使用 64-bit Ubuntu 時,經常會遇到一個問題:某些外部 package 只提供 32-bit 的版本 (i386),而沒有 64-bit 的版本 (amd64),例如:Adobe Reader 和 Skype 等。

解決方法很簡單,加上 --force-architecture 參數即可:
  • sudo dpkg -i --force-architecture AdobeReader_cht-8.1.3-1.i386.deb
  • sudo dpkg -i --force-architecture skype-debian_2.0.0.72-1_i386.deb