星期四, 8月 27, 2009

Audio CD

今天同學請我燒個音樂CD,當然二話不說直接開了gnomebaker (我也只會用這個 :p) 選一選 mp3 ,燒好了以後想說來聽看看到底有沒有成功。結果我嘗試把它mount 起來,發現不能mount,一急之下想說燒壞了,就又燒了一張,發現還是一樣。最後喪氣的 google 了一下才發現... 原來 audio cd 根本就沒有 file system !! 難怪 mount 不起來,後來把cd 放進去直接用mplayer 播放就可以了。

不過, mplayer 似乎在播放cd 的時候沒有buffer 或是 buffer 太小,會導致跳針的現象很嚴重,只要加上 -cache 的選項設定大一點點的buffer 就可以了:
mplayer cdda:// -cache 5000
真是學了一課阿 XD

星期一, 8月 17, 2009

vim: text-object

這幾天去 COSCUP 聽到蠻多有趣的東西,身為一個 vim, perl 狂熱者當然是要聽聽 c9s 的演講。雖說我從高中就開始用 vim 到現在少說也用了4~5 年,可是還是有很多好玩未發覺的功能阿!

--正題--
vim 將每個段落,或是block, word 分成一個個 "text object" 可以說就像是 HTML 裡面分成一層層的 tags 一樣,並且設計了描述方法針對某種 text object 做出動作。

我想,用了vim 一段時間的人都知道 'c' 很好用,直接替換文字而不用刪掉以後再進入 insert mode,c 搭配 text-object 的方法就像這樣:

ciw: 更換一整個 word, 跟 cw 不同的是,他會把目前游標在的整個 word 換掉而不是word 在游標以後的部分,可以說有點像是 b cw 的組合。

cib: 更換一個 block (由小括號括起來的)
ciB: 更換一個 Block (由大括號包起來的)

中間那個 i 代表的是 inner ,另外可以用的modifier 是 'a' (代表 一個),對於不同的 text-object 這兩種的分別不太一樣,不過大致上差別在於包覆 text-object 的 delimiter 是否一起被選取到。
例如 cab 的話會把括號也一起換掉,而 cib 只換括號裡面的東西。

敘述有點亂,如果要瞭解更多可以參考 vim 的 document

星期日, 8月 09, 2009

perl xsub compiling warning: unused variable 'items'

在compile xsub 的時候,perl 會自動生成 bootstrap function, 執行時透過呼叫這個bootstrap 把其他 subroutine 生出來. 但是由於 perl 的機制,會在產生出來的bootstrap 裡面加上 item 這個變數卻又不用他,當開發時打開 -Wall 就會覺得很惱人。上網找了一下,在 DBI 的原始碼裡面看到了用這樣的方法:

BOOT:
items = items; /* avoid 'unused variable' warning */

只要在 .xs 裡面加入這兩行,在xsubpp 轉換出來的 bootstrap 裡面就會有 items = items; 的 statement,compile 以後也就不會有 warning 了。

星期二, 8月 04, 2009

readline callback, key binding bug

