2008年9月14日星期日

Ubuntu 7.10 本地檔案庫

我有一台很舊的電腦正在用 Ubuntu 7.10. 最近我想為該電腦內 Ubuntu 系統升級, 於是做了一隻 AptOnCD. 誰知道 Package Manager 讀不到該 DVD. 最後只有將所有 deb 檔案複製到 Harddisk 內, 然後再做一個檔案庫:

1. 因為沒有安裝 Apache WWW server, 我便需要先安裝它
2. 在 /var/www 資料夾內建立一個 ubuntu 資料夾 (其實可以使用其他名稱)
3. 在 ubuntu 資料夾內建立一個 local 資料夾 (其實一樣可以使用其他名稱)
4. 將所有 deb 檔案複製到 local 資料夾內
5. 在 /var/www/ubuntu 資料夾內輸入: apt-ftparchive packages local > local/Packages [enter]
6. 完成再輸入 gzip local/Packages [enter]
7. 然後將 deb http://localhost/ubuntu local/ 加到 /etc/apt/sources.lst 內 (也可以用 Software sources 加入)
8. 在 Package Manager 內按 Reload 來更新檔案資料

但是在過程中我發現當檔案名稱有 %3a 字串時便會出現問題 (404 File not found). 後來在網上找到解決辦法: 先用 dpkg-name 為所有檔案名稱有 %3a 字串的檔案改名:
dpkg-name *%3a* [enter]
然後才執行 apt-ftparchive.

P.S.
1. 其實 %3a 就是 ":", 不過我們都知道檔案名稱不可以有 ":", 所以才用 %3a 代替.
2. 在 /var/www 資料夾內, 我們需要用 sudo 指令

2008年9月13日星期六

在 Ubuntu 7.10使用中國移動 GPRS 服務上互聯網

由於我想在 Ubuntu 7.10使用中國移動 GPRS 服務上互聯網, 因此在網上看了不少文章. 經過幾晚的嘗試後, 終於找到一個比較容易使用的方法. 因此寫下這文章作為記錄參考之用.

2008年7月6日星期日

wxWidgets: 用來找尋 tree Index (在同一個 level 下)

/**
* Find the tree item index in the same depth
*
* @param pTree tree pinter
* @param rootid parent tree item id
* @param itemid tree item id
*
* @return return item index if success otherwise return -1
*/
int find_treeItem_index(wxTreeCtrl *pTree, wxTreeItemId rootid, wxTreeItemId itemid)
{
wxTreeItemIdValue cookie;
wxTreeItemId id;
int cnt=-1;

// for the first child
id = pTree->GetFirstChild(rootid, cookie);

if(!id.IsOk()) {
return -1;
} else {
cnt++;
}

while(id != itemid) {
id = pTree->GetNextChild(rootid, cookie);

if(!id.IsOk()) {
break;
}

cnt++;
}

if(!id.IsOk()) {
cnt = -1;
}

return cnt;
}

2008年5月1日星期四

在 PHP Extension 中加入 static 和 dynamic library

如果我們要在 PHP Extension 中使用 dynamic library (.so 檔案) 或 static library (.a 檔案), 我們需要修改 config.m4 使 automake 和 autoconfig 會將我們的設定加到 makefile 內:

1. 打開 config.m4, 我們可以看到一行類似以下的文字
PHP_SUBST(XXXX_SHARED_LIBADD), 其中 XXXX 為 PHP Extension 的名稱 (全大寫)

2. 我們在這行之前加入:
PHP_ADD_LIBRARY_WITH_PATH([library name], [library path], XXXX_SHARED_LIBADD)

例如我們想加入 libabc.so, 而該檔案在 /usr/lib, 則我們會加入:
PHP_ADD_LIBRARY_WITH_PATH(abc, /usr/lib, XXXX_SHARED_LIBADD)

2008年4月27日星期日

當 PHP Module 是由多個 C 檔案來組成的時候

如果 PHP Module 是由多個 C 檔案來組成, 我們便需要修改 config.m4 內的 PHP_NEW_EXTENSION 的內容. 例如 hello_world 是由 1.c 和 2.c 組成, 則:

PHP_NEW_EXTENSION (hello_world, 1.c 2.c, $ext_shared)

或

my_source="1.c 2.c"
PHP_NEW_EXTENSION (hello_world, $my_source, $ext_shared)

注意的是在等號兩邊是沒有空格的.

Ububtu 開放 root 帳號

Ubuntu Linux 預設是不開放 root 帳號的, 所以我們需要經常使用 sudo 指令. 如果我們需要開放 root 帳號, 我們可以在 Users settings 選擇 root 帳號:

然後在 Properties 內設定密碼:

再在 Login Window Preferences 的 Security 頁內選擇 Allow local system administrator login:


這樣我們便可以用 root 帳號來登入了.

2008年4月24日星期四

在 Ubuntu 7.10 開發 PHP5 Module (模組)

由於工作關係, 我需要開發一個 PHP5 Module. 我看過網上的文章和 PHP 手冊, 發覺大部份例子都是使用 ext_skel 來建立PHP Module project. 但是 ext_skel 只在 PHP5 源碼找到. 如果沒有下載和由 PHP5 源碼來建立 PHP5 系統的話, 在 Ubuntu 是找不到 ext_skel 的. 原來之前 Ubuntu 已經將 ext_skel 移除了, 現在它改為建議用 pecl-gen 來代替 ext_skel.

要使用 pecl-gen, 首先我們需要安裝 pear 和有關的 package:

php5-cli
php5-dev
php-pear

如果電腦可以上網, 我們可以使用 pear 來安裝 pecl-gen:

sudo pear install CodeGen_PECL

如果電腦不可以上網, 我們可以先找一台能夠上網的電腦到 pear 的網站下載以下檔案:

CodeGen package
CodeGen_PECL package

然後將檔案複製到不能上網的電腦上.

假設 CodeGen 和 CodeGen_PECL 的檔案為

CodeGen-1.0.5.tgz
CodeGen_PECL-1.1.2.tgz

我們可以用以下方法安裝:

sudo pear install CodeGen-1.0.5.tgz
sudo pear install CodeGen_PECL-1.1.2.tgz

安裝完成後, 我們可以輸入 pecl-gen 來檢正是否安裝成功.

要建立 PHP Module project, 我們可以跟 ext_skel 一樣:

pecl-gen --extname=[your module name]

例如 module name 是 hello_world, 則輸入:

pecl-gen --extname=hello_world

而該 module 的檔案會在 [your module name] 目錄內.

要 make PHP module, 我們可以輸入:

phpize
./configure
make
make test

安裝 module 則可以輸入:

sudo make install

然後建立一個 ini 檔案:

touch [your module name].ini

在 ini 檔案內加入:

extension=[your module name].so

之後複製 ini 檔案到 /etc/php5/cli/conf.d 目錄內:

sudo cp [your module name].ini /etc/php5/cli/conf.d

然後 restart WWW server 就可以開始使用 Module 了:

sudo /etc/init.d/apache2 restart

當然, 我們可以用 phpinfo() 來檢查 module 是否已經載入