2009年12月31日 星期四

新化鎮的極限運動場



討論串


看起來相當不錯呀!

2009年12月29日 星期二

Pango Font Metrics (Text Extents)

Pango 裡頭的 text_extents 意義與 Cairo 的 text_extents 不太一樣。在 Pango 裡頭取得的 text extents 會有 ink 以及 logical 兩種, ink 是指包含文字的最小範圍,logical 則是整個文字 (由 baseline 往上到該 font 的 ascent 以及往下到該 font 的 descent 的範圍)

因此可以先取得 baseline ,接著由 logical 或 ink 換算出不一樣的 ascent 與 descent 。

範例如下:


繪製成圖就很容易理解了:


VIM - jslint.vim

jslint 是一檢驗 Javascript Code 的工具。 jslint.vim 則可整理 jslint 輸出的 error message 至 quickfix window.

專案頁面於 github: http://github.com/hallettj/jslint.vim

plugin 安裝之後直接呼叫 :JSLint 命令即可。

需要修正的地方會被自動標記成紅色。

可利用 Leader 加上 mapping 方便呼叫:

2009年12月28日 星期一

2009年12月23日 星期三

Vim - Trim space

To trim space on current line or multiline:

I like command name in lower case so i added the 'cabbr'.

Basically you can select a visual block and type ":TrimSpace" , then the tailing spaces will be trimmed.

2009年12月21日 星期一

基本 gvim 設定

從 .gvimrc 內抽了 common 的部份出來,如果你和我一樣喜歡簡潔的畫面,可以將以下設定放置到 ~/.gvimrc 內。


基本上上面這些設定會把工具列拿掉,使用文字模式的 tabbar ,捲軸 (scrollbar) 也會拿掉,Dialog 會改用 prompt 的方式等等。

2009年12月15日 星期二

調整 Keyboard Repeat Speed

由於在 Vim 以及 gVim 內我非常需要 Keyboard Repeat Speed 可以比內建值再更快一點,所以我做了一下設定,Alias 是這樣,方便以後調整:

alias config_macos='open ~/Library/Preferences/.GlobalPreferences.plist'

主要調整 InitKeyboardRepeat 到 6-8 ,KeyboardRepeat 到 2 即可。

存檔之後即可見效。


2009年12月14日 星期一

Vimana (中文)

Vimana 現在支援了 Makefile 以及 Rakefile 的安裝,您只需要在 Makefile 或 Rakefile 內提供 install 的規則 (Rule) 即可。 大部分在 github 上的 vim script 專案都提供了 Rakefile 或是 Makefile 所以都可以輕易的安裝好。

如果未提供 Makefile 或是 Rakefile ,那麼也可以使用 Vim Meta file 來做安裝。再不然可幫你偵測目錄結構,若是符合 Vim Runtime Path 的結構,那麼安裝就可成功。

另外花了一些時間將相依的模組減少,讓相依性模組的安裝不會如此痛苦。

我也新增了針對 vim.org 提供的類型資訊的 leak 可以剖析 script 內容來了解 script 類型,目前支援 colorscheme , compiler, indent , syntax 等等的類型偵測。

測試過的套件如下:

$ vimana install the-nerd-tree
$ vimana install autocomplpop
$ vimaan install gsession.vim
$ vimana install snipmate
$ vimana i svg.vim
$ vimana i railscasts-theme
$ vimana i dark-ruby
$ vimana i bufexplorer.zip
$ vimana i xml.vim

well, i still need more test cases. ;-)

Vimana

Vimana supports for Makefile and Rakefile now. most vim script projects on github have its own rakefile or makefile, so that if a archive file (tar, tar.gz, zip) contains a makefile, rakefile or vim meta file. Vimana would use makefile/rakefile or meta file as its installer strategy.

and I tried to reduce some dependencies, so that installation won't be such pain.

I also added script inspecting feature, which inspects the script code to decide where to installer. colorscheme, compiler ,indent types are supported.

current tested cases:

$ vimana install the-nerd-tree
$ vimana install autocomplpop
$ vimaan install gsession.vim
$ vimana install snipmate
$ vimana i svg.vim
$ vimana i railscasts-theme
$ vimana i dark-ruby
$ vimana i bufexplorer.zip
$ vimana i xml.vim

well, i still need more test cases. ;-)

Vim 自動補齊

本期的 Vim 探討自動補齊的實做方法,請參見 OSSF :

http://www.openfoundry.org/index.php?option=com_content&Itemid=334&id=2215&lang=en&task=view

2009年12月8日 星期二

gsession.vim - Session Plugin

用來用去覺得現有的 session plugin 很不好用,所以自己又寫了一個,不是說在重造輪子,只是多元化的選擇是時代的潮流 (rock): XD

http://github.com/c9s/gsession.vim

2009年12月3日 星期四

一些關於 IE 的感想。

本來是寫在

『事實上 IE 的 Javascript Engine 會擅自替你做修正^h錯,所以最好不要在語法上做太挑逗的變化,IE 會受不了。還有關鍵字是 IE 相當敏感的部位。』

『請不要亂換行。』

『該自動修正的地方不修正,專修不該修正的地方是怎樣。不然就是 IE 的 Javascript Parser 太爛!』

『就像 return 後面如果要回傳東西,那麼就不該在 return 後換行才寫參數。否則你會拿到 undef。』

『Function call 的圓括號也請不要亂換行,IE 會自動幫你加上 Semicolon』

『Actually , semicolon 最好不要省略,這個和 performance 也有關係。』

『 我不覺得 IE 擴充性好。事實上他的效能是最差的,介面不友善,功能又少,JS 引擎爛到爆炸,DOM 又不照規則來!我想打爆他的頭!!!!!!!!』

還有,網頁設計師真的需要讀 『Javascript: The Good Parts』

只是我真的很討厭被強暴的部份,不說了,不然又扯到政治。....

最後:

2009年11月29日 星期日

Twitter Stream

最近幾個月 Perl 社群最流行的就是 AnyEvent 的相關應用,Twitter 也不例外,利用這個 Net::Twitter::Stream 模組,可以即時取得最新的 Tweets,你可以設定你想要過濾的關鍵字,以下是範例:


想玩的人可以直接 copy 下來把 $user 以及 $pass 改掉就可以用了。 :P Perl 真的相當適合懶人呀,由此可知我就是個懶人。

2009年11月28日 星期六

VIM is not ...

很多人都問我說 vim 裡頭為什麼不能在 tab or buffer 裡面開一個 shell ... here is the answer:



也就是說,Vim 不是一個作業系統也不是一個 Shell,跑一個 shell 在編輯器裡面會是有點詭異的。他不會像 Emacs 那樣試著把所有東西納入進來,譬如說讓你收信、玩遊戲或什麼之類的。

當然你想要在 Tab 或是 Buffer 開一個 shell 也是可以的。內建的 shell 透過 :sh 命令可以開啟一個很簡陋的 shell 在 vim 裡頭。若要在 buffer 或 tabpage 可使用其他 plugin 來達到,譬如說 : shell.vim , shellinsidevim.vim.

使用 Git 管理自己的 dotfiles

什麼是 dotfile 呢?dotfile 就是你的那些 dot 開頭的檔案,譬如說 `.vim` `.vimrc` `.emacs.d` `.bashrc`

其實作法很簡單,先建立一個資料夾,初始化 Git repository,建立一個 Makefile 來自動產生 link。


然後撰寫你的 Makefile:


記得建立 .gitignore 來忽略你不想納入版本控制的檔案: .gitignore

vim/view/

然後現在你有自己的 Git Repository ,你可以把它 push 到任何其他的 remote (參見 git help remote 命令)

到了別的機器上頭,你只需要:

git clone git@host:/path/to/repo
cd repo
make init

即可初始化完成。

所以我寫好了這樣一段的 script 來自動建置環境:

Vim: some binding

I added this:

billw.vim colorscheme (improved)



最近使用的 Vim Colorscheme: billw.vim . 做了點小修改,Folded 以及 FoldColumn 比較不會這麼魗, 放到 `~/.vim/colors/` 裡頭即可使用:

Yi - A Haskell Text Editor


這是聽 MC 說才知道的。 Yi 這個編輯器全用 Haskell 寫成,並且提供多種編輯器前端,其中包含 ( vi , vim , emacs , nano .. )。所以你的 plugin 就可以用非常 powerful 的 haskell 來寫。 :P 聽起來非常有趣。

不過編輯器究竟還是編輯器,能生東西出來最重要。

2009年11月27日 星期五

I do hate Vim script

Actually I do hate Vim script.

Vim script has annoying multi-line declaration:

so if you get a large list to write , things like this will drive you mad.

In Vim script, we can't call another autoload function from the other. and object inheritance is using copy() function to copy another object.

and everyone is writing its own window manager code and helper functions in their plugins , it's totally redundant.

and why we should write capitalized function name ??!! why command name should start with an uppercase letter ?!

zsh prompt 加上 git branch

總之,我加上了幾行像這樣的東西:

2009年11月26日 星期四

perl-completion.vim now supports simple context completion.

Perl completion vim plugin now supports simple context completion. you can now declare a object variable that simply returned from a 'new' constructor of class.

It can't work out for variables that have the same name. it's not very smart but enough for scripting.

I think "Padre" has some good stuff i could borrow from.

2009年11月25日 星期三

Using Shipwright to build VIM::Packager bundle package

Shipwright is a good utility for solving CPAN dependency problem (not hell anymore) . all dependencies could be bundled together.

