2011年11月21日 星期一

Ubuntu 11.10 繁體中文全新安裝後手動修正問題

共同的部份

1. 系統語言變數設定錯誤
直接修改 /etc/default/locale 內容改成
LANG="zh_TW.UTF-8"
LANGUAGE="zh_TW:en"
然後再執行
$ sudo update-grub
2. fontconfig 字型設定錯誤
正常的設定會是以下的結果
$ fontconfig-voodoo -c
Current config: zh_TW
如果不正常就執行以下命令修正
$ sudo fontconfig-voodoo -a
修正完畢後,重新開機應該就會正常了。

Xubuntu 11.10

1. ibus 導致程式崩潰的問題
$ sudo apt-get install ibus-gtk ibus-gtk3
$ cd /usr/lib/gtk-2.0/2.10.0/
$ sudo ln -s /usr/lib/i386-linux-gnu/gtk-2.0/2.10.0/immodules
如果是使用 AMD64
$ sudo ln -s /usr/lib/x86_64-linux-gnu/gtk-2.0/2.10.0/immodules

2011年11月20日 星期日

在 Sony Ericsson Xperia™ X8 刷 MiniCM7

MiniCM 是一個特別為 Sony Ericsson Xperia  X10 mini / X8 製作 Android 的 CyanogenMod 客製化的計畫



以下是筆者的安裝步驟筆記,自行刷客製的 Android ROM 有一定的風險,請讀者自行負擔風險,筆者不擔保過程中發生的問題。
  1. 首先需要在 Windows 下載安裝 Sony Ericsson PC Companion 2.0 用來升級跟還原出廠預設版本(安裝過程中有任何問題都可以還原手機上的系統)
  2. 如果 [設定] -> [關於手機] 裡面的 [基頻版本] 不是 015 結尾的話,需要下載 Baseband 015 的 firmware 回來使用 Flashtool 來更新,然後重新啟動手機
  3. 在 Windows 上面安裝使用 SuperOneClick 來取得手機上的 root 權限,然後重新啟動手機
  4. 利用 Android Market 安裝 Apk Installer 用來安裝 Root Explorer,然後重新啟動手機
  5. 然後再將 Xrecovery.zip 裡面的三個檔案利用 Root Explorer 複製到手機系統裡的 /system/bin 底下
  6. 重新啟動系統,看見手機畫面上出現 Sony Ericsson 字樣時不斷地連擊手機上的 Back 鍵,順利的話就可以進入 Xrecovery
  7. 在 Xrecovery 裡面安裝 MiniCM7-2.0.7-X8.zip 跟 gapps-gb-20110828-signed.zip,然後再執行 factory reset 再重新啟動手機就大功告成啦!^o^

PS. 筆者所使用的手機型號是 X8i(E15i)

2011年9月26日 星期一

在 Ubuntu 10.10 上修正 NVidia 的 HDMI audio 支援問題

首先要裝上 ppa:fourdollars/nvidia 上面的 nvidia proprietary driver
還要裝上 ppa:diwic/dkms 上面的 alsa-hda-dkms
還要裝上 ppa:ubuntu-audio-dev/ppa 上面的 pulseaudio
然後重新啟動
接下來看看 HDMI 接在哪裡
$ for i in /proc/asound/NVidia/eld*; do echo "<<$i>>"; cat $i; done
<</proc/asound/NVidia/eld#0.0>>
monitor_present		0
eld_valid		0
<</proc/asound/NVidia/eld#1.0>>
monitor_present		1
eld_valid		1
monitor_name		CHIMEI 22SH-L
connection_type		HDMI
eld_version		[0x2] CEA-861D or below
edid_version		[0x3] CEA-861-B, C or D
manufacture_id		0x73b
product_id		0x2d22
port_id			0x10000
support_hdcp		0
support_ai		0
audio_sync_delay	0
speakers		[0x1] FL/FR
sad_count		1
sad0_coding_type	[0x1] LPCM
sad0_channels		2
sad0_rates		[0xe0] 44100 48000 88200
sad0_bits		[0xe0000] 16 20 24
<</proc/asound/NVidia/eld#2.0>>
monitor_present		0
eld_valid		0
<</proc/asound/NVidia/eld#3.0>>
monitor_present		0
eld_valid		0
從上面的紀錄可以看出在 /proc/asound/NVidia/eld#1.0 上面
不過可能會看到都是靜音的狀態
$ amixer -D hw:NVidia
Simple mixer control 'IEC958',0
  Capabilities: pswitch pswitch-joined penum
  Playback channels: Mono
  Mono: Playback [off]
