2010年4月18日 星期日

淺談 debian packaging - 4

上回書說 control 檔裡的幾個重要標籤。整個 debian 的套件管理幾乎可以說是靠這麼少少的數個標籤所撐起來的。那麼延續著 control 檔的話題,這次就先把相依關係更清楚的講解一下,然後談談我個人認為 debian package 管理中最偉大的東西 - 虛擬套件。

我認為最快的學習就是先強記一些基本的概念及關鍵字之後,透過實例或操作來印證。要理解套件之間的相依,最好的工具就是 aptitude 和 synaptics。
俗話說:「沒圖沒真相。」,以下就以一張 aptitude 的螢幕擷圖來實際說明幾個最常用的標籤。

這是在 Ubuntu 9.10 (karmic) 裡,對 apt 這個套件按 Enter (查看詳細資訊)的結果。以下列舉一些相依關係,用比較自話的方式來描述他們。

  • 必須要安裝 libc 2.4 版 (或比 2.4 還新的版本,如 2.4.1、2.5 等等),apt 這個套件裡的東西才能正常執行。
  • apt-doc 裝不裝都可以,有裝有保庇,沒裝無要緊。
  • ubuntu-keyring 最好是裝一下,沒裝的話還是可以執行啦,不過可能需要調整一下、修改個設定檔,或者是某些常用的功能會錯誤一類的。
  • 如果你有裝 libapt-pkg-dev (比 0.3.7 更舊的版本),有一部份的檔案會被 apt 這個套件蓋掉。
  • apt 這個套件會提供 libapt-pkg-libc6.10-6-4.8 這個虛擬套件。
  • 如果你有裝 apt-move 的話,最好裝一下這個 apt。(注意到了嗎,apt-move 是歸類在依賴於 apt 的套件之中的,所以被推薦的是 apt 才對。
看到這邊,喝杯茶思考一下,相信對套件之間的相依關係已經有一幅清晰的圖案浮現了吧。


2010年3月18日 星期四

為 RhythmBox 啟用 Acer 4920G 的 MediaTouch

其實之前9.04的時候有弄過,只是某天不小心砍掉了orz

先來大致解釋一下原理:目前的 Xorg 抓到的 MediaTouch 是 Synaptics TouchPad,而且和底下那個真正的觸控板完全一樣。比如說我的 4920G 用 xinput list 來看是這樣的

"SynPS/2 Synaptics TouchPad" id=2 [XExtensionPointer]
 Type is TOUCHPAD
 Num_buttons is 12
 Num_axes is 2
 Mode is Relative
 Motion_buffer is 256
 Axis 0 :
  Min_value is 1472
  Max_value is 5472
  Resolution is 1
 Axis 1 :
  Min_value is 1408
  Max_value is 4448
  Resolution is 1
"SynPS/2 Synaptics TouchPad" id=11 [XExtensionPointer]
 Type is TOUCHPAD
 Num_buttons is 12
 Num_axes is 2
 Mode is Relative
 Motion_buffer is 256
 Axis 0 :
  Min_value is 1472
  Max_value is 5472
  Resolution is 1
 Axis 1 :
  Min_value is 1408
  Max_value is 4448
  Resolution is 1
第一行的 id= 是這個裝置在 xinput 中的代號。理論上這個編號每台電腦都有可能不同,但 MediaTouch 應該都是第一個才對。
有了裝置的編號,接下來就是先用 xinput 把原來的按鈕重新綁定到四個不同的、未使用的按鈕,然後再用 xbindkeys 把這些按鈕綁定到 RhythmBox 的相關動作。

接下來是實作的時間了:
剛剛有提到,我的電腦上 MediaTouch 的編號是 2。所以 xinput 重新綁定的命令要這樣下

xinput set-button-map "2" 1 2 3 17 18 19 20 8 9 10 11 12 13 14 15 16
這樣會把第 4 個按鈕(通常是向上捲動,在 MediaTouch 上則是播放/暫停)綁定為第 17 個按鈕,以下類推。

再來是用 xbindkeys 把 17~20 這幾個按鈕(現在是 MediaTouch 上那四個鈕了)對應到 RhythmBox 上。RhythmBox 有提供一個小程式,可以在命令列控制播放、暫停、下一首、上一首…等功能(這也是為什麼我選擇 RhythmBox 的原因之一),詳細的用法可以查看 rhythmbox-clinet 的 manpage
設定 xbindkeys 的方式也很簡單,設定檔的語法非常好懂

"rhythmbox-client --no-present --play-pause"
  b:17
第一行是要執行的指令,外面用雙引號括起來就好了。第二行是要綁定的按鈕或按鍵, b:17 就是綁定在第 17 個按鈕上。所以完整的設定檔會像這樣:
"rhythmbox-client --no-present --play-pause"
  b:17

"rhythmbox-client --no-start --pause --hide"
  b:18

"rhythmbox-client --no-present --no-start --previous"
  b:19

"rhythmbox-client --no-present --no-start --next"
  b:20
設定檔寫好之後,要存在家目錄裡,檔名是 .xbindkeyrc。存好之後執行 xbindkeys,就能用 MediaTouch 來控制 RhythmBox 了

現在萬事具備,只要再把剛剛有執行過的兩個程式 ( xinput 和 xbindkeys ) 加到「啟動應用程式」裡就可以了。

為了方便,這邊提供一個小小的 bash script 來啟動這兩個程式

2010年3月6日 星期六

淺談 debian packaging -3

既然要談 control 檔,當然不能不提到 maintainer's guide 裡關於 control 檔的說明
這份說明是關於 source package 中的 control 檔,與 binary package 裡的大同小異。

幾個比較主要的標籤有

  • Source: source package 的名字
  • Package: binary package 的名字
  • Section: 套件的分類。在 debian 裡,套件依授權的方式分為 main(完全採用自由授權的軟體)、contrib(本身是自由軟體,但依賴一些非自由軟體,比如 java-package - 將 sun 的 java 打包成 deb 檔的程式,打包程式本身是 GPL 的自由軟體,但它會去下載 sun 的 java,這就不是自由軟體了)、non-free(非自由的軟體,比如 sun-java)三大類,底下再依功能細分成文件、程式庫、網際網路…等等。
    而在 ubuntu 裡則是依授權和更新及支援的方式分成 main(由官方提供更新及支援的自由軟體)、universe(官方不提供支援的自由軟體)、multiverse(官方不提供支援的非自由軟體)、restricted(不提供原始碼的非自由軟體,主要是驅動程式)四大類,底下一樣細分成很多小類。
    如果看不懂 maintainer's guide 所寫的意思,這裡有幾張圖可以參考一下
    1. Aptitude 中文介面,multiverse/doc
    2. Aptitude 英文介面,main/doc
    3. Synaptic 中文介面,main/doc
    4. Synaptic 英文介面,main/doc
  • Priority: 套件的優先程度,這可以想成是「系統有多需要這個套件」。像是 adduser 的優先程度,在ubuntu 裡標為 important(重要),而 fuseiso 這個套件則是 optional(次要)。
  • Maintainer: 套件維護者的連絡方式,格式就是標準的 email 地址。
  • Architecture: 支援的 CPU 種類。最常見的就是 i386(INTEL 80386 相容的 CPU,幾乎INTEL、AMD 的 CPU 都算在內了)、amd64(64bit 的 CPU)、arm(常用於嵌入式系統的 ARM CPU),還有一個特殊的 any,如同字面上的意思,是和硬體無關的,比如文件檔或用 python、php、java 等語言開發的程式。
  • Description: 套件的說明


2010年2月27日 星期六

A note about ffmpeg - convert video to DVD/VCD/SVCD

4th aunt request me to burn her video into svcd. After trying Avidemux, I decide google for better solution.

I can type many options in console to convert it in fact. But it's not possible for my aunt to use a terminal. I found an option seems very useful when writing scripts for my aunt.

Below are copied from ffmpeg's manual.
-target type
   Specify target file type ("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ... ). All the format options (bitrate, codecs, buffer sizes) are then set automatically. You can just type:

         ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg

   Nevertheless you can specify additional options as long as you know they do not conflict with the standard, as in:

         ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg
So I can write an script, using zenity for file selection, then convert it using "ffmpeg -i source_file -target svcd target_file" command.

2010年2月24日 星期三

再訪艾比路

這是第二次來了,上次是年前的 ubuntu-tw 社群小聚時來的。 今天是去NOVA買東西的時候轉錯彎,剛好到了附近。

從上次來過之後,就一直沒有機會喝到比較正常的咖啡。 小七的咖啡機和豆子都不算太糟糕,不過沖出來總覺得味道不太對勁。

再往前追一點,似乎就是在中偉喝的那次了。

縱使曾經喝到咖啡因中毒,始終還是惦著這份味道。有人說咖啡就是性愛,看來真是有點道理。


滿巧的是,艾比路是國中同學開的,從畢業就沒有再連絡過的同學。

撇開這個不談,艾比路的訴求是音樂和休閒。雖然不是多特別的想法,但這家店確實有做到。

略暗偏黃的燈光讓人放鬆;木紋桌面有點搖晃,反而覺得像在家裡一樣。櫃上的Hershey's恰好讓我這個酷愛甜食的人,在胡思亂想的時候,讓目光有個螢幕或周邊客人以外的停駐點。音樂非常有BGM效果,不會讓人太過專注在聽,卻又相當悅耳。

我無法確認老闆和氣又不失熱情的態度是因為見到老朋友,又或是本來就是這樣。至少雙耳所聞,與客人間透著真誠味的對話,應該足以說明了。

撰文的同時,觀人相貌的老毛病又犯了。和 match cafe 一樣,來這的人雖然平凡無奇,卻都是心有堅持的面孔。雖然不能看出來所持之念,雖然本人或許都無法察覺自已在堅持的時候所得到的東西,但有所堅持必有其回報,背影中和潤的感覺就是最好的註腳。

喝咖啡的時候不見得都會想很多,也許是旁邊客人聽不清的私語聲,夾著背景音樂不時流到耳裡的幾個段落,讓心裡期待卻最不實用的東西浮上來了吧?

艾比路的店徽

2010年2月16日 星期二

淺談 debian packging -2

binary package 其實一點都不神秘,每一台 debian(或 deb based) 的機器都有完整的工具可以解開他的面紗。最主要的工具就是 dpkg-deb

查看 dpkg-deb 的 man page,可以看到這個工具不止可以解開,還可以修改、建立 deb 檔。在建立 deb 檔的部份,可以看到 deb 檔格式的部份面貌:

Creates  a  debian  archive  from  the filesystem tree stored in directory. directory must have a DEBIAN subdirectory, which contains  the  control  information  files such as the control fileitself. This directory will not appear in the  binary  package's filesystem  archive,  but instead the files in it will be put in the binary package's control information area.

也就是說,每個 deb 檔都要有一個名為 DEBIAN/ 的特殊目錄,這裡面放的是控制資訊。那麼控制資訊又是什麼呢?不如來實際操作一下好了:

2010年2月2日 星期二

使用 gmail 做為 git-email (git-send-email) 的 smtp server

git-send-email 是用 email 寄出一系列 patch檔的工具,對於大量使用 email 做為連絡工具的開發社群來說,是不可多得的好東西。

其實 man page 已經寫的非常詳細了,這裡只是做一些簡單的筆記。
有些命令列的參數是可以寫進 config file 裡的,可以減少每次都要下指令的麻煩。尤其是 smtp server 的部份(同時也是本文的重點)。

這裡要先提一下 gmail 的 smtp 設定。smtp server 是 smtp.gmail.com,必須要使用 ssl 加密,登入用的帳號是完整的 email 位址。

這些資料分別對應了 git-send-email 的 --smtp-server --smtp-encryption --smtp-user 等設定。
幸運的是,這些也是可以使用 config file 來設定的項目,不需要每次都手動輸入。

git config sendemail.smtpencryption "ssl"
git config sendemail.smtpserver "smtp.gmail.com"
git config sendemail.smtpuser "your@email.address"
git config sendemail.smtppass "your password"

git-send-email 的用法是 git send-email [選項] PATCH檔案、特定目錄、或是指定的版本

若是指定檔案,他會把檔案內容當作 email 寄出;指定目錄時會把目錄下的所有檔案都放在信件內文寄出;若是指定版本,則會將 patch 當成內文寄出。指定版本的方式與其他 git 工具都相同,這也是最主要的用途。

在預設情況下,會使用 git var -l 時顯示的 GIT_COMMITTER_IDENT 的值當成寄件者(From 標籤),Cc 標籤是 committer,subject 則是 commit log 及 patch 編號,同時也會設定 In-Reply-To 標籤,使這一系列的 email 能成為一串 thread。

比較常用的選項有
  • --bcc 為 bcc 標籤增加一個收信者
  • --cc 為 cc 標籤增加一個收信者
  • --compose 寄信前先打開編輯器,讓你可以為這一系列的 patch 輸入一些介紹的文字,做為信件內文的一部份
  • --from 更改 From 標籤
  • --subject 更改 Subject 標籤,只能與 --compose 一起使用
  • --to 增加一個收件者
  • --no-signed-off-by-cc 預設情況下會把 commit log 中 Signed-off-by 標籤和 Cc 標籤也都加入 email 收件者中,這個選項可以取消這個動作
  • --supress-cc 不要把特定種類的 email 加入 Cc 標籤,詳細的類別可以查看 man page;較常用的有 author - 作者,也就是 commiter,self - 自已,all - 不自動增加 Cc 標籤

2010年1月25日 星期一

淺談 debian packging -1

debian packaging 並不是一門艱深的學問。目前已有許多工具可以作為輔助,讓沒有深入了解的人也能包出 deb 套件,方便散佈。但簡單的工具,相對來說較難處理麻煩、複雜的問題(尤其是在同時處理 source 和 binary package 的時候)。
未來打算以系列文章的方式,淺談一些 debian packaging 的相關知識、工具使用。

當然,最佳的知識來源,莫過於 debian-policymaintainer's guide (也有中文版),以及 debhelper、dh-make 等相關套件的 manual pages。


2010年1月17日 星期日

用git協助維護debian packaging (以desmume為例)

desmume 的開發社群位於 SourceForge 上,使用的是 subversion。因為 subversion 太慢,而且不是分散式的,所以改為透過 git-svn 來管理。既是使用 git,debian packaging 的維護當然就要靠 git-buildpackage 來幫忙。
以下從無到有,紀錄如何使用 git 來維護 debian package


2010年1月13日 星期三

突然想起karmic裡的cairo有個bug該解決 (debian/rules)

今天突然想起自已維護的core2最佳化版firefox裡,cairo的debian/rules有個bug:CFLAGS_main與CFLAGS_udeb兩個變數是無用的。
這是因為有個函數 "flavor_get" 與這個兩變數的格式不同,可能是typo吧

已經把bug回報到lp.net上了 #506490
解法很簡單,把
flavor_get = $(or $($(current_flavor)_$(1)),$($(1)))
改成
flavor_get = $(or $($(1)_$(current_flavor)),$($(1)))
就好了


正確的解法應該是把變數名稱改成main_CFLAGS和udeb_CFLAGS才對

2010年1月12日 星期二

desmume-trunk PGO化

glade版的desmume似乎還有問題,在我的電腦上無法拖曳,導致許多遊戲無法玩(例如應援團的轉轉盤動作);故pgo是針對gtk版來設計
若要針對cli版進行pgo最佳化,可自行修改mkpkg檔,將
src/gtk/desmume
改成
src/cli/desmume-cli
源碼放在GitHub