this is how i build VIM::Packager bundle package with shipwright:


so the installation of VIM::Packager bundle binary could be:

$ perl vim-packager-bundle.bin

Basically , Shipwright module creates a repository to import other cpan modules into the same space. the repository could be SVN , GIT ... etc.

At the end, we checkout the repository , and execute shipwright utility to build module installer. (vim-pacakger-bundle.bin)

2009年11月21日 星期六

Vim - fastgit.vim

最近一直在把 vimrc 整理出來,目前全都在 github.com 上面,歡迎自由取用:


剛剛整理好的是 fastgit.vim ,陸續在整理中。同時也歡迎任何的 feature request. :D

Unit Test for Vim Script

於是寫了一個 VimL 的 Unit Testing

2009年11月20日 星期五

Blogger-comment.js



記得以前寫了一隻很爛的 blogger comment toggle javascript. 因為換 template 爛掉,所以剛才花了一點時間重寫了。

直接放上 github (天阿好害羞):

http://github.com/c9s/blogger-comment.js

使用方式很簡單,只要新增一個 html/javascript widget ,然後將以下的 html 貼入即可:



# 另外要注意的是,Comment link 的 class 必需要有 ".comment-link" 才行。

Git - Alias

Git 的 Alias 非常彈性,你甚至也可以自己寫 script hook 成 git 的 sub command,我的 ~/.gitconfig 如下:



事實上我還寫了一個相當骯髒的 bash function:



懶人如我,只要確定自己修改了哪些部份,直接在 shell 底下 $ ci [commit message] 即可。(也不用加引號。)

這樣就無須另外啟動編輯器,commit 秒殺。XD

Git - 列出樹狀結構的 Log

這邊看到了這樣的一組 Alias



優點是 1. 樹狀結構,可以看到每個 commit 的 refer。 2. oneline message , 3. 豐富的色彩 4. commit id 以及時間。

借用一下人家的 screenshot:

2009年11月19日 星期四

VIM::Packager 使用

Vim script 有時候是非常煩人的東西,因為你每次都需要把他們一一複製到你的 VIM Runtime Path 裡頭 (通常為 `~/.vim`):

所以假設現在要安裝 cpan.vim 這個套件,那麼就得這樣做:

# go to libperl.vim page , download the libperl.vim file
# copy libperl.vim to ~/.vim/autoload/

# go to search-window.vim page , download the search-window.vim file
# copy search-window.vim to ~/.vim/autoload/

# download cpan.vim
# copy cpan.vim to ~/.vim/plugin/

# config .vimrc to usage cpan.vim

以上這些都還不是小問題,問題是 vim script 裡頭並不是每個檔案都標記了版本資訊,所以有時候換上了新版的 plugin ,可能導致其他東西爛掉。

另外一種方式是 Vimball , Vimball 的方式相當好,但是並不是每個寫 plugin 的人都懂得如何使用 vimball , 再者 vim.org 並不規定你一定要用 vimball 才可以上傳,而且 Vimball 還是有他侷限的地方。

VIM::Packager 就是幫你做這樣的事情,安裝 cpan.vim 可以相當容易:

$ cd cpan.vim
$ vim-packager build # 讀取 META 檔案 (包含 相依性資訊、套件名稱、版本、Vim 相容版本 ... etc ) 接著產生 Makefile
$ make install # 為你安裝所需要的相依套件,並建立紀錄

若要移除:

$ make uninstall

使用 VIM::Packager 建立 Plugin


步驟相當簡單,先建立作者資訊

$ cat > ~/.vim-author
author: Cornelius
email: cornelius.howl@DELETE.ME.gmail.com
^D

$ mkdir your-plugin.vim
$ cd your-plugin.vim
$ vim-packager init # 這樣會為你產生 META 檔案、以及建立所需要的資料夾,並且利用範本為你建立文件

$ vim META # 編輯套件資訊 (你還可以在 META 裡面加上 =script_id ,script id 對應此套件在 vim.org 的 id ,每當要釋出新版,便可以直接上傳 )

META file 的格式相當簡單,請看:


接著只需要再加上 plugin 的版本資訊即可:

$ vim vimlib/plugin/your-plugin.vim # 加上 『 " Version: 0.1 』 版本資訊
$ vim-packager build # 便會產生 Makefile

$ make dist # 幫你用 tar 打包起來

$ make bump # 提昇版本

$ make upload # 自動上傳到 vim.org

以上三個動作現在可以直接用 $ make release 串起來,也就是:

$ make release # tar 打包、提昇版本、自動上傳一次做到好。


當你在開發的時候,你也可以不需要安裝,可以利用 ln 來幫你直接連結到正在開發的檔案:

$ make link

或是

$ make link-force # 強制連結

Migrating svn repository to git

要將一個標準的 subversion repository (含有 trunk/ , branches/ , tags/ ) 轉移至 Git 其實相當容易。

$ git svn clone --prefix=svn/ --stdlayout http://example.com/svn

這樣 git 會自動將這些 Mirror 下來。

不過 git-svn 不會幫你處理 merge 的相關資訊,所以這個部份需要自己手動處理。若沒有讓 git 知道哪些 branch 曾經在哪些版本合併過,待你直接下 git merge [branch] 就會 conflict 到死。

假設我們有一個 subversion repository,rev1 的時候建立專案 , rev2 的時候開了一個 branch , rev3 的時候修改 branch , rev4 的時候把這個 branch 合併至 trunk。如果這些動作使用 git-svn clone 回來,那麼在 rev4 會遺失 rev3 的合併資訊只留下 rev1 為父節點的資訊。但事實上 rev4 的父節點應該是 rev3 以及 rev1 才對。

為了解決這個問題,git 的 repository 底下有一個奇妙的檔案叫做 .git/info/grafts ,這個檔案用來存放節點合併的資訊。

.git/info/grafts 的基本格式如下:

[合併版本] [合併目的] [合併來源]

假設我們剛剛的操作,有以下版本紀錄:


1 85de8c02f0b649dcdbbb0fb5045205900a28afac
2 1f47e9b22c0b4967a9338fd32ebbe745d769f0bc
3 f0bbdbf01a46f4bb0f79f330a7603ad1aca3bd40
4 1a0a6e58a2f6905b2165f6bad973b4c85356e100

那麼在 graft 底下可以這樣寫:
1a0a6e58a2f6905b2165f6bad973b4c85356e100   85de8c02f0b649dcdbbb0fb5045205900a28afac  f0bbdbf01a46f4bb0f79f330a7603ad1aca3bd40



這時候:

$ gitk

便可以看見合併的節點如何被相連起來

$ git merge [branch]

便不會 conflict。

VIM::Packager

VIM::Packager , 最近在寫的東西。 主要是為了彌補 Vim 本身對 script 安裝以及相依性問題的不足,另外再加上一些輔助開發的 makefile script.

可利用 $ vim-packager init 來產生 vim plugin 所需要的 skeleton ,以及 $ vim-packager build 來產生 Makefile 等等。

2009年11月18日 星期三

2009年11月14日 星期六

perl-completion



http://github.com/c9s/perl-completion.vim

which is defined with omni-completion. when filetype is perl , the completion function will be binded. this plugin completes function names for you and also base class function names.

you need to install VIM::Packager first, it solve dependencies for you. the depended scripts will be retrived from an url , which is on github.com.

remember to add path ~/.vim/bin to your $PATH env variable to make sure vimscript can find the scripts. the parsing utils will be installed in ~/.vim/bin/.

$ sudo cpan VIM::Packager

# run vim-packager to convert VIM meta file (VIMMETA)
$ vim-packager build
$ make install

just press C-x C-o after a $self-> or Package::Something-> to pop the completion menu up when you are in perl files.
and you can also integrate this to your autocomplpop plugin.

will support Moose TypeConstrant , Accessor completetion in future.

2009年11月8日 星期日

Vim User 買鍵盤,要注意的事項

Vim User 買鍵盤,除了鍵盤觸鍵、Layout 之外,一定要注意的事項:

1. ESC 好不好按:因為要從 insert mode 跳回 normal mode 這是一個非常常用的按鍵。不過如果你已經買了一個 ESC 非常小而且非常難按的鍵盤,你還是可以用 Ctrl-C 來跳回 Normal Mode. 像是中國牌子 Lenovo 的 X61 或是 X200 的 Esc 個人覺得非常不好按。

2. Shift 鍵的鍵深:如果買了一個鍵深較深的鍵盤, Shift 鍵會影響到你在下 :wq 的時後會不會變成 :Wq ( 我常常因為按太快變成這樣 ) 這樣的結果就是 Command Not Found .. 解法是自己 map 一個 command:

com! :W :wq

或者直接用 :x 也行的。

# kana 提到說其實也可以用 nnoremap ; : 解決 shift 的問題。我之前也用過一陣子,不過為了 ; : 兩個鍵調換,其實還蠻多東西要調整,會影響到其他的 map.

4. Function Key 好不好按:因為你可能會 bind 很多快速鍵到 F1-F12 上頭,如果 Function Key 也小到黏在一起,會造成你的痛苦。


Vim - mode line for todolist

有時候會想在 todolist 裡頭也能夠使用 fold 將每個 item 的 description 都 fold 起來只留下 header, 我之前寫了這樣的一小段 vim script: (至於為什麼字串要分開是因為怕讀 vimrc 的時候當成 modeline )


