星期日, 8月 02, 2009

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 就可以了)

星期三, 7月 29, 2009

Reverse Regular Expression

我一直都是 Perl 的愛好者,雖然,說實在,我寫perl 的"功力"不怎麼樣,不過 perl 給我寫程式的生涯添了不少色彩,立了不少待征的高山。每次寫perl 都有新的體悟,這也是讓我很喜歡它的原因。

今天因為需要,在找有沒有 regexp 可以從後面開始找第一個 match,換句話說,就是找到最後一個match。於是我 google 到了這篇 Reversing Regular Expressions 剛進去就發現好像是我以前瞄過的文章,今天好好的看一次,發現是很有趣的思維。

所謂的 Reverse Regexp 就是:
1. reverse string input
2. reverse regexp
3. reverse match
reverse 的代價遠比把整個字串都比對完小多了,如此一來對於"找到最後一個xxx" 的問題就有了快速又方便的解法。唯一的缺點就是你要把 regexp 倒過來寫,不過這通常不是什麼難事,或者說.. 對於喜歡寫 perl 的人來說件很有趣的事情。
---------------
下面又提到 variable length 的 zero-width look ahead assertion 實作方法,也是很好玩。

還是要說一句 I love PERL !!


延伸閱讀:
http://japhy.perlmonk.org/sexeger/sexeger.html

Readline & network programming

GNU Readline Library 真的是很不錯的一個東西,對於要做 console interface 的人來說可以說是福音吧!很多shell 也都是用readline 的。
Readline 主要是提供了一些輸入上與使用者的互動,包括一些常用(emacs)的編輯指令,也有我很喜歡的vi mode :p . 想要做到與shell 一樣強大的輸入介面,用readline 就對了!

最近在寫個網路應用程式需要用到 Readline,可是我們寫網路應用程式最討厭的就是會 block,當呼叫 readline 的時候因為他需要分開處理每個 key,並表現在 buffer 中,才能達成一些編輯的功能,當然 readline 也提供在需要 non-blocking IO 的環境使用的方法,配合 select,可以使用它的 Alternate Interface 也就是下面這幾個 function:
void rl_callback_handler_install (const char *prompt, rl_vcpfunc_t *lhandler)
void rl_callback_read_char (void)
void rl_callback_handler_remove (void)
使用方法還蠻簡單的,install 一個在輸入完成(return) 以後會執行的 handler 以後,使用在 select 裡,當 stdin 是active (readline 在 initialize 的時候就已經把stdin 設成 raw 了) 的時候 read_char,結束以後 remove handler 就可以了。

========= update 3 Aug ========
值得注意的是,bind key 似乎要在 rl_callback_handler_install 之前先做,或是bind 完要重新remove&install 一次,不然有些key binding 的時候一些Meta key 會讀不到.

星期四, 6月 18, 2009

xmonad 初體驗

最近awesome 這個window manager 很紅,學長很多都跳槽去玩。聽了學長大力推薦我也想說來試看看,可是Hardy 上的版本只有2.0 ,玩不到最新的就不好玩了!!所以只好自己來compile,但awesome 牽涉XCB,XCB 在系統上又很多應用,compile 以後發現不得了,影響太大,只好暫時放棄awesome,反正我的fluxbox 其實也很好用。

不過又聽到另一位玩haskell 的大大說 xmonad 也不錯,大致看了一下official site 發現同樣是tiling WM 可是config & extension 是用 haskell,想說那不如來試看看順便學一學haskell,於是就裝了 !
-------------

xmonad 本身就是用 haskell 寫的,根據我的瞭解,xmonad 在開始執行前還會先把你的config file (also haskell) compile 起來,也就是說你的config 會變成xmonad 程式碼的一部份,還蠻有趣的,其他C/C++ 的WM 大概很難做到這樣吧。

一些default 的 key binding 其實很夠用了,而且還有預設 dmenu 的快捷鍵 (Mod-p) 也就能應付所有程式了。 不過 panel 的設定讓我這個初學者實在弄了有點久,相對於awesome 一裝好就有的 panel 跟 trayer 比起來有點不太親切,但是因為 config 是直接compile 嵌進去的,所以還算靈活,在內部把panel info pipe 出來也不是什麼難事,這點讓我很喜歡。有時間再分享一下我的設定檔。

星期四, 6月 11, 2009

vim: diff between buffer and original file

上次看到學長用Emacs 可以把修改過的buffer 跟原檔案在編輯器裡面做diff,我就想vim 應該也可以。試了一下後來就成功了:
轉自: Vim Wiki
這個是我修改過的版本,做了toggle 的功能, map 到 \d (我的mapleader = \)
function! s:DiffWithSaved()
if exists("b:diffbuf")
unlet b:diffbuf
bdelete diffbuf
diffoff
else
let filetype=&ft
diffthis
vnew diffbuf| r # | normal! | ggdd
diffthis
exe "setlocal bt=nofile bh=wipe ro noswf ft=" . filetype
let b:diffbuf = 1
endif
endfunction
com! TDiffSaved call s:DiffWithSaved()
nmap <leader>d :TDiffSaved<CR>

-----------------------
另外我也在 vim online 找到一個 gitdiff.vim 用git 的時候也可以做出跟上面這樣一樣的效果,不過比對的對象是git repo 裡面的。而上面這個方法比對的對象是上一次存檔後的檔案跟現在的buffer