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 上頭找到。