只要下 :Itemfy 指令,自動會將 current file 加上這行 modeline。 :-)

2009年11月7日 星期六

Firebug Command Line and Console Object

which is very useful.

http://getfirebug.com/commandline.html

http://getfirebug.com/console.html

2009年11月3日 星期二

臭阿宅根本沒有心

看到 cyberfay 大正姊的這篇 「不會等公車的阿宅」,這文章真是可愛又好笑。
而以女性的觀點來看大部分女孩子對男友的期待是:
「他要是真的有心就應該要想到啊!」
(這是我最常在女性聚會中聽到的)
女性會覺得一位男性要是真心在乎她
就自然而然會設想到這些事情
其實我反覆思索後常也覺得這些臭阿宅根本沒心
只是這顆心是綠野仙蹤裡機械人的那顆心
大部分的時候
阿宅只是不知該去往哪兒找
突然覺得,我以前好像也做過類似的事情耶,只是沒有這個那麼誇張啦。XD

不過,好像又看到了從前的我和你。

2009年11月1日 星期日

2009年10月26日 星期一

cpan.vim again

I just fixed the Autocomplop vim plugin conflicts of cpan.vim

so if you open the cpan search window , it will detect the autocomplpop plugin , if you are using autocomplpop , then cpan.vim will disable it for temporary. after window closed, it will be enabled again.

also, thanks dann for tracing the autocomplpop problem.

and I added some highlight stuff.

2009年10月24日 星期六

YAPC::Tiny 第二彈緊急開催

這次特別請到 Perl 社群中最愛橘色的 Leon Brocard 來分享,他目前也是 Perl 5.11.3 版(將於十二月釋出)的負責人。

於 10/29 星期四晚上七點,於台中中港路上的 match cafe (默契咖啡)

名額有限,報名從速喔!報名網頁: http://registrano.com/events/yapc-tiny-second

Ubuntu, UX30 and xmonad

目前 2.6.31 版本的 kernel 還不支援 UX30 的 wireless driver. RaLink RT3081
不過有看到 2.6.32 的 staging 裡頭有 driver.

整體使用上來,除了每次左手拇指都會壓到 trackpad 然後導致滑鼠亂飄害我一直罵髒話之外,其他都還不賴。

用久 Mac 真的沒辦法習慣 PC 的 Trackpad, 非常容易亂點。

因此,終於換上觀望已久的 xmonad window manager,可以幾乎完全不用到滑鼠來操作視窗介面,讓我非常的有生產力。再來,Firefox 終於也裝上了 Vimperator ,所以連瀏覽網頁都可以不用滑鼠了。

今天晚上所做的事情,大概就是把上頭這兩個很久以來一直想用的東西裝起來用了。

順便來一張 xmonad key mapping table:

2009年10月22日 星期四

2009年10月20日 星期二

懶得寫部落格

由於 Facebook , Twitter , Plurk 氾濫,養成我的壞習慣,都懶得寫 Blog 了。XD

BTW , 我現在才知道連中國都要擋掉 Blogger.com ,所以中國的朋友沒辦法讀 *.blogspot.com 的 Blog 了。 (當然也包括我的在內。orz)

晚餐後,用 Google 搜到這麼一篇關於上個月的 Beijing PerlChina Conference ,中國的朋友說

『 终于到了我最兴趣的一场了,来自台湾的c9s带来了Perl Hacks on VIM。 这个专题主要是介绍VIM,和高嘉良一样,说着软软的台湾普通话,不过听着倒也舒服 。』

http://www.disandu.com/?p=83


原來我們講的國語是軟軟的呀。那麼我們可是軟硬(台語)兼俱呢!

話說中國的朋友也挺熱情,當天簡報後跑來和我討論一些 Vim Stuff ,以及問我簡報是否會 Publish (PerlChina 版的簡報還沒 Publish) 我只說 『直接 Google 我的 ID 就好了,都在上面』, 不過回台灣才知道原來那邊沒辦法看台灣的部落格,Slideshare 好像也無法?得繞路才行。

關於 vim + gdb

有朋友問 vim 如何整合 gdb ,這是個好問題。 其實 vim 裡頭可以開啟 shell 來呼叫外部程式。但是這個作法實在不大好。 output 很容易亂掉編輯畫面,再者,也不方便 scroll 輸出的訊息。

其實是有簡單的解法的。基本上,我們可以利用 screen 的 share 功能來從外部送一些相關指令餵給 Terminal 的 gdb shell 或是利用簡單的 IPC 來操作外部程式,譬如說 設定 breakpoint , step , continue ... 等等功能。

再延伸一點,這麼多指令,肯定很容易衝突到其他的 key mapping ,要不,就是得延長 key mapping 的序列才行。所以可以透過 augroup 來在特定的情況下,將一整組 key mapping override 現有的 key mapping ,在不需要的時候再把這些 key mapping unmap 掉。

這邊先賣一下關子,有空再來寫。 XD 時候不早了,先去睡覺。 XDD

2009年10月18日 星期日

perl-completion plugin for vim



昨天在往台南的客運上 hack 了一個這樣的東西,可以針對 $self, $class, Class::Name 這幾種狀況做 completion,目前的 perl-completion 使用 PPI (pure perl parser) 來找出目前 package 繼承的 class 的函式以及能夠依據設定找出第 n 層的 class function (預設是兩層)。

輸入字串至 Class-> 按下 Ctrl-x Ctrl-x 便能開啟 perl-completion window ,在 insert mode 輸入 pattern 時,直接按下 Enter 能夠自動 complete 第一個 item. Ctrl-n , Ctrl-p 可以上下選擇 completion item, Ctrl-j , Ctrl-k 能夠跳至上一個/下一個 package,ESC 可直接關閉 completion window。

有空在將這個 completion window generalize ,那麼便可以很容易的支援其他 Language。

下一步想做的是 function preview ,由於在 Perl 的 Subroutine 內,我們可以用各種方式取用 Arguments ,所以若要自動 parse function argument 作為 completion 的提示,並不容易。初步的想法是,可以將一個 function 的最初幾行做預覽。那麼哪怕忘記 function 該怎麼 call ,只需要叫出預覽視窗即可。

目前 perl-completion.vim 還在 github.com/c9s/cpan.vim 內。昨天晚上把所有 perl 相關函式整理至 autoload/libperl.vim ,以及將各 plugin 切割出來,如 ctags-search.vim , cpan.vim , perl-completion.vim , perl-function-search.vim 等。

試想在這樣的 plugin 開發,未來可以在 Vimana 實做 : 自動建立 vim plugin 框架,自動產生 makefile,dependency check, plugin version check 之類的功能。

目前的 perl-completion.vim 放在 http://github.com/c9s/cpan.vim/ 內。


安裝方式如下:

使用 git 將 repository checkout 出來

$ git clone git://github.com/c9s/cpan.vim.git
$ cd cpan.vim
$ make install

安裝 cpan.vim 同時有下列幾種功能: perl function search , ctags search , cpan module search , perl-completion

相關文章:
http://c9s.blogspot.com/2009/10/cpanvim-now-supports-ctags-search.html
http://c9s.blogspot.com/2009/09/cpanvim.html

2009年10月9日 星期五

macports: unable to compile vim-app on snowleopard

升級到 SnowLeopard 會導致 Macports 出現一些問題。可參考 SnowLeopardProblems