Simple mixer control 'IEC958',1
  Capabilities: pswitch pswitch-joined penum
  Playback channels: Mono
  Mono: Playback [off]
Simple mixer control 'IEC958',2
  Capabilities: pswitch pswitch-joined penum
  Playback channels: Mono
  Mono: Playback [off]
Simple mixer control 'IEC958',3
  Capabilities: pswitch pswitch-joined penum
  Playback channels: Mono
  Mono: Playback [off]
就可以執行
$ alsamixer -D hw:NVidia
在 CUI 設定畫面中全部取消靜音,接下來執行
$ pasuspender -- speaker-test -D hdmi:NVidia,1 -c 2 -t sine -l 1
應該就可以聽到聲音了,確定裝置之後就可以修改 /usr/share/pulseaudio/alsa-mixer/profile-sets/default.conf 當中的
[Mapping hdmi-stereo]
device-strings = hdmi:%f
channel-map = left,right
priority = 4
direction = output
改成
[Mapping hdmi-stereo]
device-strings = hdmi:%f,1
channel-map = left,right
priority = 4
direction = output
再重新啟動後應該就可以聽到 HDMI audio 的聲音了。

其它幫助除錯的方法還有

2011年8月31日 星期三

Project Euler - Problem 12

昨天在 TOSSUG 聚會上 Choupi 提到這個問題 Project Euler - Problem 12 於是就寫了以下的 Vala 程式碼來解這個問題
void main()
{
    int i = 0, number = 0;
    // 用來儲存質數分解的結果
    HashTable<string, int*> factors = null;

    do {
        // 逐個取出三角數
        number = triangle_number(++i);
        // 算出所有因數的個數直到比 500 還要大為止
    } while (factor_number_of(number, out factors) < 500);

    // 把算出來的答案印出來
    stdout.printf("Answer: %d\n", number);

    // 將答案驗算一遍
    print_factors(factors);
}

void print_factors(HashTable<string, int*> factors)
{
    int number = 1;

    List<unowned string> keys = factors.get_keys();
    // 把質因數表的鍵值依照數值大小重新排序
    keys.sort( (a, b) => {
        int num1 = int.parse(a);
        int num2 = int.parse(b);
        if (num1 < num2 ) {
            return -1;
        }
        else if (num1 > num2) {
            return 1;
        }
        else {
            return 0;
        }
    });

    // 驗算過程
    foreach (unowned string key in keys) {
        int* count = (int*) factors.lookup(key);
        int prime = int.parse(key);
        if (*count > 1) {
            stdout.printf("%d^%d*", prime, *count);
        }
        else {
            stdout.printf("%d*", prime);
        }
        // 重覆乘上質因數出現的次數
        for (int i = 0; i < *count; i++) {
            number = number * prime;
        }
        free(count);
    }

    stdout.printf("\b=%d\n", number);
}

// 三角數的計算
int triangle_number(int num)
{
    return num * (num + 1) / 2;
}

