根據changelog取版號

以前上傳ppa之前,都是手動打指令,其實應該要自動化才對,今天跨出第一步。第一步當然就是取版號,deb的版號是從debian/changelog來的,所以要從這裡著手。

當前的版號只會在第1行,一開始就想到用 head -n 1來取,用 awk 印出第2欄。可是第2欄前後有 () 呢?該怎麼拿掉呢?不會是要用 sed 吧? 去 GNU awk manual 翻閱了一會,發現有 match 函數,可以用 re 來取 group,所以用 match($2, /\((.*)\)/,arr); 就可以去掉 ()。

去掉 () 之後,想到應該可以把 head 省掉,也用 awk 處理。NR 是一個特殊的變數,當處理一筆(行)時,這個值就會累加。把它限定為 1,就表示只處理第1行了。於是就可以湊出這麼一段script。

CHANGE=`awk 'NR==1 {match($2, /\((.*)\)/,arr);printf("gcin_%s_source.changes", arr[1]);}' debian/changelog`
ls -l $CHANGE

cpio的pass through

以前沒想過 cpio 的 pass through 可以做什麼,今天要不是有朋友問我,我大概也不會想到這個。是這樣子的,假定有個目錄 a,裏面有很多目錄跟檔案,可是只要複製 a/b/c/file.txt 跟 a/b/file2.txt 到目錄 t 下,可是沒辦法用 cp -r,因為 cp -r 會把整個 a 都複製過去,總不能先複製過去以後再一個一個刪除吧? 本想說這可能要寫 script 來做了,打了 cp,按了 tab,看有沒有什麼可能的指令可用,就看到 cpio,印象中,cpio 可能是可以。

最初的想法是用兩個 cpio 來做,一個建 archive(cpio -o),一個解到指定的目錄(cpio -i),這樣就行了。用 info cpio 一查,發現 cpio -p 應該就可以做了。

所以試了一下,這裡先建立一個 list 檔案,裏面有兩行:a/b/c/file.txt 跟 a/b/file2.txt,a 目錄下有很多目錄跟檔案,並且有 a/b/c/file.txt 跟 a/b/file2.txt。那麼這兩行指令就可以只把list裡指定的兩個檔案複製到 t 目錄下,並且建立必要的目錄:

mkdir -p t
cat list | cpio -p --make-directories t

sis162u與ndiswrapper

原本以為linux的硬體相容性很高,至少好幾年前買的Asus USB無線網卡應該是要可以用的,結果,並不是我想的。不支援,就是不支援。
還好知道這支無線網卡的晶片是SiS162U,就上網Google了一下,發現大家都是用ndiswrapper來裝上Windows的驅動程式,然後讓它運作。
我裝的是ndisgtk這個GUI程式,安裝以後,執行ndisgtk,然後安裝sis162的windows驅動程式,就…大功告成了嗎?
不是,因為我用的sis162 windows驅動程式不知道有問題還是太舊,查了好久,後來我是去SiS官方網站抓了最新的105版的驅動程式下來裝,就沒問題了!!
所以碰到只有Windows驅動程式而Linux不支援的時候,可以用ndiswrapper + ndisgtk 試試看,也許就起死回生。

讀Debian新維護人員手冊

讀Debian新維護人員手冊記下的:

  • 比較版本:dpkg –compare-versions ver1 op ver2
  • 添加環境變數到 .bashrc 以供識別:
    DEBEMAIL=your.email.address@example.org
    DEBFULLNAME="Firstname Lastname"
  • dh_make 可以快速的從一個 tarball 產生出 tarball 副本跟 debian 目錄,如:dh_make -f ../gentoo-0.9.12.tar.gz
  • control裡的內容,如分類、權重…等可參考 Debian Policy Manual
  • 可以用 dpkg-depcheck -d ./configure去檢查相依性,或者用 objdump -p foo | grep NEEDED 去看用了哪些 library
  • changelog 可以參考Debian Policy Manual, 4.4,是主要定版號的地方。
  • rules 可以用 fakeroot debian/rules target 來執行裏面的特定 target
  • 可以用 debuild 來自動化,在 .devscripts 裡添加
    • DEBSIGN_KEYID=”keyID”
    • DEBUILD_LINTIAN=yes
    • DEBUILD_LINTIAN_OPTS=”-i -I –show-overrides”

    ,然後 debuild -sa、debuild clean

  • 檢查套件:
    • debi xxxx_i386.changes
    • lintian -i -I –show-overrides xxx_i386.changes

Run MiPony on Linux(wine)

因為看到MiPony可以快速下載freakshare.net的檔案,所以就想裝來試試看~
在Linux下,只能用wine,我用的版本是1.3。你得先安裝winetricks(sudo apt-get install winetricks),然後用winetricks裝上 gdiplus, fontfix, dotnet20, ie6(winetricks gdiplus fontfix dotnet20 ie6)。接著再用wine裝上MiPony,就可以了。
目前下載了十幾個檔案,都沒問題,真是太好了!!

GNU IceCat Privacy extension安裝總是失敗