另外 vim-app 也無法 compile 。( https://trac.macports.org/ticket/20947 )

出現的 compile error 如下:
--->  Building vim-app
Starting make in the src directory.
If there are problems, cd to the src directory and run make there
cd src && /usr/bin/make all
mkdir objects
CC="/usr/bin/gcc-4.2 -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_MAC -fno-common -fpascal-strings -Wall -Wno-unknown-pragmas -mdynamic-no-pic -pipe -I. -Iproto -I/opt/local/include -DMACOS_X_UNIX -no-cpp-precomp -I/Developer/Headers/FlatCarbon " srcdir=. sh ./osdef.sh
creating auto/pathdef.c
/usr/bin/gcc-4.2 -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_MAC -fno-common -fpascal-strings -Wall -Wno-unknown-pragmas -mdynamic-no-pic -pipe -I. -Iproto -I/opt/local/include -DMACOS_X_UNIX -no-cpp-precomp -I/Developer/Headers/FlatCarbon -O2 -arch x86_64 -D_FORTIFY_SOURCE=1 -o objects/gui_mac.o gui_mac.c
/usr/bin/gcc-4.2 -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_MAC -fno-common -fpascal-strings -Wall -Wno-unknown-pragmas -mdynamic-no-pic -pipe -I. -Iproto -I/opt/local/include -DMACOS_X_UNIX -no-cpp-precomp -I/Developer/Headers/FlatCarbon -O2 -arch x86_64 -D_FORTIFY_SOURCE=1 -o objects/os_macosx.o os_macosx.c
/usr/bin/gcc-4.2 -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_MAC -fno-common -fpascal-strings -Wall -Wno-unknown-pragmas -mdynamic-no-pic -pipe -I. -Iproto -I/opt/local/include -DMACOS_X_UNIX -no-cpp-precomp -I/Developer/Headers/FlatCarbon -O2 -arch x86_64 -D_FORTIFY_SOURCE=1 -o objects/os_mac_conv.o os_mac_conv.c
gui_mac.c: In function 'new_fnames_from_AEDesc':
gui_mac.c:559: error: 'typeFSS' undeclared (first use in this function)
gui_mac.c:559: error: (Each undeclared identifier is reported only once
gui_mac.c:559: error: for each function it appears in.)
gui_mac.c: In function 'Handle_KAHL_SRCH_AE':
gui_mac.c:637: error: 'FSSpec' has no member named 'parID'
gui_mac.c:637: error: 'FSSpec' has no member named 'parID'
gui_mac.c:638: error: 'FSSpec' has no member named 'name'
gui_mac.c:638: error: 'FSSpec' has no member named 'name'
gui_mac.c:639: error: 'FSSpec' has no member named 'name'
gui_mac.c:639: error: 'FSSpec' has no member named 'name'
gui_mac.c:639: error: 'FSSpec' has no member named 'name'
gui_mac.c: In function 'Handle_KAHL_GTTX_AE':
gui_mac.c:811: error: 'FSSpec' has no member named 'parID'
gui_mac.c:811: error: 'FSSpec' has no member named 'parID'


解法:

$ sudo port deps vim-app # 看 vim-app 相依哪些函式庫 , 使用 +universal variant 來 compile 這些相依的函式庫。如:

$ sudo port -d install libiconv +universal

最後 compile vim-app:

$ sudo port -d install vim-app +cscope+perl+ruby configure.compiler=gcc-4.0 configure.build_arch=i386

2009年10月4日 星期日

cpan.vim now supports ctags search

前陣子參加 YAPC::Asia,看了 imakado demo 的 emacs plugin - cpan.el 以及 perl-completion.el ,所以我於會後也寫了一個類似的 vim plugin。screencast 可參考此處 (http://c9s.blogspot.com/2009/09/cpanvim.html)

寫著寫著覺得可以開發的功能實在很多,於是除了讓 cpan.vim 可以迅速的搜尋 CPAN 模組之外,也支援其他種搜尋模式,如只搜尋 ./lib/ 或是 @INC 或是從 cpan source list 上搜尋。

除此之外另外對其他非 Perl 使用者會比較實用的是 ctags search 的功能,要使用此功能必須先安裝 Exuberant ctags ,來利用 Exuberant Ctags 對各種語言的程式碼來產生 ctags file,目前 Exuberant Ctags 支援 41 多種語言

手動產生的方法如下:

$ ctags -R foo.c bar.c /path/to/source/

這樣便會產生檔案名稱為 tags 的 taglist 檔案於目前目錄下。

這是原始的作法。

利用 cpan.vim 則只需要使用快捷鍵 Ctrl-C,Ctrl-T 即可開啟 Ctags Search Window,如果找不到 tags 檔案,便會詢問你要產生 ctags 的來源路徑 (支援自動補完路徑 path completion ),然後自動為你產生。

鍵入 Pattern 後會自動替你搜尋相關對應的標籤 (tag) ,可用 Ctrl-N , Ctrl-P 來選擇結果,Ctrl-A, Ctrl-E 來跳至行頭、行尾。

Enter 則會直接進入該標籤 (tag) , 按下 t 則會將標籤開於新分頁。若該標籤 (tag) 對應到多個檔案,則會跳出選擇清單,只需鍵入編號進入即可。

目前唯一的缺點就是當 ctags 檔案非常非常大的時候會有點慢。

詳細的使用說明於 README 檔案內。不過我目前還沒有上傳新的版本至 vim.org,我太懶了。(其實是 vim.org 做的實在很簡陋 , sucks)

各位使用從 github checkout 最新版本出來即可。

Github: http://github.com/c9s/cpan.vim

或是直接下 git 命令:

$ git clone git://github.com/c9s/cpan.vim.git

安裝則相當簡易,在 Plugin 目錄下輸入一行命令即可:

$ make install

其他相關問題歡迎在此篇 Blog 下發問。謝謝。

2009年9月22日 星期二

cpan.vim

my recent vim hack. inspired from imakado's perl-completion.el and cpan.el



it's on http://github.com/c9s/cpan.vim

installation and feature intro are in README.

2009年8月18日 星期二

Vim Hacks @ COSCUP

Vim Hacks
View more documents from c9s.


這次在 coscup 的 talk 時間比較緊湊,刷了很多東西沒講到,還好沒有又在加內容,只挑了部份我覺得有幫助的地方講,不然真的會講不完。XD
上台北之前就熬了一整夜整理東西,當工作人員忙完 COSCUP 之後,上台前一天做簡報到隔天早上五點,真是爆累的。XD

本來想說編輯器這個話題,大家應該都很熟練 Vim 了,也許會很冷門,結果出乎意料之外,會場很多人,也有朋友在 session 後過來一起討論,實在是謝謝大家捧場。

附上一張 walkingice 幫我拍的照片



以及當時 irc 的 log,也許應該另外打一個螢幕把 irc screen 打上去。 :p
http://paste.plurk.com/show/15436

其他 coscup 相關資料可在這裡找到
http://wiki.coscup.org/mediakit-2009

2009年7月29日 星期三

SA-Tainan: Jifty Now! 8/1

本人於八月一號會在台南 SA 有個 Jifty Web Framework 的主題分享。 :-)

詳細資料於此:
http://phorum.study-area.org/index.php/topic,57468.0.html

歡迎參加。對 Perl 程式語言有興趣的朋友們更不能錯過喔!

2009年7月26日 星期日

超久沒寫 blog 了。

2009年6月16日 星期二

2009年5月30日 星期六

Bash - Subversion Directory Switching Helper

基於現在很多都還是在用 subversion 作為版本控制,切換 branches/trunk 總是無法避免,如果非常常用的時候,cd 來 cd 去就會便得非常瑣碎並且浪費時間。

這隻 bash script 便是用來方便切換目錄用的。 svnb [branch name] 便可切換到 branch 上去,若是想看目前哪些 branch 則可 svnb 按下 Tab 鍵做 completion。svnt 則直接跳入 trunk 目錄。

可作用的路徑如下:

/project/trunk
/project/trunk/working/path
/project
/project/branches/
/project/branches/feature

將此 script 存起來,再將 .bashrc 裡面加入 source /path/to/file.sh 即可:

2009年5月29日 星期五

Devel::Cover

當你撰寫任何 Perl 應用程式或是模組,你可能會使用單元測試 (unit test) 來測試你的應用程式是否正確運作。但是測試總是會有遺漏的地方。

Devel::Cover 模組就是可以幫助你分析測試到的程式碼涵蓋哪些部份,哪些部份總共被執行了幾次,哪些地方沒有被測試到。

安裝 Devel::Cover 模組:
sudo cpanp i Devel::Cover

當你 test 都寫好於 t/ 目錄底下,Makefile.PL 也設定好哪些測試目錄底下的測試要被執行。便可先將 Makefile.PL 執行,產生 Makefile.
perl Makefile.PL && make

接著直接執行 Devel::Cover 所提供的 "cover" script.
cover -test

如此一來就會開始執行測試 (make test) 並且產生報表:



另外也會產生 HTML 報表:


更詳盡的測試分析:

2009年5月28日 星期四

Vim - Install CPAN Module via cWORD

I just wrote a script to install cpan modules inside vim. so that we can move cursor to the module name , and press C-x C-i to install module. :p

是一小段可以方便安裝 CPAN 模組的 vim script. 只要把 cursor 移動到 use YAML::Syck; 之類的 YAML 字樣上方,然後按下 C-x C-i 就會安裝 YAML::Syck 模組。

對於 python 或是 ruby 的朋友可以把對 CWORD 的 regular expression 和 command 換一下,應該就可以用了。

2009年5月26日 星期二

SVK FileType Plugin

在 vim.org 上找到這個 script (svk syntax plugin) ,不過功能只有 "新增" "移除" 所以做了一點 patch。已經 mail 給 Oleksandr Tymoshenko 了。

要用的朋友可以在設定後,直接把這隻 script replace 過去 ~/.vim/ftplugin/svk.vim 。



last-updated: 2009-05-26

2009年5月22日 星期五

Vim Color Test

要啟用 xterm 的 16 色模式,在 .vimrc 內加入

set t_Co=16

若有需要 xterm 更高階的色彩,請重新編譯 xfree-xterm ,可參閱 xfree-xterm 章節:
                                                        *xfree-xterm*
To get 16 colors or more, get the newest xterm version (which should be
included with XFree86 3.3 and later). You can also find the latest version
at: >
http://invisible-island.net/xterm/xterm.html
Here is a good way to configure it. This uses 88 colors and enables the
termcap-query feature, which allows Vim to ask the xterm how many colors it
supports. >
./configure --disable-bold-color --enable-88-color --enable-tcap-query
If you only get 8 colors, check the xterm compilation settings.
(Also see |UTF8-xterm| for using this xterm with UTF-8 character encoding).


至於一些支援 256 色的 colorscheme ,於此 page 有介紹:
http://www.frexx.de/xterm-256-notes/

另外 vim 提供了 color test 的 vim script ,可在 vim 內輸入:

:runtime syntax/colortest.vim

畫面大概會像這樣:

2009年5月21日 星期四

Jifty 0.90519 Released.

新的 Jifty Release 了,包含了我翻的中文教學,請各位多多指教。

於此:

不過卻發現了一兩個錯字呀,只好等下個版本更新了。

2009年5月17日 星期日



最近倒是對料理還蠻有興趣。在家有時隨便吃,有時弄點櫻花蝦炒飯、義大利麵之類的。
為了這些所以也買了真不少調味料。不過我的確很懶就是了,廚房都被弄的亂糟糟的。XD

所以我要逐漸步入 Hacker Kitchen 的行列了嗎?XD

不過目前都只是先做些簡單的東西,有空再來研究一下難一點的。

2009年5月12日 星期二

Vim Syntax Support for SD

由於 SD 的關係,所以前陣子就立即生了一個 vim syntax highlight for SD ticket。讓 ticket 可以彩色一下。 :p

vim script 的網址在這: http://www.vim.org/scripts/script.php?script_id=2614

如果各位有興趣也可以 patch 一下,以下是 gist。



最後在 .vimrc 加上:

" sd sticket filetype
au BufNewFile,BufRead *
\ if getline(1) =~ "required ticket metadata" |
\ setf sdticket |
\ endif


便可以使用了。

關於 Vim 於 Terminal 底下的 Comment Color

Vim 其實有內建不少 Colorscheme 是符合 Terminal Color 用的,但在 Terminal 下選來選去還是覺得 default colorscheme 最適合。唯一的缺點就是 comment 的 color 是藍色的,但 Terminal 背景又是黑色或又加一點透明,導致 comment 讀起來實在非常吃力,所以可以透過 has function 來判斷一下是不是在 Terminal 底下,若是,我們便將 Comment 這個 syntax highlight 改用我們所想要的。

我的作法是:



這樣會讓原本的 Comment 背景使用深藍色,前景使用灰色

2009年5月7日 星期四

Perldoc 翻譯

最近在 github 開了一個 perldoc translation 的 repository ,
打算有空就幫忙翻譯一點東西。
歡迎有意願幫忙的朋友和我索取 commitbit.

以下 repository 除了 perldoc 之外,也包含 moose 的文件。
我目前應該會先從 perlguts , perlxstut 著手。
希望有興趣的朋友也一起來幫忙。 :)