// 找出某數值的質因數分解
int factor_number_of(int number, out HashTable<string, int*> table)
{
    table = new HashTable<string, int*>(str_hash, str_equal);
    do {
        // 找出該數值的平方根
        int root = sqrt_floor_of(number);
        int previous = number;

        // 從小到大用質因數去整除直到超過平方根
        for (int i = 0; prime_number_of(i) <= root; i++) {
            int prime = prime_number_of(i);
            if (number % prime == 0) {
                // 遞增質因數表的數值
                int* count = (int*) table.lookup(prime.to_string()) ?? malloc0(sizeof(int));
                *count = *count + 1;
                table.replace(prime.to_string(), count);
                number = number / prime;
                break;
            }
        }

        // 如果 number 沒有變動過,number 就是質數。
        if (number == previous) {
            // 遞增質因數表的數值
            int* count = (int*) table.lookup(number.to_string()) ?? malloc0(sizeof(int));
            *count = *count + 1;
            table.replace(number.to_string(), count);
            break;
        }
    } while (number != 1);

    int result = 1;

    // 計算所有因數的個數
    foreach (int* count in table.get_values()) {
        result = result * (*count + 1);
    }

    return result;
}

// 計算平方根
int sqrt_floor_of(int num)
{
    return (int) Math.sqrt((double) num);
}

// 準備一個用來 cache 計算過的質數表
static List<int> prime_table = new List<int>();

// 質數計算
int prime_number_of(uint index)
{
    if (index < prime_table.length()) {
        // 直接從 cache 中取出
        return prime_table.nth_data(index);
    }

    // 第一個質數為 2
    if (index == 0) {
        prime_table.append(2);
        return 2;
    }
    // 第二個質數為 3
    else if (index == 1) {
        prime_table.append(3);
        return 3;
    }
    // 第三個後的質數計算
    else {
        int candidate = prime_table.nth_data(prime_table.length() - 1) + 2;
        do {
            bool is_prime = true;
            foreach (int number in prime_table) {
                if (candidate % number == 0) {
                    is_prime = false;
                    break;
                }
            }
            if (is_prime) {
                prime_table.append(candidate);
                return candidate;
            }
            candidate = candidate + 2;
        } while (true);
    }
}
將以上程式碼儲存成 p12.vala 或是直接從 gist: 1182715 下載 然後編譯執行
$ valac p12.vala -X -lm && ./p12
Answer: 76576500
2^2*3^2*5^3*7*11*13*17=76576500

2011年7月24日 星期日

關於 uptime 的一些小事

在 GNU/Linux 系統底下如果想要知道電腦開機後使用了多久的時間,可以直接打指令:
$ uptime
 22:35:06 up  6:26,  4 users,  load average: 0.00, 0.03, 0.05
或是利用 /proc/uptime 來取得資料:
$ cat /proc/uptime 
23282.04 41316.79
但是如果想要寫 C 程式來取得資料呢?
我找到一個在 <time.h> 裡面的函式 clock_gettime()
程式碼如下:
#include <stdio.h>
#include <time.h>

int main(int argc, char* argv[])
{
    struct timespec ts;
    if (clock_gettime(CLOCK_MONOTONIC, &ts) == 0) {
        printf("%ld.%ld\n", ts.tv_sec, ts.tv_nsec);
    }
    return 0;                                      
}
在編譯的時候要加上 -lrt 才能通過編譯
$ gcc -Wall -g -lrt uptime.c -o uptime
執行的結果
$ ./uptime 
23637.821285555
因為我想要在 XWindow 底下根據當下的開機時間,製造出新的 XKeyEvent 出來,而所有的 XEvent 都是使用毫秒的時間格式 (ex. 23637821),所以才去找出這個的函式來用。
詳細的使用說明可以看 manpage
$ man clock_gettime

2011年7月12日 星期二

使用 pbuilder-dist/cowbuilder-dist 協助編譯及打包 Debian package