今天發現readline 的bug, 是因為在 vi-mode (callback) 我不管怎麼 bind pageup/down (\e[5~, \e[6) 都不成功,trace 了一下,發現是 _rl_dispatch_callback 裡面有個 bug (應該是bug .. :p)

readline 的 callback 為了要避免block,可是又要能夠吃 key sequence 的 binding ,所以設計了一個類似 stack 的結構,模仿一個 non-blocking 的 recursive call.

裡面一樣是呼叫 _rl_dispatch_keyseq 但因為有設定 RL_STATE_CALLBACK,做完一次的 dispatch 就會直接回傳,等下一次 rl_callback_read_key() 被呼叫才會再來 dispatch。 這時候 _rl_dispaych_keyseq 的回傳值有4 種 -3 ~ 0 分別是指下面這幾種意思:

0: 成功 match 到 key sequence
-1: key 沒有match, 所以最後一個之前有match 到的 keyseq 會被執行
-2: match, 但是是 keymap 裡的 ANYOTHERKEY, 也就是說大概還有同個長度的keyseq 存在,不過總而言之就是有match 到
-3: 「還」沒有match,還要看後續讀入的key

bug 是在,當回傳是 -3 的時候,readline 會看上上一個有沒有被 match (當輸入到 \e[6 的時候,會看 \e 有沒有match),為什麼會這樣設計我不清楚,不過bug 就在這邊了。解法呢.. 很簡單,只要在 r == -3 的時候跳過 _rl_keyseq_result 的檢查就行了。下面附上非長短的 patch,手動改就可以了 :p

http://moon.cse.yzu.edu.tw/~s961449/readline-callback.patch

使用方法:
到readline 的 source directory 裡面, 用patch
cd readline-6.0 && wget http://moon.cse.yzu.edu.tw/~s961449/readline-callback.patch && patch -p1 < readline-callback.patch


寫的好亂 XDDD

星期一, 8月 03, 2009

custom keymap in readline

readline 的功能強大,也包括了很好用的 vi mode ,在 .inputrc 裡面就可以設定,不過這是使用者自己的設定,若程式想要直接指定,那就要設定 keymap 了。
我翻了一下 readline 的 原始碼,發現使用者若是設定了 vi mode (set editing-mode vi) 那麼程式自訂的 keymap 會失效,不知道這算不算 bug,因為在初始化的時候會看如果有設定 vi-mode 就會把keymap 覆蓋掉變成 vi_insertion_keymap。
所以要嘛就把所有的設定全部綁在 vi_insertion_keymap, vi_movement_keymap 上面,不然就是設定 rl_pre_input_hook 在使用者之前再把自訂 keymap 加載上去。我是選擇後者.. 實作起來大概就是這樣:
int reset_keymap()
{
  rl_set_keymap(custom_keymap);
}
rl_pre_input_hook = reset_keymap;
這樣應該就能保證不管使用者的設定如何都能夠套用自己的keymap 才對。

星期日, 8月 02, 2009

Debian netinst on AOD250

最近買了台Acer 的 Aspire One D250,入手第一件事當然很急著想換成 Ubuntu/Debian,斟酌之下,決定使用 Debian,於是下載了lenny 的 netinst cd 裝到隨身碟來,開了機正要安裝的時候居然發現 lenny 的 kernel 不支援我的 ethernet card (AR8132),於是只好自己抓AR8132 的 nic driver 來給installer 用。

[459]AR813X-linux-v1.0.0.9.tar.gz 抓下來以後解開, 在我的 VM (Lenny) 下 compile:
sudo apt-get install linux-headers-2.6.26-2-486
mkdir AR813X && mv '[459]AR813X-linux-v1.0.0.9.tar.gz' AR813X/ && cd AR813X
tar xvf '[459]AR813X-linux-v1.0.0.9.tar.gz'
cd src
BUILD_KERNEL='2.6.26-2-486' make
把目錄下產生的 atl1e.ko 複製到 usb 上,在 iso detect 的步驟做完以後(或是自己把usb mount 上以後),切到別的 tty 把 atl1e 加載到kernel 就可以了:
insmod atl1e.ko
接下來就可以順利安裝了(吧,至少可以用LAN 了,不然怎麼netinst)
---------------------------
不過呢.. 遺憾的是,我最後並沒有裝 Debian ... 為了這個 nic driver 我搞了好久才知道要這樣 compile (還是有高人指點我才會的,不然我到現在可能還在重編debian installer) 弄好以後已經好晚了,睡前我在想這樣到底是幹嘛,小筆電真的有需要灌 Linux 嗎?雖然我用Linux 當桌機好幾年了,我也認為這樣很美好,但是我目前實在想不出來NB 要裝 Linux 的理由。所以最後我還是沒有裝,搞不好我以後會改變心意 :p

ubuntu minimal

Ubuntu Minimal, 今天在網路上突然瞄到,我也算是個 Ubuntu 的愛好者,但近年來覺得Ubuntu 裡面真的有不少雜物,看了一下 Ubuntu Minimal 的一些教學,覺得大概跟 debian netinst 差不多吧,至少不會有雜七雜八的一堆東西(猜). 所以就抓來玩了,CD image 很小,x86 的才 9.9MB.

大致上也跟 debian netinst 很像,只不過我看了一下光碟的內容,似乎是沒有任何的 package 可以用,也難怪會這麼小,但這樣好像也沒辦法用 ppp 的方式來安裝了,不然就是要另外把套件塞進去,不過這樣好麻煩 :( ,那不如裝 ubuntu server !? 。(debian netinst 的話只要在boot line 加上 modules=ppp-udeb 就可以了)