http://github.com/c9s/perldoc-zhtw-translation/tree/master

目前接受三種方式. :)

1. 先在 github 上頭申請帳號,然後我將commitbit 開給你
你就可以使用 git checkout , commit , pull , push 直接幫忙翻譯,
將翻譯好的部份直接 commit 進 repository. (適合長期)

2. 如果不想使用 git 也可直接將 patch 寄給我,我幫你 apply. 使用下列指令產生 patch:

diff -u 原檔名 翻譯後檔名 > tranlation.patch

(適合短期 , 一兩次的翻譯修正)

3. 又或者直接把片段寄 mail 給我,告訴我是在哪個檔案的第幾個部份。

我的 email: cornelius.howl _at_ gmail.com

關於 github 一些設定可參考:

github guides

另外關於 sshkey 設定的方式:

providing your ssh key

2009年5月3日 星期日

Perl on IRC

事實上 Perl Foundation 有自己的 IRC server,若有有興趣的朋友,可以連線至 irc.perl.org。

其中有幾個頻道要介紹的是:

#news

會有機器人將所有 Perl 相關大站的 Feed Aggregate 起來,並即時通知於頻道上,如 Perl Monkers , Perl Buzz , Iron Man 等類似站台。

另外也會有最近上傳至 CPAN 的模組的即時資訊。對於 CPAN 上頭的變動,看到奇妙的模組名稱,就好像看到奇妙的菜色想找出食譜一樣,想拿出來隨時玩玩。 :D


#perl

也就是 Perl 的頻道。不過上頭不是用來問問題的頻道。


#perl-help

幫助客官解決各種疑難雜症的頻道。


#yapc

Yet Another Perl Conference 頻道


另外有一些頻道是在 freenode 上頭才有的。如:

#jifty
#svk
#prophet

等等。

另外台灣的 Perl Channel 大部分是在 freenode 上

#chupei.pm

gugod 所開的頻道 (竹北 Perl 推廣組) 最近比較活躍。日前我將 jabbot 加上了 CPANAuthor 的 Plugin,所以會將 CPAN Upload 過濾,會在頻道上廣播最近台灣 CPAN Author 的模組動態。

此外,jabbot 也另外新增的 github 的 backend ,可在自己的 project repository 的 service hook 加上 jabbot service 的 URI ,則 jabbot 會即時廣播 commit log.


#perl.tw

Perl.TW Perl 台灣。不過比較沒這麼活躍。

#elixus



雖然不是 Perl 頻道,不過上頭仍有很多 Perl Hacker.

CPANPLUS 快速上手

CPANPLUS 是一能夠幫你輕鬆安裝 CPAN 模組的工具。若沒 CPANPLUS 或 CPAN Shell ,我們就需上 http://search.cpan.org/ 手動下載模組,並 perl Makefile.PL , make , make install 的手續來安裝,若是遇到相依性的問題,那麼就更又頭大。

所以,幸好有 CPANPLUS ,我們就可以輕鬆安裝模組。

由於 Perl5.10 已經提供 CPANPLUS Shell , 所以我們只需要稍做調校就可以使用。

第一次進 CPANPLUS ,需要稍微調整一下參數,譬如說 Mirror Site , 以及 Follow Prerequisite ,等可以幫助自己省事安裝模組的設定。

在進入之前,如果你沒有 root 或是 sudo 的權限,可以參考這篇: 安裝 CPAN 模組於 Home 目錄下

進入 CPANPLUS

首先先進入 CPANPLUS:

$ sudo cpanp

設定 Mirror Site

第一次執行 CPANPLUS 請先進入設定選單來選擇速度較快的 Mirror Site:

s reconfigure

選 7 Select mirrors

輸入 No 不保留目前設定 (才能繼續設定)

選 1 Mirror ,接著 CPANPLUS 會去下載 Mirror List

選 3 Asia

選 9 Taiwan

輸入你想要的 MirrorSite 號碼,譬如說 1 3 5 8 ,用空白分隔

選完之後選擇 Quit 跳出,設定就會自動儲存

選 9 Save and exit

Ctrl-D 跳出即可。

設定對每個相依模組安裝時行為 ( No, Yes, Ask, Build but not install )

通常對一次要安裝許多 CPAN 模組,每次預設都問是否安裝實在太煩人了。進入 cpanp 之後請下:

s conf prereqs 1
s save

是否執行模組單元測試

對於 CPAN 模組,都會固定有一些單元測試,用來測試在你系統上每個功能是否運作正常。因此會花去一些時間來做測試,這些測試結果當然不浪費掉,他會送至 CPAN 網站做彙整、統計。

如果覺得每次測試太花時間,可以將測試取消:

s conf skiptest 1
s save

基本使用

進入 CPANPLUS Shell 之後,按下 ? 會出現說明頁面。

首先可以先將 CPANPLUS 本身更新 ,請輸入:

s selfupdate all

之後我們可以先安裝一下 Bundle::CPAN 模組,將一些必要模組安裝 (非必要) ,請輸入:

i Bundle::CPAN

接下來動手安裝你想把玩的模組吧!就會輕鬆的多!

安裝模組

譬如說,安裝 Data::Dumper::Simple

i Data::Dumper::Simple

或者用關鍵字尋找 YAML 有關的模組:

m YAML

又或者搜尋某作者的模組

a leon

以上。

Have Fun!

2009年5月2日 星期六

SD Bug Tracking System Tutorial

SD stands for Simple Defects, a bug tracking system such as Git, SVK.

SD let you retrieve tickets to your local system. and you can sync your repository with other nodes, not only the central web server. and you can work with SD offline. just like SVK or Git , you can work on local branches , when you get online again , you can push your changes to remote servers.

SD currently supports RT, Hiveminder .. etc. and Google Code is the next. Oh Gugod just wrote a Net::Redmine, so it's possible to be able to use SD with Redmine in the future.

Install SD:

before you install SD , you will need Prophet , Prophet is a distributed database system designed for small to medium scale database applications (currently up to around 50,000 records of a given type). early targets include things such as bug tracking.

Download Prophet from github , or you can check out via git.

git clone git://github.com/obra/prophet.git

Once you've downloaded Prophet , you can install it:
cd prophet
PERL_MM_USE_DEFAULT=1 perl Makefile.PL
make test
make install
Then you can download SD from github:

get clone git://github.com/obra/sd.git

Once you've downloaded SD, you can install it:


cd sd
PERL_MM_USE_DEFAULT=1 perl Makefile.PL
make test
make install
Using SD for rt.cpan.org,

SD_REPO=/path/to/your/module sd clone 'rt:https://rt.cpan.org/|Your-Module|'

So that, SD will retrieve tickets from rt.cpan.org , next time you need to load your repository. just enter:

SD_REPO=/path/to/your/module sd

then you can create tickets, update tickets , take tickets , pull (retrieve changes from remote servers) , push ( send your local changes to remote servers)

SD> pull
SD> push
SD> ticket create

to see more help about ticket commands:

SD> help ticket

2009年4月29日 星期三

使用 Module::Starter 建立模組框架

當你開始想要寫模組的時候,其實一般人都會使用 h2xs 來建立模組框架。不過對於需要 xs 的模組之外,現在有更好的選擇,就是 Module::Starter 模組。 他提供更有彈性的方式來建立模組框架。

Perl 用來將 Makefile.PL 轉成 Makefile 的模組相當的多,其中三種主要是 ExtUtils::MakeMaker 以及 Module::Build , Module::Install 。不過 Module::Build 無法讓你 Uninstall 已經安裝的模組 ,所以一般來說 Perl 預設都是使用 ExtUtils::MakeMaker 來將 Makefile.PL 產生 Makefile 再讓 GNU make 讀取並編譯安裝。