在 Debian/Ubuntu 上面寫好程式並且打包成 Debian source package 之後,可以藉由 Launchpad 上的 PPA 服務來編譯打包成 Debian binary package 給 Ubuntu 的使用者使用,但是在 Debian 這邊目前還沒有像是 PPA 這樣的服務可以使用 (不過Debian 官方已經有計劃要做了),於是現在就只能使用 pbuilder/cowbuilder 這樣工具來建立一個乾境的 chroot 環境來編譯打包 Debian binary package 給 Debian 的使用者使用。

最近發現在 ubuntu-dev-tools 裡面有 pbuilder-dist/cowbuilder-dist 這樣方便的工具,可以透過幾個簡單的指令就完成複雜的動作,雖然它的名稱叫做 ubuntu-dev-tools 其實它也是存在 Debian 官方套件庫裡面可以直接安裝來使用。

例如在 Ubuntu 11.04 (amd64) 底下想要建立 Debian 6.0 squeeze (i386) 的 chroot 環境就可以使用以下的指令:
$ pbuilder-dist stable i386 create

接下來要利用這個環境編譯 Debian 6.0 squeeze (i386) 底下使用的 pcmanx-gtk2,所以要執行以下的指令:
$ pbuilder-dist stable i386 build pcmanx-gtk2_1.0-svn577-1~squeeze1.dsc

最後就可以在 ~/pbuilder/stable-i386_result/ 底下看到編譯好的 pcmanx-gtk2_1.0-svn577-1~squeeze1_i386.deb

當然上面的 stable 在 Ubuntu 底下可以代換成 natty,maverick,lucid,... (如果是要編譯打包 Ubuntu 發行套件) 或是 testing, unstable, experimental (如果是要編譯打包 Debian 發行套件);另外就是 i386 可以代換成 amd64 如果搭配 qemubuilder 也許還可以編譯打包出 arm, mipsel, ... 其它 CPU 架構底下的套件出來使用。

此次編譯出來給 Debian 6.0 squeeze i386/amd64 使用的 pcmanx-gtk2 放在 http://archive.sylee.org/deb/ 底下。

參考文件:https://wiki.ubuntu.com/PbuilderHowto

2011年6月8日 星期三

Ubuntu 11.04 的外接顯示模式切換

在接上外接螢幕後,系統會自動切換到第一順位的狀態,也就是主要顯示為外接螢幕,而次要顯示變成筆記電腦本身的螢幕。

Ubuntu 傳統桌面
順位 主要顯示 (left) 次要顯示 (right)
1 External Laptop
2 Mirror
3 Laptop External
4 Laptop only
5 External only

在按下 WIN + P 或顯示切換的功能鍵之後,在正常的情況下,會依照 1 => 2 => 3 => 4 => 5 => 1 => ... 的順序切換顯示模式。

Unity 2D
順位 主要顯示 (left) 次要顯示 (right)
1 Laptop External
2 Mirror
3 Laptop only
4 External only

Unity 不要問,很恐怖,現在還會是當掉。

2011年4月13日 星期三

使用 Ubuntu 套件的原始碼版本管理庫

以 language-selector 為例,並且參考先前的介紹來建立 Shared repository

$ bzr init-repo language-selector
$ cd language-selector
一般來說,想要拿到 Ubuntu 上面的最新開發中的版本,可以使用:
$ bzr branch lp:ubuntu/language-selector trunk
如果想要拿到 Ubuntu maverick 上面的開發版本就應該使用:
$ bzr branch lp:ubuntu/maverick/language-selector maverick
如果想要知道目前 Ubuntu 上面有哪些官方的開發版本的話可以使用 devscripts 套件中的 rmadison 來查詢
$ rmadison language-selector
language-selector |     0.1.20 |        dapper | source, all                    
language-selector |   0.1.20.1 | dapper-updates | source, all                   
language-selector |      0.3.4 |         hardy | source, all                    
language-selector |     0.4.18 |        karmic | source, all                    
language-selector |      0.5.7 |         lucid | source, all                    
language-selector |      0.5.8 | lucid-updates | source, all                    
language-selector | 0.5.8+langfixes~lucid1 | lucid-backports | source, all      
language-selector |      0.6.6 |      maverick | source, all                    
language-selector | 0.6.6+langfixes~maverick1 | maverick-backports | source, all
language-selector |       0.31 |         natty | source, all                    
假設想要使用 maverick-backports 當中的版本就可以使用:
$ bzr branch lp:ubuntu/maverick-backports/language-selector maverick-backports

