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) ,接著再重新編譯、安裝就沒問題了。

xml2

今天把 conky 裝起來,然後參考了 To-Dos, Weather, and Twitter on a Linux Desktop 來改,不過,文章裡用的是英國BBC氣象資料,也搞不清楚地區代碼是哪個,所以就乾脆去看中央氣象局的網站,看有沒有資料可以直接撈。

現在中央氣象局網站做的不錯,已經有提供 RSS 了,所以就拿 RSS 來 parse。可是,你知道 RSS 其實是 XML,要parse XML總是麻煩,想在一行之內做完,看來是不太可能。

就想說找一下,看有沒有現成的工具可以用,就用 apt-cache search xml 來找。找的結果,發現有個 xml2 的套件,說明說是 Convert between XML, HTML, CSV and a line-oriented format,應該是合用,就裝上試試看了。

xml2 就很簡單把 xml 轉成文字檔,結果大致是這樣 tag1/tag2/tag3…=node value
所以接著就可以用 awk 開刀了:

curl -s --connect-timeout 30 "http://www.cwb.gov.tw/rss/forcast/36_04.xml" | xml2 | awk -F '=' '/^\/rss\/channel\/item\/title/{print $2;}'

這樣,就可以得到目前的天氣了。用bash真的是很好處理東西~

wine的慘事

98/365: ♫ Red, Red Wine...
有用 wine 跑 win32 application 的人都知道,常常會遇到 .dll 缺東缺西的。這一天,我自作聰明地就想,反正裝的是雙系統,如果把 .wine/drive_c/windows 跟 .wine/drive_c/Program files 直接指向 windows 分割區裡的 windows 跟 Program files 資料夾的話,應該就萬無一失了吧~
所以立馬就先把 .wine/drive_c 下的 windows 跟 Program files 更名,做 symbolic link 連到 windows 分割區下的 windows 跟 Program files,接著就跑 excel 試試看。哈哈~我真是太聰明了,果然可以執行,但是有一些錯誤產生,後來想說還是照網路上的教學文件,用 winetricks 裝上必要的元件,然後直接裝 office 2003 好了。所以就把 symbolic link 移除掉,把之前更名的資料夾改回原名,進行安裝。這次就可以順利跑起來了,不過沒有詳細去試。
然後,就想說要回 windows 去收信,結果,悲劇就發生了,Windows 一直重開機、一直重開機…試著用安全模式開進去,不行,也是會重開機。我猜想,應該是某些檔案被覆蓋或被修改了,所以我重回到 Linux 下,把 .wine 更名,然後執行 wine,看 wine 到底在 .wine 下產生了什麼檔案。我根據這些產生的檔案,去另外一台完好的 windows 下把這些檔案複製回來,放到 windows 分割區對應的路徑下。哈,這次可以進安全模式了,可是如果以正常模式開機,還是會一直重開機。既然可以進安全模式了,那麼,系統還原就派上用場,不過,只有一次,因為在windows還活著的時候,我把保留給系統還原的空間砍到最少。不幸的是,還原的結果是….失敗。
啊!!!!!沒辦法了,重灌吧!!!鄉親啊,千萬不要學我這樣子啊!!!

.desktop 的 icon

之前看了 terminator source code 裡的 .desktop 時,想說為什麼沒有寫 Icon 的完整路徑,於是就跳過這段,後來碰到問題,下去看了才知道。
根據 .desktop 的 specification,.desktop 裡的 Icon 不建議放完整路徑的檔名,只要放名稱就可以了,桌面環境會自動去 /usr/share/icons、/usr/share/pixmaps 下找。
所以如果你的程式要有 icon,那麼你應該在這些地方放你的 icon

  • /usr/share/icons/hicolor/<size>/apps:
    size: 16×16, 22×22, 24×24, 32×32, 48×48, scalable,除 scalable 是 svg 外,其他都是 png/jpg。
  • /usr/share/pixmaps/ :這裡也是 png/jpg

照這樣放了以後,.desktop 裡就不需要放完整路徑的檔名,只要放名稱就可以了。
之前還笨笨的寫 sed 去替換說,可是用 sed 替換,在 launchpad build server 上,會遇到一些問題 (因為我是把 sed 這段寫在 setup.py 裡),不得已,回頭看 terminator 研究,才知道來龍去脈。

上傳 debian package 到 PPA

去年就試著想放東西到 PPA 上,可是受限於公司網路環境與個人鬼混的因素,導致今天才真正把東西放上去。這部份中文的資訊很少,可能大家看PPA說明就都搞定了吧。
你比較會遇到的幾個問題:一個是 PGP、一個是如何打包 debian package,這邊假設你都會了。(PGP 可以去 Jedi 那邊找介紹文)
以下,就開始。你必須要先有 PGP key,然後到 launchpad 註冊,成為會員。
這篇:Personal Package Archives來做,我整理重點如下:

  1. profile頁,把 ppa 打開。
  2. 填 OpenPGP public key。
  3. Sign conduct:其實就下載文字檔,然後打指令,用gpg sign過(文章裡有指令),產生 .asc 檔案,再把檔案內容貼上去,送出即可。