一般的程序是這樣:
perl Makefile.PL
make
make test
make install


# 註: 加上 make test 做測試的話 ,如果 mail 沒有被 ISP 擋掉,基本上都會送至 cpan 網站,彙整測試報告,統計各種系統、版本等的測試結果

然而 ExtUtils::MakeMaker 仍是有很多不足的地方,所以後來 Module::Install 誕生,Module::Install 主要是 MakeMaker 的 Wrapper,不過提供更多的 Option,可以在 perl Makefile.PL 時讓安裝選擇、檢查更加多元。

以 Jifty 的 Makefile.PL 舉例:



由於 Makefile.PL 裡頭引入 Module::Install ,因此使用者在安裝 Jifty 的時候便可以選擇要不要哪些功能而決定接下來要安裝的模組。也可在 Makefile.PL 裡頭用相當簡潔的語法來敘述相依的模組版本、測試路徑、安裝路徑、文件等等。

但是你不需要自己手動將 lib/ , Makefile.PL , inc/ , .. 等等建好,因為 Module::Starter 便是幫你自動處理這樣的事情。

你可以透過 Module::Starter 所提供的 module-starter script 指定你想要哪種 Makefile Maker ( ExtUtils::MakeMaker or Module::Build , Module::Install )。其實我會比較各位使用推薦 Module::Install,因為作者是 Adam Kennedy, Audrey Tang(唐鳳) 與 Ingy。 :p

在使用 Module::Starter 之前,你需要安裝 Module::Starter 模組:

sudo cpan Module::Starter

使用 module-starter 建立 Foo::Bar 模組,並搭配 Module::Install :

module-starter --verbose --module=Foo::Bar --mi --author=Cornelius --email=cornelius.howl_at_gmail.com

這樣就會將 Foo::Bar 模組建立於 Foo-Bar 底下。 --mi 是指使用 Module::Install ,若要使用 ExtUtils::MakeMaker 則用 --eumm ,若用 Module::Build 則用 --mb。如果你想指定 License 也可以透過 --license=TYPE 來指定。

Has Fun!

# 最近應該會陸續寫一些 Programming Perl 或是 Learning Perl 上面未提到的東西。事實上對於現今 Perl 的發展,目前中文書籍涵蓋的內容並不多。

2009年4月28日 星期二

Poppler binding Module

In recent days , I wrote a Poppler binding module.

Poppler is a PDF rendering library based on the xpdf-3.0 code base.

I've port some basic functions to this perl binding module. so that we can read pdf file easily , then render it onto cairo context (cairo_t*) , here is an example:



more progress later...

---
最近幾天我寫了一個 Poppler 模組 (應該是前天晚上動手寫好的)。 將一些 Poppler 主要功能透過 xs 做連結,在裝此模組時,請確定你已經安裝 poppler library , gcc 等等,因為你需要在安裝的時候執行一些編譯動作來將模組編譯並安裝。

Poppler 是一個以 xpdf-3.0 為基礎的 PDF Rendering 函式庫

所以我們可以輕易的利用 poppler 來將 pdf 繪製到 Cairo Context 上頭 (cairo_t*) , 以下是範例:



more progress later...

安裝 CPAN 模組於 Home 目錄下

一般使用者在安裝 CPAN 模組時時常遇到的問題之一就是在無 root 權限的系統下安裝 Module 的困擾。要將 CPAN 模組安裝在自己的家目錄 (Home Directory) 底下其實相當容易。

For Perl5.10.0:

由於已經內建 CPANPLUS, 所以可以直接透過 cpanp 進入 CPANPLUS Shell:

$ cpanp

進入之後可透過 s conf 查看目前的設定,如:

# s conf

 allow_build_interactivity ''
base '/Users/foo/.cpanplus'
buildflags ''
cpantest ''
cpantest_mx ''
debug ''
dist_type ''
email 'cornelius@cpan.org'
extractdir ''
fetchdir '/Users/foo/cpan_download/'
flush '1'
force '1'
makeflags ''
makemakerflags ''
md5 ''
no_update '1'
passive ''
prefer_bin '1'
prefer_makefile '1'
prereqs '1'
shell 'CPANPLUS::Shell::Default'
show_startup_tip '1'
signature ''
skiptest '1'
storable '1'
timeout '5'
verbose '1'
write_install_logs '1'


一般使用者預設的 makemakerflags 選項應該都是空的。若要將 CPAN Module 安裝至
~/usr 則可直接

# s conf makemakerflags PREFIX=~/usr

接著:

# s save

# quit

跳出 CPANPLUS Shell.

接下來安裝 CPAN 模組則只要透過 cpanp 安裝模組則都會安裝至 PREFIX 底下了。如:

$ cpanp i Module::Install

最後,設置 CPAN 搜尋模組的目錄 ( PERL5LIB 環境變數 ) ,開啟 .profile 或者 .bashrc
設置:

export PERL5LIB=~/usr/lib/perl5/site_perl/5.10.0:$PERL5LIB
export PERL5LIB=~/usr/lib/perl5/5.10.0:$PERL5LIB

要稍微注意的是,在 Ubuntu Linux 底下 perllib 會在 ~/usr/share/lib/perl/..../ 下面。

對於一些模組會安裝 script 的,我們也需設置 PATH 變數:

export PATH=~/usr/bin:$PATH

即可。

另外,對於直接下載回來的 CPAN Module tar.gz 檔,也可以透過 PREFIX 來安裝:

tar xvf Foo-Bar-0.01.tar.gz
cd Foo-Bar-0.01
perl Makefile.PL PREFIX=~/usr
make install

即可。

2009年4月21日 星期二

Vim - BufferSel

Tabpage 很好用。但是當 Tabpage 超過 10 個以上,就會開始花費許多時間在尋找 Tabpage。事實上 vim 提供一個指令 :tabfind ,但是又得輸入較完整的路徑才行。可惜我們沒什麼耐性,所以這功能可能只會被用在 vim script 裡頭。

當然對於這種問題的解法已經有 Plugin 可以做到,就是 FuzzyFinder.vim 所提供的 Buffer Mode。

不過對我來說還是需要一個更簡單的方式來 search buffer。

BufferSel function 就是一個簡單的 Solution,直接輸入 Pattern 去 Search Buffer 即可,如果 Match 多個就會跳出選單讓你選擇。

2009年4月20日 星期一

SD - peer-to-peer bug tracking system by jesse

今年的 OSDC.TW , Jesse Vincent 的 topic 為 BestPractical 最近的產品 SD ( peer-to-peer bug tracking system )

也是 BugTracking 可以 decentralized 、可以 offline working,不直接相依於中央集成的 WebService。 並且有完整的 Shell 可以使用 (再也不用開煩人的 browser 了) 且每個 SD 的 repository 之間都可以 sync ,甚至或是啟動自己的 WebServer。相當的吸引人。

目前 SD 也支援 Trac , Hiveminder 以及 RT。意思就是說 Perl Module Authors 可以使用 SD 來使用 rt.cpan.org。而下一個階段是要做 GoogleCode 服務的整合,也相當歡迎大家幫忙整合 Github 以及 BugZilla 至 SD。