另外,除了可以使用 `bzr branch` 之外,還可以使用 `bzr checkout` 來取得原始碼。
使用 `bzr branch` 在 `bzr commit` 後,還要再使用 `bzr push` 來將變動的部份提交到遠端的 Bazaar Repository 上面;
而使用 `bzr checkout` 的話,在 `bzr commit` 的同時就會自動提交到遠端的 Bazaar Repository 上。
無論是使用 `bzr branch` 還是 `bzr checkout` 都會將完整的變動歷史資料下載到本地端,如果想要像 Subversion 那樣只會取得最新的一筆資料可以使用 `bzr checkout --lightweight` 來取得原始碼。

想要知道目前處於哪一種模式 (branch/checkout/lightweight-checkout) 可以在該目錄下面執行

$ bzr info
如果是 lightwieght checkout 的話,應該會看到 `light checkout root`
如果是 checkout 的話,應該會看到 `repository checkout root`
如果上面兩個都沒有看到的話應該就是 branch 了

最後,如果想要在 branch 與 checkout 之間切換的話,就要使用 `bzr bind/unbind`

參考資料:
http://wiki.inkscape.org/wiki/index.php/Working_with_Bazaar
https://wiki.ubuntu.com/DistributedDevelopment/Documentation/GettingTheSource

2011年3月25日 星期五

加入 GnuPG 的信任簽章進自己的金鑰圈裡

在 Debian: 17 years of Free Software,"do-ocracy", and democracy 活動當中
跟現在的 Debian 計畫主持人 Stefano Zacchiroli 交換了金鑰指紋
後來收到了 zack 寄來的信件,如果沒有弄錯,應該也是使用之前提到的 caff 來弄的
因為我的 GnuPG 金鑰上面列了六個 Email 地址,所以我也收到了六封信件裡的附加檔案

0xE9EC46F5A547F31E.1.signed-by-0xD5CA9B04F2C423BC.asc
0xE9EC46F5A547F31E.2.signed-by-0xD5CA9B04F2C423BC.asc
0xE9EC46F5A547F31E.3.signed-by-0xD5CA9B04F2C423BC.asc
0xE9EC46F5A547F31E.4.signed-by-0xD5CA9B04F2C423BC.asc
0xE9EC46F5A547F31E.5.signed-by-0xD5CA9B04F2C423BC.asc
0xE9EC46F5A547F31E.6.signed-by-0xD5CA9B04F2C423BC.asc
然後下載 zack 的公鑰
$ gpg --recv-keys D5CA9B04F2C423BC
接者檢查 zack 的指紋是否跟我當天跟他交換的一致
$ gpg --fingerprint D5CA9B04F2C423BC
pub   1024D/F2C423BC 2000-03-06
      金鑰指紋 = 8156 FBF9 3EC1 D872 722D  3632 D5CA 9B04 F2C4 23BC