之前都沒注意,直到GreaseMonkey升級,跑不起來,才發現這事情的嚴重性。
上網找了一下,果然已經有人跳腳:http://osdir.com/ml/bug-gnuzilla-gnu/2010-12/msg00057.html
就follow裏面的提供的網址:http://kb.mozillazine.org/Installing_extensions#Global_installation ,照裏面的指示去手動解壓縮 /usr/lib/icecat/extensions/privacy_ext.xpi 到 /usr/lib/icecat/extensions/privacy_features@gnuzilla.gnu.org 就行了。

加快linux開機速度

在 1 second Linux boot to Qt! 看到的,標題超聳動,不過實際看到影片,真的是很嚇人,根本就是瞬間就開好了。投影片在這裡:The Right Approach to Minimal Boot Times
這個 topic 前兩年很熱門,當然啦,現在因為 Android 的關係,應該會更熱。下面是我看完的一些紀錄跟想法:

  • 使用 Arjan van de Ven 對 kernel aync 的 patch
  • 把不重要的 module 改成 loadable
  • 修改init/do_mounts.c以提早mount root
  • 修改init/main.c裡的init_post,看了以後,我想應該是避免掉open /dev/console還有移掉不必要的步驟以提速。
  • improve memcpy (這我不知道是哪裡的,要再查看看)
  • reduce kernel size:這可以加快 u-boot 載入時間。一般手段就移掉不必要的driver/module。
  • reduce u-boot delay time:u-boot 預設有 delay time,這可以改掉
  • kernel 壓縮或不壓縮:用zImage的話可以減少kernel大小,可是要評估解壓縮時間跟載入時間的平衡來決定壓縮或不壓縮。
  • 利用 gcc 的 –finstrument-functions –function-sections 去 profile function 的時間 (簡報說加了這兩個 argument,就可以在 __cyg_profile_func_enter/__cyg_profile_func_exit 裡放 code,這個要鑽研 gcc 試試看。)
  • 利用ubootchart/bootchart.org工具來測時間。

參考資料:

fcrackzip

正愁不知道怎麼破解密碼,就丟 ubuntu brute zip password extract 這些字到 google 去找,想不到立馬就找到Ubuntu Geek上的這篇:Howto Crack Zip Files Password,用 apt-get 就可以裝好。
使用也很簡單 fcrackzip your_file.zip 就行了。要縮小範圍的話,可以參考 -h 的說明,指定參數來縮小範圍、加快解密的速度。

打包gcin到ppa的心得

我是沿用1.4.6由kanru所寫的debian目錄,kanru大似乎沒考慮到64bit的部份,放到ppa的時候,因為會build出各種arch的版本,所以就需要處理。
我碰到的問題是在於目錄名稱,32bit是lib,而64bit則是lib64,在debian/rules裡,我用 DEB_BUILD_ARCH_BITS 來決定是處理lib64或是lib,原來的gcin.install也改用gcin.install.in,然後用sed來替換,產生gcin.install:

# 略...gcin是先裝到debian/tmp下,後續再用搬目錄方式,搬到debian/gcin下,這個target跑完,dpkg-buildpackage會去包debian/gcin下的檔案。
if [ "$(DEB_BUILD_ARCH_BITS)" -eq "64" ]; then \
mv debian/tmp/usr/lib64/gtk-2.0/immodules/* debian/gcin/usr/lib/gtk-2.0/$(GTKVER)/immodules/  ;\
else \
mv debian/tmp/usr/lib/gtk-2.0/immodules/* debian/gcin/usr/lib/gtk-2.0/$(GTKVER)/immodules/ ;\
fi
# 略
if [ "$(DEB_BUILD_ARCH_BITS)" -eq "64" ]; then \
sed -e s,@LIBDIR@,lib64, debian/gcin.install.in > debian/gcin.install ; \
else \
sed -e s,@LIBDIR@,lib, debian/gcin.install.in > debian/gcin.install ; \
fi
# 略

另外,則是遇到無法上傳的問題,說是因為檔名重複,就被reject掉了,後來是在debian/changelog裡,讓”檔名-版本”的後面多加-lucid0, -lucid1, -maverick0, -maverick1…的方式,硬解了,不知道是不是正解…

如果你需要最新版的gcin,除了Tetralet包的版本之外,也可以試試我包的:

sudo add-apt-repository ppa:elleryq/gcin
sudo apt-get update
sudo apt-get upgrade

編譯gcin

我的環境是 Ubuntu 10.04/10.10。
首先到gcin source code 下載處 下載原始碼,就解開。
確定已經裝了 libgtk2.0-dev, libxtst-dev, libqt4-dev, libanthy-dev 這幾個套件,libqt3-mt-dev可以不裝,大多數的QT應用程式應該都升級到QT4了。
然後就執行 ./configure、make、sudo make install 三部曲。
但是 make 時,應該會吐找不到 /usr/lib/qt4/bin/moc 的錯誤,我不太清楚為什麼要用這個目錄下的,至少,我的環境是找不到,也許 debian 是放在那兒也不一定。這個檔案是在 /usr/bin/moc-qt4,所以把 qt-im/Makefile 、 qt4-im/Makefile 裡的 /usr/lib/$(QT)/bin/moc 改為 /usr/bin/moc-$(QT) ,接著再重新編譯、安裝就沒問題了。