SD 使用 Perl 所寫成的 Prophet Database,也相當有趣,Module 的說明如下:
Prophet is a distributed database system designed for small to medium scale database applications (currently up to around 50,000 records of
Our early targets include things such as bug tracking.


SD 以及 Prophet 的 source code 可以在 github.com 上頭找到。

2009年3月20日 星期五

Jifty - GoogleMap Plugin

Jifty 提供了 GoogleMap 的 Plugin 提供了 GeoLocation 的屬性能夠讓你在 column 存放位置資訊,並且能讓你輕易的將 GoogleMap 畫出來。

在 etc/config.yml 內設定 GoogleMap Plugin ,並提供 apikey :

||   17   Plugins:
|| 18 - GoogleMap:
|| 19 apikey: ABQIAAAA66LEkTHjdh-UhDZ_NkfdjBTb-vLQlFZmc2N8bgWI8YDPp5FEVBTjCfxPSocuJ53SPMNQDO7Sywpp_w
接著只需要在 Model 的 Schema 內新增 GeoLocation 屬性的欄位 (此屬性是由 GoogleMap Plugin 提供):
column location => is GeoLocation;
新增此欄位的 Model 變可以將位置存入 location 這個 accessor.

my $user = MyApp::Model::User->new;
$user->location( { x => 100 , y => 20 } );

順帶一題,使用 GoogleMap Plugin 在 Render 此附有 GeoLocation 屬性的 Model Action
時,此欄位會以 Jifty::Plugin::GoogleMap::Widget 來做 Render.

# 註: Model 會透過 Class Loader 自動為你的 Model 提供 "Create", "Search",
# "Update", "Execute", "Delete" 等 Action 如 CreateUser, UpdateUser .. etc . 不需要自己另外寫 Action.

也就是說,當你使用以此 Model 為 Record 的 Action 做 render 時,他會自動將 GoogleMap render 出來。

譬如說:

my $update = Jifty->web->new_action( 
class => 'UpdateUser',
moniker => 'update-user',
record => $user,
);
$update->form_field( 'location' )->render_widget;


# 更正: GeoLocation 並非 Jifty::DBI 內建,而是由 GoogleMap Plugin 提供的 Virtual Column. 謝 clkao 長輩指正。

2009年3月14日 星期六

Vim::Snippet::Converter

之前寫了一個用來產生 SnippetEmu Vim Plugin 樣板的模組 ( Vim::Snippet::Converter ) (其實有好一陣子了)。不過還是順便來 Blog 廣告一下。

Vim::Snippet::Converter 模組提供了 scc 的 perl script 能將你寫好的 Readable Template 轉成 SnippetEmu 可讀的 vim script,以便讓開發者能夠有效的建立各種語言的 Code Snippet,如 c , c++ , java , perl , ruby .. etc.

安裝 Vim::Snippet::Converter 模組:

sudo cpanp i Vim::Snippet::Converter

或者

sudo cpan Vim::Snippet::Converter

若是從 cpan 上下載:

tar xvf Vim-Snippet-Converter.tar.gz
cd Vim-Snippet-Converter
perl Makefile.PL
sudo make install

Template 的寫法如下:
   
;sub
sub <<function>> ( <<prototype>> ) {
my <<>> = <<>>;
return <<returnvalue>>;
}
;end
由角括號包起來的稱為 PlaceHolder ,也就是每一次按下 Tab 後游標駐足的地方。
;sub 為這個樣板 (Template) 的觸發字串 (Trigger),;end 則代表這個樣板的宣告結束。

寫好之後,使用 scc script 將之轉換並安裝到 vim filetype plugin 所在的目錄。

譬如說

scc -s perl_m.snt -i ~/.vim/after/ftplugin/perl/module.vim

放在 after 裡面主要是因為當 snippetEmu plugin 載入完成之後接著會去載入 after 裡面的 script.

-s 用來指定來源檔案的路徑。

-i 用來將轉換過的 Template 安裝至檔案,如果之前已經有安裝過 (透過樣板來源的檔名辨識),便會自動取代原本的部份。若檔案尚未建立,scc 會自動為你建立。如果不加上 -i 參數,則會將轉換的結果列印至一般輸出 (STDOUT)。 透過 -i 參數,你可以將來自各不同檔案的 Template 裝至同一檔案而不會複寫其他的 Template。

2009年3月12日 星期四

新入手一些書

Real World Haskell 前幾天到了,有時隨手拿起來啃個幾頁,頗有趣。

然後得把 【SICP】 的進度規劃好,也許可以用 mit-scheme 玩些什麼東西也說不定,因為我發現 mit-scheme 蠻完整的。 本來還想說要買幾本 Ruby,不過沒有很迫切的需要 Ruby,因為大部分的事情用 Perl 就能解決了,熟練的關係,所以相對來講解決問題也比較快。

其他入手的書有【記憶之術】,探討古代記憶的研究。另外還有 【開機】.. 等等約四本新書。

另外還跟長輩借了 【雪潰】以及【我的電腦探索】等書。

書好多,突然覺得壓力好大。orz

話說 vimrc 不包含 .vim 目錄的話,快超過 1k 行了。

2009年3月10日 星期二

Mac - 使用 airport command-line 工具

使用 airport command-line 工具來設定無線網路。

只有簡單的幾個步驟

cd /usr/sbin

sudo ln -s /System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport

建立 link 之後。

airport --help

查看使用方式。

airport -s

掃描可使用無線網路

airport -A=[SSID] --bssid=[BSSID] --password=[WEP|WPA]

便可指定連線。

reference:
http://lists.apple.com/archives/Macnetworkprog/2006/Nov/msg00038.html
http://forums.macrumors.com/showthread.php?t=425054

曾幾何時也開始發 Mac 相關的文章了。orz

2009年3月3日 星期二

一般人對於 Perl 的誤解

* 此篇文章只是澄清一般人對 Perl 的誤解,不是說 Perl 有多好其他語言有多差,請勿誤會,語言只是工具,對於 Perl 的缺點當然要列的話當然也不少。

看見有人在 lukhnos 的這篇 『學 Python: 兼談成人的語言習得』有人回應指出 "Perl我覺得很大程度是靠regex在撐" 這句話,我想,順便對這樣的誤解提出釐清一下。

這就是大部分的人對 Perl 的誤解,因為對 Perl 了解的不夠深,以及大部分 Perl 的流言。

我真正踏入 Programming 這塊的時間並不長,但是也走馬看花學了一些語言,然而在 Ruby, Python, Perl 等語言中使用大量的 Perl ,其實有很多原因。
一開始學習 Perl,只是將他當作相當方便的 Scripting Language 使用,但是跟隨 clkao 接觸 Jifty 以及閱讀許多模組的 Code,使我對 Perl 的認知便不再是如此。

Perl 作為一個 Very High Level Programming Language 這樣的方便性,使他非常容易被用來 Scripting. 但是 Perl is not just for `Scripting`,Perl 除了在 Scripting 上的應用之外,也被拿來開發網路應用程式、網頁框架、系統管理、剖析器 (Parser) 甚至生物科技(請參見 BioPerl) 等應用。所以, Perl is not just for `Scripting`.

1. 有些人認為 Perl 寫出來的程式是相當骯髒
事實並非如此,而是看每個人的 Coding Style 而有所不同,由於 Perl 提供了語法的多變性質,所以無法讓人很難寫出不難看的 Code。而寫 Perl 寫的好的人,則是能將 Perl 作為一個相當優雅的語言使用。
對於 Coding style 相當差的人,用 python 或 ruby 寫,可能沒辦法寫出很難看的程式,以 python 來說, syntax 對 code 的 indentation 做了限制,必須照 Indentation 撰寫程式,否則 Interpreter 就不聽你的話,而 Perl 是 free-form 的語言,你能夠以非常自由的風格撰寫。

2. 有些人認為 Perl 完全只是在靠 Regular Expression 在撐:
事實並非如此。許多人使用 Perl 的原因,不外乎是因為 Perl 提供了 CPAN ,可以讓 Hacker 可以 DRY (Don't Repeat Yourself). 以及 Perl 的本質 -- 條條大路通羅馬 ( TMTOWTDI ) ,因此對付一項問題,你可以選擇各種不同的模組來解決問題,以及更多種不同的寫法來實做。 另外,Perl Syntax 所提供的多變性 - 對 function 的呼叫可不加上圓括號,提供 Closure, Prototype 等功能,讓我們可以利用 Perl 來製作各種 "寓言",而 Regular Expression 只能算是 Perl 強而有力的工具之一而已。

舉例來說 Object::Declare 或是 Jifty::DBI 的 Schema 都使用了這種特性來讓 Perl Programmer 可以很優雅的撰寫程式。

再來是 Perl 的 syntax sugar , qq , qr , qw 等 term 提供了更方便的方式來建構字串、串列以及雜湊、正規表達式。

順帶一提,Ruby 便是從 Perl 這取出部份的便利性,再加上完整的 Object ,相對於 Perl 對 Object 實做的 lack ,所以也有不少 Perl Hacker 跳槽去 Ruby 。

順便引用 clkao 於 ptt 的一篇 『 關於 Perl 已死的一些迷思』,提出 OSCON, Tim Bunce 的一場 talk 的重點:
http://tinyurl.com/6r89go

在今年的 OSCON, Tim Bunce (DBI 的作者) 有一個場 talk: Perl Myths

簡單來說,關於 "perl 已死" 的迷思部份, 重點如下:

* 不紅不代表沒有人用或沒有相關工作的市場
* 工作需求的統計數據顯示, perl web developer 僅次於 php developer
* perl software engineer 高於 {python,ruby} software engineer
* "perl developer" 遠高於 {python,ruby} developer

2009年2月27日 星期五

Github::Import

若常用 github ,Github::Import 會是一個很方便的模組。不需要為了新建 repo 而再到 github.com 上頭 create , 然後下幾個常常重複的指令。

模組安裝完成後,會提供你 github-import 這個 script. 使用的流程以我 import cpan module 舉例:

module-starter 之後。可以下


git init
git add something
git ci -a


之後便可以直接使用 github-import import

github-import --username [username] --token [api_token] --add-remote --push-mode all

而 API token 可以在 github 上頭的 account page 上找到。

更方便的方法是,直接在 git config 設定好,之後就只需要輸入 github-import 即可。

此外補充一點,若參見 github::import 的文件,若要直接使用 git 的設定檔,對 git config 記得加上 --global 的參數,文件上頭沒寫到。

See also:

perldoc Github::Import
github.com

2009年2月20日 星期五

vim - 實做符合自己需求的 commenter

這是一段很簡單的 vim script , 用來插入 perl 的 comment 符號 ,單純的檢查行是否以 # 開頭,如果有就 strip 掉。如果沒有就 comment 起來。此 function 適用於 visual mode, 透過呼叫 getline('.') 來取得目前處理行的內容。

function! _perl_comment()
let l = getline('.')
if l =~ '^#'
exec 's/^#//g'
else
exec 's/^/#/g'
endif
endfunction

使用這段 comment function 請使用 visual map
vmap ,c :call _perl_comment()<CR>
讀者可利用類似的技巧來打造自己需求的 commenter 。譬如說,加入 fold marker 之類的東西。

此外可以透過 a:firstline 以及 a:lastline 來比對是否為開始行或結束行。

2009年2月18日 星期三

SVK - branch management

svk 提供了快速簡潔的 Branch 管理,若 Project Source 的結構有照 /trunk /branches
or /tags ,則可以使用 svk branch --create / --rm / --push / --pull /
--merge
等操作,相當方便。

欲設定 property 可用
svk br --setup //mirror/Porject

建立 branch:
svk br --create Feature

Merge Branch:
svk br --merge trunk Feature

建立 Tag:
svk br --tag --create 1.0rc1

刪除 branch:
svk br --rm Feature

也可直接建立 Local Branch:
svk br --create LocalBranch --local

2009年2月16日 星期一

vim - move current window to a new tab page

I didn't see it before ,which is very useful.
                        *CTRL-W_T*
CTRL-W T Move the current window to a new tab page. This fails if
there is only one window in the current tab page.
When a count is specified the new tab page will be opened
before the tab page with this index. Otherwise it comes after
the current tab page.

2009年2月14日 星期六

gvim - winresizing and svkdo for macvim

here are some new configuration for my mac gvim
" svk
function! _SVKDO()
let action = input( "svk action to " . expand('%') . " : " )
if strlen( action ) < 1
echo "no action"
return
endif
exec "!svk " . action . " " . expand('%')
endfunction
command! SVKDO :call _SVKDO()
nmap <D-k> :SVKDO<CR>

" window size key for macbook
if has('gui_mac')
nmap <silent> <D--> :resize -3<CR>
nmap <silent> <D-=> :resize +3<CR>
nmap <silent> <D-]> :vertical resize +5<CR>
nmap <silent> <D-[> :vertical resize -5<CR>

nmap <silent> <D-\> <C-w><C-w>
nmap <silent> <D-;> gT
nmap <silent> <D-'> gt
endif

2009年2月12日 星期四

Jifty app 之後?- 使用 Template::Declare

在 Jifty 如果要使用 Template::Declare 來作為 View 的 Render 而不是 Jifty 所預設的 Mason 的話,需要以下步驟。

編輯 etc/config.yml
修改 TemplateClass 為 MyApp::View

接著在 lib/MyApp/View.pm 繼承 Jifty::View::Declare , 如下
use Jifty::View::Declare -base;
use Jifty::View::Declare::Helpers;

template '/index.html' => page {

# insert template::declare here
show 'something';
};

private template 'something' => sub {
# sub template
};
這樣就會取代原本預設的可愛小馬,顯示你的 "index.html" 樣板。會喜歡 Template::Declare 的原因在於,可以很有組織性的將樣板模組化,分為許多細部區塊,並且重複利用。在語法上的優點則是不需要浪費氣力輸入許多的角括號,Tag 間要插入程式碼也不需另外處理,整個程式結構也比較清晰。

也因此我越來越看不慣 php ,太過累贅。

其餘資訊可參考 CPAN.

Template::Declare
Jifty::View::Declare

2009年2月9日 星期一

App::Nopaste Module

App::Nopaste CPAN 模組提供了 command-line 介面讀入 STDIN 自動貼到 Nopaste Service 上頭。

$ cpanp -i App::Nopaste

使用

$ cat jifty.patch |  nopaste -n c9s -s Pastie

接著會傳回 Nopaste 的網址。

2009年2月2日 星期一

Perl 5.10

這是舊聞。

Perl5.10 似乎已經普遍的存在於各類 Unix-Like OS 中了。 Ubuntu 目前的 Intrepid 也預設使用 Perl5.10.

Perl5.10 新增了許多功能,包括在 regexp engine , syntax , performance 方面的改進,像是 say, fieldhash , state, given, smart matching 之類等等的東西。 (我好像一年前有寫過 ? XD)

perl.com: A Beginner's Introduction to Perl 5.10
perl.com: A Beginner's Introduction to Perl 5.10 part 2

2009年2月1日 星期日

perl module for xhtml

在茫茫的 CPAN 大海中搜尋簡單好用可靠的且支援 selector 的 xhtml module 還真是不容易。要不是 Encoding有問題,要不就是 selector 沒辦法用 - 字元,要不,就會出現一些異常的問題。

關於這幾種需求,列出兩個我覺得不錯好用的 Module。

Miyagawa 有寫過 Web::Scraper Module,支援 CSS Selector , XPath,語法簡潔。但看 cpan 上的 Synopsis 可能還不夠,這邊還有另外的範例。

Ingy 的 pQuery ( Perl Port of jQuery ) : 利用 HTML::TreeBuilder 以及 HTML::Entities 寫出這樣巧妙模組,有好用的 find() , each() 等等。此外要注意的是,從檔案載入 UTF-8 encode 的檔案,要先用 Encode::decode_utf8 處理一下,中文parse 出來才不會有問題。

2009年1月31日 星期六

AutoPager

最近幫 Firefox 裝了 AutoPager 這套 Extension. 頗好用。省去了按 Next Page 的時間,還替你預先自動 Download 下一個頁面,真是超適合懶人,以及筆電使用者。

2009年1月27日 星期二

壹貳柒

有一段時間我自己都不知道是怎麼樣過去的。像是空白的一樣。今年回外婆家,我已經快兩三年沒見過外婆了,上次見她,是三年前,爺爺中風過世,那時父親心臟病住院,一連串發生許多事情,都快沒有力氣了。如今見外婆,心情也複雜許多,一個人要孤單的待在一棟公寓裡頭住如此久的時間是不容易的,況且爺爺又過世,有好長一段時間也都是以淚洗面,以前眷村認識的老伴也都一一辭別,一個人獨處的孤單可想而知。

然後過了這麼久,我畢業了,接著當完了兵。年初來臨。

看著外婆開心、我心裡也不自覺的溫暖了起來。我特別了解這份感覺,忍受孤寂、忍受等待、等待如此漫長的歲月,只期待與所愛的人相遇,而相見卻又如此短暫。眨個眼,又要再次分離回到日出而作日落而息的日子。我不禁為外婆覺得心疼。

2009年1月26日 星期一

vim - fuzzyfinder

FuzzyFinder. vim 的愛好者一定得 give it a try. 用中文搜尋了一下結果居然發現沒有半篇中文提到這個 plugin 所以打算來介紹一下。

這個 plugin 的作者是個日本人。發現這個 plugin 是因為我在 vim.org 上頭看見了 rails.vim 並且很好奇這套 plugin 如何運作,於是搜尋了一下他的 video demo. 抓他的 script 下來看才知道 fuzzyfinder 這東西。

Anyway 這套好用的 plugin 可以讓你在兩三個按鍵內搜尋,並開啟檔案。用簡單的 Leader 可以設定啟動鍵

nnoremap <Leader>ff :FuzzyFinderFile! <CR>

其他還有 Dir , Tag mode 等等。

vim - jifty syntax

I wrote this: jifty syntax

updated.
* Syntax highlight support for html,sql,js embedded heredoc. something like $content=<<HTML123 will make vim highlight the string as HTML
* Dispatcher folding
* Template::Declare tags folding

I encountered some problems of syntax region. the built-in syntax file of perl uses "<<...something" to match heredoc identifiers, which makes HTML highlight the "<" of HereDoc as an error. so I tried to use lookforward regular expression to exclude the "<<" part.

It seems that vim will compile and organize all patterns, so a pattern of heredoc which uses lookforward regular expression won't match heredoc , because the non-lookforward pattern will match first.

Changing the built-in perl syntax is not a good idea , and I tried to syn clear the perlHereDoc region, but it still can't work out. the small hack I did here is, let the '<<' match the HereDoc first , then make it contains a HTML block, and create another syntax region to contain the @htmlTop. set end pattern as "^\(HTML\)\@= to let the HereDoc pattern can match the end.

The sequence of syntax loading is very interesting. Vim will load the $HOME/.vim runtime path at first , after that, Vim loads $VIM/vimfiles , $VIMRUNTIME , then load the $HOME/.vim/after finally.
It was wrong that I put the jifty.vim to ~/.vim/after/syntax and let ~/.vim/syntax/perl.vim to load it, so Vim loads jifty.vim before the built-in perl.vim which override my patterns. Vim documentation also mentioned that the lastest pattern will match first, thus my patterns always can't work out.

Actually, jifty.vim should be located at .vim/after/syntax/perl/ not .vim/after/syntax/. we can put all the enhanced syntax files into a directory, vim will load them automatically.

This told me, I should read all the syntax.txt doc before I play with it...

2009年1月24日 星期六

Vim Tips - Window size & position

因為最近大部分都在 MacBook 上工作,Macports 以及上面的許多東西實在太另我著迷 ( 雖然除了 ports 以外有許多軟體都要購買才能使用 ... )

需求: 由於用 trackpad 移動視窗不是很方便,有時要同時參考文件或其他 code 也得重新調整視窗大小。

解法: 利用 vim script 提供的一些 api 做了一個這個小 hack,將 keymap 設定 C-x{a,s,d} ,並有下列對應 :

C-x a 將視窗寬度縮小一半,並將視窗自動調整到左半邊。
C-x s 將視窗調整為螢幕大小 ( Full )
C-x f 將視窗寬度縮小一半,並將視窗自動調整到右半邊。

建立一個 function:
function WHLeft()
winpos 5 5
winsize 90 49
endfunction
nmap <C-x>a :call WHLeft()<CR>
其他對應如法炮製即可,當然也可以製作上半、下半等等功能,其實寫一個 resize 的 function 去吃 w,h,x,y 會更簡潔,不過為求方便就沒花時間去研究。另外,winsize 的部份要注意的是設定的是 column size 以及 lines 而不是 pixel,winpos 的部份則是 pixel。

2009年1月4日 星期日

Lftp , setup network bandwith limit

edit your ~/.lftprc
set net:limit-rate (upload):(download)

for example:
set net:limit-rate 204800:540000

and you can also setup the "net:limit-max" , "net:limit-total-max" for the network accumulating limit.