uid                  Stefano Zacchiroli <zack@upsilon.cc>
uid                  Stefano Zacchiroli <zack@debian.org>
uid                  Stefano Zacchiroli <zack@cs.unibo.it>
uid                  Stefano Zacchiroli <zack@pps.jussieu.fr>
sub   4096g/E5B57D13 2008-07-19
確認一致後就可以將 zack 對我的信任簽章加進自己的金鑰圈裡面
$ gpg --import < 0xE9EC46F5A547F31E.1.signed-by-0xD5CA9B04F2C423BC.asc
$ gpg --import < 0xE9EC46F5A547F31E.2.signed-by-0xD5CA9B04F2C423BC.asc
$ gpg --import < 0xE9EC46F5A547F31E.3.signed-by-0xD5CA9B04F2C423BC.asc
$ gpg --import < 0xE9EC46F5A547F31E.4.signed-by-0xD5CA9B04F2C423BC.asc
$ gpg --import < 0xE9EC46F5A547F31E.5.signed-by-0xD5CA9B04F2C423BC.asc
$ gpg --import < 0xE9EC46F5A547F31E.6.signed-by-0xD5CA9B04F2C423BC.asc
然後將 zack 對我的信任簽章上傳到金鑰伺服器 (讓其它人知道我的最新狀況)
$ gpg --send-keys E9EC46F5A547F31E

另外在這次有用到指令,但不是必要的指令:

同步金鑰伺服器上的金鑰 (不然就不會知道其它人金鑰狀態的最新狀況)

$ gpg --refresh-keys
然後查看自己目前的信任圈的狀態
$ gpg --list-sigs E9EC46F5A547F31E

P.S. E9EC46F5A547F31E 是四元的金鑰指紋 D5CA9B04F2C423BC 是 zack 的金鑰指紋,使用時要自己代換成其它金鑰指紋,不可照抄執行。

參考資料:http://wiki.debian.org.tw/index.php/GnuPG

2011年3月23日 星期三

給 Ubuntu 10.04/10.10 使用的 LibreOffice PPA

LibreOffice 已經出來一段時間了~ :P

PPA 的位置在 ppa:libreoffice/ppa 可以在軟體來源的其它軟體加上
然後更新系統安裝 libreoffice 跟 libreoffice-l10n-zh-tw

或是使用終端機介面輸入
sudo add-apt-repository ppa:libreoffice/ppa
sudo apt-get update
sudo apt-get install libreoffice libreoffice-l10n-zh-tw

如果是 GNOME 使用者可以再安裝 libreoffice-gnome
sudo apt-get install libreoffice-gnome

如果是 KDE 使用者可以再安裝 libreoffice-kde
sudo apt-get install libreoffice-kde

給 Ubuntu 10.04/10.10 使用的 Firefox 5.0 PPA

Firefox 5.0 出來啦~ Ubuntu 10.04/10.10 的使用者有 PPA 可以用喔~

PPA 的位置在 ppa:mozillateam/firefox-stable 可以在軟體來源的其它軟體加上然後更新系統

或是使用終端機介面輸入
sudo add-apt-repository ppa:mozillateam/firefox-stable
sudo apt-get update && sudo apt-get upgrade

中文語言包也被 ppa:mozillateam/firefox-stable 包進去了,直接更新就可以使用了。

2011年3月21日 星期一

使用 Automake 的 silent-rules 來簡化編譯過程的輸出訊息

使用前
ubuntu@maverick:~/hello$ make
make  all-am
make[1]: Entering directory `/home/ubuntu/hello'
gcc -DHAVE_CONFIG_H -I.     -g -O2 -MT hello.o -MD -MP -MF .deps/hello.Tpo -c -o hello.o hello.c
mv -f .deps/hello.Tpo .deps/hello.Po
gcc  -g -O2   -o hello hello.o  
make[1]: Leaving directory `/home/ubuntu/hello'
使用後
ubuntu@maverick:~/hello$ make
make  all-am
make[1]: Entering directory `/home/ubuntu/hello'
  CC     hello.o
  CCLD   hello
make[1]: Leaving directory `/home/ubuntu/hello'
使用方法,修改 configure.ac 加入 silent-rules
...
AM_INIT_AUTOMAKE([silent-rules])
...
然後在編譯前的設定執行
./configure --enable-silent-rules
或是預設打開 silent-rules
...
AM_INIT_AUTOMAKE
AM_SILENT_RULES([yes])
...
P.S. 此時可以省略掉 AM_INIT_AUTOMAKE 裡面的 silent-rules 選項
參考資料 http://www.gnu.org/software/hello/manual/automake/Options.html

