2011/08/15

套件管理 比較 package management

有一份文件叫『套件管理工具比較』,閱讀原文件比較易讀,作為備份,我轉載如下,以後有空也許也會分享心得:

比較一下現在市面上幾種套件管理工具
(debian - apt , gentoo - emerge , freebsd - prots)

其它參考: APT 用法、emerge 用法

深入內容中有 emerge, apt, ports 的語法比較(也可以說是語法教學吧)


以下轉載自: Gentoo/Debian/FreeBSD套件管理memo

以關鍵字搜尋軟體
Gentoo: emerge -s
輸出會有這個 pkg 的簡介 , 關鍵字都可以用正規表示式
Debian: apt-cache search
FreeBSD: make search name= 或 ports_glob -- need portupgrade

安裝軟體
Gentoo: emerge
Debian: apt-get install
FreeBSD: portinstall

移除軟體
Gentoo: emerge --unmerge 或 emerge -C
Debian: apt-get remove
FreeBSD: pkg_deinstall

升級單一軟體
Gentoo: emerge -u
Debian: apt-get install
FreeBSD: portupgrade

察看升級全系統會動到哪些套件:
Gentoo: emerge -puDv world
Debian: apt-get -u dist-upgrade
FreeBSD: portupgrade -arnv

升級全系統
Gentoo: emerge -u --deep world
Debian: apt-get dist-upgrade
FreeBSD: make world ; portupgrade -ar

查詢系統裝了哪些軟體
Gentoo: emerge -pe world 或 qpkg -I -v
Debian: dpkg --get-selections
FreeBSD: pkg_info

查詢某檔案屬於哪個軟體
Gentoo: qpkg -f
(need gentoolkit)
Debian: dpkg -S
FreeBSD: pkg_info -W

查詢某個套件安裝了什麼檔案
Gentoo: qpkg -l
Debian: dpkg -L
FreeBSD: pkg_info -L

查詢有沒有裝這個關鍵字的套件
Gentoo: qpkg -I | grep (qpkg再加上 -v 看版本號碼)
Debian: dpkg -qa | grep
FreeBSD: pkg_info | grep

找哪些 pkg "簡介" 裡含有你要找的關鍵字:
Gentoo: emerge -S <關鍵字>
輸出方式和前者一樣, 關鍵字都可以用正規表示式
Debian: apt-cache search
FreeBSD: make search key=

不管相依性強制移除某套件
Gentoo: emerge -C
Debian:
FreeBSD: pkg_delete -f

全系統重新編譯
Gentoo: emerge -e world
Debian: ?
FreeBSD: make world ; portupgrade -arf

========
補充:
qpkg -f
ps: emerge gentoolkit first.

--
gentoo 裡:
查詢某個套件安裝了什麼檔案:
qpkg -l
查詢有沒有裝這個關鍵字的套件:
qpkg -I (再加上 -v 看版本號碼)
不管相依性強制移除某套件:
emerge -C

--
仔細看一下 man emerge
要找一個 pkg 的 "名稱":
emerge -s <關鍵字>
輸出會有這個 pkg 的簡介

找哪些 pkg "簡介" 裡含有你要找的關鍵字:
emerge -S <關鍵字>
輸出方式和前者一樣

更厲害的是上面的關鍵字都可以用正規表示式!!

--
emerge -f (fetchonly)
好處在於當你emerge 兩個package以上的時候,可以先把source給抓回來,不過需要再emerge

emerge -p (pretend)
看要裝些什麼東西,

小弟認為這兩個指令對撥接使用者很重要,尤其 -f .一來可以大略知道下載時間,二來可以隨時中斷,然後在續傳(感謝偉大的wget)
--
升級單一軟體
Gentoo: emerge -u
Debian: apt-get install
FreeBSD: portupgrade

查詢某個套件安裝了什麼檔案
Gentoo: qpkg -l
credit to paar@gentoo.org.tw
Debian: dpkg -L
FreeBSD: pkg_info -L

全系統重新編譯
Gentoo: emerge -e world
Debian: apt-get update;apt-get upgrade
FreeBSD: make world ; portupgrade -arf

2011/08/11

Google Nexus S

先前把我的手機換成 Nexus S,......關於網路的使用,我一直是使用 usb....結果今天試著用 Wifi 分享,哪知....Wifi 的速度幾乎是 usb 的10倍!!!!而且不太會停頓........ 雖然說,用 usb 要多轉兩次,這也差太多了吧