上傳可參考這篇:Uploading a package to a PPA,package 有些要注意的事項,例如 changelog,在上面那一篇有說明,就是一般 debian changelog 裡是寫 unstable、experiment,在這裡要改為 lucid、hardy 等。
大致摘要如下:

  1. 準備好你要上傳的 package,用 dpkg-buildpage -S -k<your_gpg_private_key>,做出 source package。
  2. 到上一層目錄,找到 P_V-0_source.changes (P 表示你的 project name,V 表示版本)
  3. 上傳:輸入 dput ppa:your_ip-id/ppa P_V-0_source.changes
  4. 上傳順利的話,接下來就等回信了~

dput 預設是用 ftp 上傳,如果不行,可以試試 sftp:

  1. profile 填 ssh key
  2. 新增 ~/.dput.cf ,裏面放:
    [my-ppa-lucid]
    fqdn = ppa.launchpad.net
    method = sftp
    incoming = ~<your_launchpad_id>/<ppa_name>/ubuntu/<ubuntu_code_name>
    login = <your_launchpad_id>
    allow_unsigned_uploads = 0
    

    ,your_launchpad_id、ppa_name、ubuntu_code_name 不要忘了替換掉,ubuntu_code_name 就看你裝的 ubuntu 版本,填 lucid、hardy…等等的

  3. 上傳指令改用 dput my-ppa-lucid P_V-0_source.changes

回信不會那麼快,要稍微等一下,如果有問題,裏面會有錯誤訊息,不知道怎麼辦的話,很簡單,到 Questions for Soyuz 找答案。
最後成功的話,會有回信說 Accept,這時候再到你的 ppa 頁面,就會看到 package 了,不過這時候還在 building,需要等一陣子。
到這裡,應該就大功告成了。之後就可以很方便的用 add-apt-repository 來把自己 ppa 加進去,然後安裝、升級 package 啦~

busybox 的 mdev

mdev 實際上算是 udev 的替代品,代碼看起來很簡單。
下 mdev -s 會 enumerate /sys/class 下的檔案,並據此去建立 /dev 下的 device 檔案。如果 /etc 下有 mdev.conf,它會先參考這裡的設定,來決定 device 的 permission 與 user/group owner。
雖然說是 /sys/class,但是 /sys/class 下的檔案實際上都是 symbolic link,指向 /sys/device 下的檔案。
也可以下這行

echo /sbin/mdev > /proc/sys/kernel/hotplug

,直接讓 kernel detect 到新裝置時,就請 /sbin/mdev 去 /dev 建立新的 device 檔案。
kernel 是怎麼傳遞資訊給 mdev 的呢?答案是透過環境變數,kernel 在執行 /sbin/mdev 之前,會先填好 ACTION、DEVPATH跟SUBSYSTEM 這3個環境變數之後,再去呼叫,所以 mdev 才會知道要做些什麼。這也就是在 shell 下輸入 /sbin/mdev 會印出使用說明的原因,因為沒有這3個環境變數,mdev 就只印出說明了。
kernel mode 下的呼叫,還牽涉到 FIRMWARE 的部份,不過這邊目前沒用到,只有大致看一下。大底來說,就是如果有 FIRMWARE 環境變數時,他會試著去讀取 /lib/firmware/xxx 的 firmware 檔案內容,然後檢查 /sys/$dev/loading 這檔案,有了這檔案以後,再寫入 1,接著再把讀到的內容寫到 /sys/$dev/data 這個檔案裡去,完成載入外部 firmware 的動作。
程式相當的精簡,有空再來看看 udev。

initrd+busybox

kernel source 的 Documentation/initrd.txt 裡,把 initrd 、開機順序跟必要的程序講的很清楚,依法施為,大致就沒問題了。

雖然如此,我還是花了快一天的時間。這邊紀錄一下我的作法,我是用文件裡提到的 loop device 方法,也就是先用 dd if=/dev/zero of=initrd bs=4M count=1 製作出 initrd,再用 mke2fs 格式化,接著用 mount -o loop 把這檔案掛為檔案系統。

然後我 build BusyBox,參考 BusyBox 原始碼的 examples/bootfloppy/mkdevs.sh 裡的 code,把我要的 device 都建起來,然後把 BusyBox 的相關檔案放進去,再把 examples/boot/floopy/etc 放進去。接著修改 etc/init.d/rcS, etc/fstab, etc/inittab,調整成我要的樣子以後,就差不多了。

因為這份 initrd 在開機後,我就拋棄了,所以 etc/init.d/rcS 最後得掛上真正的 device,並且切換過去:

# mount your device to /newroot.
mkdir /newroot
mount -t ext3 /dev/your_device /newroot
cd /newroot
mkdir /initrd
/sbin/pivot_root . initrd
exec /usr/sbin/chroot . /init </dev/console >/dev/console 2>&1

最後,umount,再用 gzip -9 壓縮得到 initrd.gz 之後,大致上就是這樣子。

xargs

以前就看過 xargs 這指令了,不過那時只有看人家的範例,沒有理解為什麼要這樣用。等到想試著用的時候,才發現原來是這樣子。
因為我之前完全誤解了。
舉例來說,這樣的命令:

ls | xargs echo

假設我目前目錄有 file0, file1, file2 這3個檔案,我以為 xargs 會根據 stdin,執行 echo 三次,這當然是錯誤的。
xargs 會讀取 stdin 的內容,然後轉成以空白分格的字串,再將結果作為指定命令的參數。所以上面最後會執行的指令其實是:

echo file0 file1 file2