2011年3月18日 星期五

Debian local archives 本地端 deb 檔案庫

有時候會需要將某些特別的 Debian 套件以及其相依的 Debian 套件透過網路先行下載回來
等到之後沒有網路的狀態下再依需求來安裝那些 Debian 套件

平常在使用 apt-get/aptitude/... 來安裝 Debian 套件時
系統預設會將那些套件檔案下載放到 /var/cache/apt/archives/ 底下再來安裝
但是也可以只下載但是不安裝,像是
# apt-get install -d eclipse
就可以將安裝 eclipse 所需要的套件先下載回來

然候可以用下面的指令製作一個 local archive
# mkdir -p /some/where/out/there
# mv /var/cache/apt/archives/*.deb /some/where/out/there
# cd /some/where/out/there
# apt-ftparchive packages . | gzip -n9 > Packages.gz

如果要使用這個 local archive 就可以將 /etc/apt/sources.list 改成
(其它來源先註解起來或是更改原本的檔案名稱)
deb file:///some/where/out/there /

然後之後等到沒有網路的時候,就可以用 apt-get update && apt-get install eclipse 來安裝了。

又或者在有區域網路的情況下,使用下面的指令分享給區域網路內的其它人使用
$ cd /some/where/out/there
$ python -m SimpleHTTPServer

只不過 /etc/apt/sources.list 的內容應該要換成類似下面這樣的內容
deb http://192.168.1.1:8000 /

2011年2月11日 星期五

$4 的 Debian 6.0 自動化安裝

製作可開機安裝 Debian 6.0 的 USB Stick

首先去下載 debian-6.0.9-i386-businesscard.iso (46M) 回來
然後再準備一個 USB Stick 接上電腦,如果 mount 在 Linux 系統上的話記得先 umount 掉
以 root 權限執行 (這裡假設 USB Stick 的 Device Node 位於 /dev/sdc)
# cat debian-6.0.9-i386-businesscard.iso > /dev/sdc
這樣就可以製作出可開機安裝 Debian 6.0 的 USB Stick 沒錯就是這樣製作的
這是 Debian 6.0 以後的新功能 hybrid CD/DVD image 不過只有在 i386/amd64 上面有作用

準備好要安裝的電腦跟可以透過有線網路 DHCP 上網的網路環境

現在這隻 USB Stick 可以接上任何可以使用 USB Stick 開機的電腦上開機就會看到:
Select Help

進去之後
Inside Help

輸入
auto url=fd.idv.tw
auto url=fd.idv.tw

然後就是等 Debian 6.0 自動安裝完就會自動關機,這樣就把 Debian 6.0 安裝好了。

接下來是開機展示

GRUB 的畫面 GRUB

開機動畫 plymouth

進入 GDM 了 GDM

輸入預設的密碼
debian
Login

進入安裝好的 GNOME 桌面環境 GNOME"/

關機時也會有關機動畫 poweroff

這個環境是按照 $4 個人的喜好所打造的,所以不一定會符合所有人的使用習慣,
像是 $4 喜歡使用酷音裡面的單純注音模式,不喜歡有 3D 桌面效果,
中文字型喜歡用 AR PL UMing 字型,英文喜歡使用 Droid 字型,
網頁瀏覽器喜歡用 Google Chrome,並且加入了 http://mozilla.debian.net/ 上面的 Iceweasel(Firefox)。

想要打造自己的 Debian 6.0 自動化安裝可以參考官方文件 Appendix B. Automating the installation using preseeding

而 $4 製作的腳本都放在 http://fd.idv.tw/d-i/

另外弄了一個半自動的安裝,讓使用者可以自己決定帳號密碼跟分割磁區。
auto url=http://fd.idv.tw/d-i/squeeze/manual.cfg