2011/08/05

svn tag/branch

剛剛寫了一篇 svn on ubuntu,現在來談談對 release 的版本控制要怎麼進行。

版本控制有很多事要做,release 算是重要的一環。最簡單的就是自己在 commit 時加到註解中,然後日後自行讀 log 來判斷 release version

上面這種做法好處就是簡單,但是真正要做版本控制就有點複雜,因為必須從一堆 log 去找出來,當時間過去很久之後,這並不是一件簡單的事。因此比較正規的作法是用 svn copy 來完成。不過為了這個功能,一般書上會講一件事,就是目錄的擺放。我舉前面提到的 /home/svn/wade 來說....

首先,假如是用 log 來決定 release version 的話,大可以把所有 source code 都直接擺放 /home/svn/wade 下即可。但是若要用 svn copy 來做版本控制的話,依建議是.....
假設已經 checkout wade project 了,那麼在該工作目錄下執行底下兩個命令:
svn mkdir trunk
svn mkdir tags

然後,把所有 source code 都擺放在 trunk 目錄下,也就是真正的工作目錄是 /home/svn/wade/trunk
當你要 release source code 時,再用下面的命令:
svn copy http://localhost/svn/wade/trunk http://localhost/svn/wade/tags/release-1.0 -m "first release"

簡單講,svn 的 tag/branch 就是用 copy 來實現,而且是把工作目錄複製一份新的......當做了上面的命令之後,可以再接著用下面的命令來 release source code

svn export http://localhost/svn/wade/tags/release-1.0

svn on ubuntu

之前寫過幾篇跟 SVN 有關的文章,例如 svn server on win-xp ,或是 SVN 版本控管, 不過都是在 winXP 或是 Win7 上的,現在來寫一下怎樣在 Ubuntu 上安裝 svn。最後那篇值得沒用過的人參考一下。

首先,這樣的文章很容易找,例如 Ubuntu Help。不過我試了試會出點小問題,底下是我自己的小心得

一、照 Ubuntu Help 教的,先安裝套件:
sudo apt-get install subversion libapache2-svn
二、先決定自己的 repository 的佈置邏輯,以我為例,我是打算放在 /home/svn/PROJ 下,每個 PROJ 有一個 Repository, 也有得人懶得管理那麼複雜,所有 Projects 都放同一個 repository....決定好之後進行第三步,但是這邊舉例的兩種邏輯其實管理起來差異很大,我再補充補充:
1. 前一種在設定上比較麻煩,但是每個 Project 的 revision number(就是俗稱的版本號碼)是分開各自計算,好處就是可以對每個 Project 做版本控管,也可以做存取權限的控管,也就是可以分別控制誰可以存取
2. 後一種在設定上非常簡單,設過一次就不必再管理,但是將來的 Project 其實是在同一個repository 之下,無法分開控管
三、不管哪一種方式,總要先建立我要放 repository 的 home directory, 因此命令是:
$ sudo mkdir /home/svn
四、我弄了一個 shell script 叫 new-repository.sh....
#!/bin/bash
help()
{
  echo Usage: $0 PROJECT_NAME
  exit 0
}

[ "x$1" = "x" ] && help
SVN_HOME=/home/svn
cd $SVN_HOME
mkdir -p $1
svnadmin create $1
chown -R www-data:subversion $1
cd /home/svn/$1/conf
rm -f passwd svnserve.conf
ln -s $SVN_HOME/.conf/passwd .
ln -s $SVN_HOME/.conf/svnserve.conf .
五、要新弄一個 project 的話,只要簡單的下命令,不過請暫緩這個步驟,請先看第六步再回頭執行這一步:
$ sudo new-repository.sh MY-NEW-PROJECT
譬如
$ sudo new-repository.sh wade
六、從上面的 script 可以看到,事實上我也是讓每個 Project 用相同的存取設定,若您真的要分別管理的話,只要讓該 repository 裡面的 conf/passwd 或是 conf/svnserve.conf 不同即可, 這兩個檔的範例如下:
[users]
wade = iamwade
[general]
anon-access = read
auth-access = write
password-db = passwd
七、當您執行過第五步之後,就會產生一個適當的 repository, 那麼接下來就是要啟動 svn server....但是,竟然沒有 ubuntu 下的 /etc/init.d/svn 或是 /etc/init.d/svnserve....先看看怎麼啟動它:
$ sudo svnserve -d -r /home