2011年2月5日 星期六

Taiwan Radio Tuner v0.9 釋出

Taiwan Radio Tuner 是一個 Google Chrome Extension 的網路廣播選台器
v0.9 Upgrade jQuery to 1.5 and add ending timer.

線上版在 http://fd.idv.tw/radio/ 特色是跨平台 Windows / Mac / Linux
支援主流的網頁瀏灠器 IE / Firefox / Safari / Google Chrome / Opera

2011年1月31日 星期一

Debian Package - 什麼是 Debian Native Package?

要怎麼去辨別一個 Debian 套件是否為一個 Debian native package 呢?

最簡單方法就是判斷有沒有 (5) - 版本號碼 當中提到的 debian_version
[epoch:]upstream_version[-debian_revision]
如果 Debian 套件的版號沒有看到 debian_version 的部份,那麼它就是一個 Debian native package

那麼接下來問題應該是...

怎樣的套件才可以成為一個 Debian native package?

其實就是該套件只為了 Debian 系統而製作的。
在終端機下輸入以下指令
$ dpkg-query -W | awk '{ if ($2 !~ /-/) print $0; }'
就可以看到系統上目前裝了哪些 Debian native package

舉個例子
Package: cdbs
...
Version: 0.4.62+nmu1ubuntu9
...
Description: common build system for Debian packages
 This package contains the Common Debian Build System, an abstract
 build system based on Makefile inheritance which is completely
 extensible and overridable.  In other words, CDBS provides a sane set
 of default rules upon which packages can build; any or all rules may
 be overridden as needed.
...

這個 Debian 套件就是用來製作 Debian 套件的工具之一,所以它只能使用在 Debian 系統上面,像這樣的套件就一定是 Debian native package

相反的,如果你所製作的 Debian 套件並不限於只使用在 Debian 系統上面的話,請不要用 Debian native package 的版號命名規則,也就是不要省略掉 debian_version,如果想要上傳套件至 Debian 官方套件庫裡面,這點一定要注意一下。

另外如果你就是上游的軟體開發者,即使軟體本身在製作時就已經順便做好 Debian 套件的相關工作,也不要在釋出 source code tar ball 裡面包含 debian 這個目錄。

一個好用的 irssi plugin - irssi-libnotify

irssi 是一個在終端機文字模式下面連 IRC 的工具
通常 irssi 的使用方式是搭配 screen 或是 tmux
然後找一台一直開著 BSD/Linux 主機在上面掛著
不過也有的人用久了即使是在本機上面使用也是開 irssi
然後就會開始想著有沒有辦法在別人丟你訊息的時候能夠在桌面上跳出通知
irssi-libnotify 就是這樣的工具
在 GNU/Linux 上面使用要另外搭配 notify-send 這個指令
如果使在 Ubuntu 上面就是直接安裝 libnotify-bin 這個套件

首先把 notify.pl 裝進 .irssi/scripts/ 底下
$ mkdir -p ~/.irssi/scripts/
$ wget http://irssi-libnotify.googlecode.com/svn/trunk/notify.pl -O ~/.irssi/scripts/notify.pl

使用方法是在 irssi 啟動後輸入
/load perl
/script load notify

這樣之後當別人丟訊息的時候就會收到桌面通知了~ :)

P.S. 目前有中文亂碼的問題

2011年1月5日 星期三

BetaRadio v1.2 釋出

功能跟 v1.1 一樣沒有改變,不過程式碼完全使用 Vala 重寫一遍。
原始碼下載:http://betaradio.googlecode.com/files/betaradio-1.2.tar.bz2
編譯方法請參考 http://code.google.com/p/betaradio/wiki/InstallationFromSourceCode

PPA for Ubuntu 9.10/10.04/10.10
$ sudo add-apt-repository ppa:fourdollars/betaradio
$ sudo apt-get update
$ sudo apt-get install betaradio