$ sudo svnserve -d -r /home/svn
以上兩個方法,將來在存取時的路徑會不一樣,我是採用前一個
八、為了方便啟動/停止此項服務,我自己弄了個 /etc/init.d/svn, 內容如下,存好之後當然要讓它可執行($ sudo chmod +x /etc/init.d/svn):
#! /bin/sh
set -e

test -x /usr/bin/svnserve || exit 0
( /usr/bin/svnserve 2>&1 | grep -q exactly ) 2>/dev/null || exit 0

umask 022
SVN_OPTS="-d -r /home"

. /lib/lsb/init-functions

case "$1" in
  start)
        log_daemon_msg "Starting subversion server" "svnserve"
        if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/svnserve.pid --exec /usr/bin/svnserve -- $SVN_OPTS; then
            pidof svnserve > /var/run/svnserve.pid
            log_end_msg 0
        else
            log_end_msg 1
        fi
        ;;
  stop)
        log_daemon_msg "Stopping subversion server" "svnserve"
        if start-stop-daemon --stop --quiet --oknodo --pidfile /var/run/svnserve.pid; then
            log_end_msg 0
        else
            log_end_msg 1
        fi
        ;;

  restart)
        log_daemon_msg "Restarting subversion server" "svnserve"
        start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile /var/run/svnserve.pid
        if start-stop-daemon --start --quiet --oknodo --pidfile /var/run/svnserve.pid --exec /usr/bin/svnserve -- $SVN_OPTS; then
            log_end_msg 0
        else
            log_end_msg 1
        fi
        ;;

  status)
        status_of_proc -p /var/run/svnserve.pid /usr/bin/svnserve svnserve && exit 0 || exit $?
        ;;

  *)
        log_action_msg "Usage: /etc/init.d/svn {start|stop|restart|status}"
        exit 1
esac

exit 0
九、弄好上面的檔之後,就可以用一般的方式來管理服務,譬如 /etc/init.d/svn start, 或是 /etc/init.d/svn stop 或是 /etc/init.d/status
十、以上,您已經可以用 svn co svn://localhost/svn/wade 來取回 wade,當然此時是空的,或是您可以用 svn import /some/where/of/wade svn://localhost/svn/wade。要 remote 使用只要把 localhost 取代成 IP 即可。順便講一下前面第七步講啟動時的兩個方法,我是用前者啟動,若要改成後者,則存取路徑範例是 svn co svn://localhost/wade 。不知道有沒有比較出不同?
十一、若是要用 http:// 也行,我舉我的設定如下,請修改 /etc/apache2/sites-available/default 或是 /etc/apache2/mods-available/dav_svn.conf,後者就整個內容相同即可,前者則要放在<VirtualHost>與</VirtualHost>之間,內容如下:
<Location /svn>
  DAV svn
  SVNParentPath /home/svn
  SVNListParentPath On
  AuthType Basic
  AuthName "wade's repository"
  AuthUserFile /home/svn/.conf/htpasswd
  Require valid-user
</Location>
十二、存好上面的檔之後,只需要 /etc/init.d/apache2 restart 即可生效
十三、對 http:// 的控制,上面並沒有分開控制存取權限,請對 Location 複製去改就可以,譬如:
<Location /svn/wade>
  DAV svn
  SVNPath /home/svn/wade
  # SVNListParentPath On
  AuthType Basic
  AuthName "wade's repository"
  AuthUserFile /home/svn/.conf/htpasswd
  Require valid-user
</Location>

2011/08/01

lftpget, wget, curl?

本文沒要談標題那麼大範圍。在取得 chromium os 的 source code 時,因為公司網路的關係,在抓 dev-java/icedtea6-bin-1.6.2-r2 時,一直出現 timeout 的現象,害我一直抓不完。曾經試過 wget, lftpget 兩套來抓,也都抓不完。

後來發現 curl 有些參數還頗優秀,如下:
--retry 50 <-- 指定個 50 次,總會抓成功了吧?沒想到沒用,因為.....
--retry-max-time 0 <-- 最大總嘗試時間.....呃,0 是無限大,這樣總行了吧?還是沒用,因為....retry 間隔是隨次數而加倍遞增,所以總嘗試時間會很久,最後會超過「整個操作的最大時間」,因此可以搭配
--retry-delay 20 <-- 這個可以限制嘗試間隔時間,不過「整個操作的最大時間」也要指明一下,如下
--max-time 2000 <-- 整個操作的最大時間,我想,這樣總夠了吧....