聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

四月 27, 2012
» Failed test 'use DBD::mysql;'

凍仁在幫 Perl 安裝 DBD 模組時,得到了錯誤訊息:

t/00base ......NOK 2# Failed test 'use DBD::mysql;'

請教 星空夜雨 後才知道這是因為 DBD 模組與 MySQL 有相依性,若沒依照 Distribution 預設的方式安裝,得手動補上參數才會過,而以下條件大概都會碰到:

  • MySQL Server 為自行編譯。
  • 本機無安裝 MySQL Server。
  • 未於 MySQL Server 建立指定的測試帳號及密碼。

1. 安裝 DBI 模組。
root@CentOS:~$ perl -MCPAN -e 'install DBI' [Enter]

2. 手動切換至編譯環境底下。
root@CentOS:~$ cd ~/.cpan/build/DBD-mysql-4.020/ [Enter]

3. 手動設定 DBD 參數。
root@CentOS:~$ perl Makefile.PL --testuser='test' --testpassword='password' --testhost="192.168.oo.xx" [Enter]

4. DBD 參數請參考 Makefile.pl 內文 (可略過)。
root@CentOS:~$ vi Makefile.PL [Enter]
......
32 Getopt::Long::GetOptions(
33 $opt,
34 "help",
35 "testdb=s",
36 "testhost=s",
37 "testport=s",
38 "testuser=s",
39 "testpassword=s",
40 "testsocket=s",
41 "cflags=s",
42 "libs=s",
43 "verbose",
44 "ps-protocol",
45 "bind-type-guessing",
46 "nocatchstderr",
47 "ssl!",
48 "nofoundrows!",
49 "embedded=s",
50 "mysql_config=s",
51 "force-embedded",
52 "with-mysql=s"
53 ) || die Usage();
......

5. 編譯及安裝。
root@CentOS:~$ make && make install [Enter]

6. 完成!

資料來源:
Install MySQL and DBD::MySQL on Mac OS X - Building Bioinformatics Solutions

八月 18, 2011
» 筆記: php, python, perl, ruby 語法對照表

http://hyperpolyglot.org/scripting

四月 5, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 用 cpanm 安裝 Perl 相依性模組

最近在寫 Perl 爬蟲程式,需要用到短網址 Bitly 的 API,所以找了 WWW::Shorten::Bitly,本篇紀錄安裝使用 cpanm 這 Perl 的小工具,此工具不需要任何設定,只要下載到 bin 目錄就可以正成使用了。由於 Ubuntu 沒有包好的 dpkg 可以用,所以才想到用 cpanm。

安裝 cpanm

mkdir ~/bin
wget --no-check-certificate http://bit.ly/cpanm -O ~/bin/cpanm
chmod +x ~/bin/cpanm

或者可以直接安裝到 /usr/local/bin/ 底下,這樣不用在重新把 PATH 改寫

sudo cp ~/bin/cpanm /usr/local/bin/

使用 cpanm

# 安裝 WWW::Shorten::Bitly
cpanm WWW::Shorten::Bitly
# 安裝 distribution path
cpanm MIYAGAWA/Plack-0.99_05.tar.gz
# 從 URL 安裝
cpanm http://example.org/LDS/CGI.pm-3.20.tar.gz
# 安裝本機檔案
cpanm ~/dists/MyCompany-Enterprise-1.00.tar.gz

另外介紹幾個 option

–sudo 直接用 sudo 方式安裝,也就是 root 啦
–verbose 檢查安裝過程
–notest 不需要測試
–force 強制安裝
–reinstall 重新安裝,假如已經有安裝過的軟體,一樣會 reinstall
–installdeps 只安裝相依性軟體

非常簡單吧,這是懶人做法,如果在 FreeBSD 直接安裝 ports 就好。

Related View

三月 31, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 2011 OSDC Day 1 筆記

今年很高興可以北上參加 OSDC 2011 (Open Source Developers Conference),由於之前都在南部唸書及工作,沒有機會北上參加聚會,現在人在新竹,終於有機會可以參加了,雖然早上六點就要起床趕電車了,不過到現場聽課感覺就是不同,也可以認識很多新朋友,底下來紀錄上課筆記

1.微軟與 jQuery 社群的親密接觸

講者: Eric Shangkuan (Microsoft)
Slide: 微軟與 jQuery 社群的親密接觸

這是 OSDC 第一場演講,早上九點就開始了,雖然人不多,但是蠻多人還是為了講者而來,首先介紹什麼是 jQuery,以及 jQuery 一些基本用法,像是 CSS selector,如何在 Windows Visual Studio 上面開發 jQuery 及撰寫 plugin 整合進去 ASP.Net,最後介紹三個不錯用的 jQuery Plugin: Templeate, Datalink, Globalzation

  • Templeate: 這搭配 Facebook api 可以直接做個人頁面,請參考這裡
  • Globalzation: 前端多國語系實做
  • Datalink: 可以快速處理 form,利用 object 跟 jQuery 搭配

如果要研究上述三個 jQuery Plugin 可以參考底下:
jQuery Datalink: https://github.com/jquery/jquery-datalink
jQuery Templeate: https://github.com/jquery/jquery-tmpl
jQuery Globalzation: https://github.com/jquery/jquery-global

2. HandlerSocket – A NoSQL plugin for MySQL

講者: Jui-Nan Lin (PIXNET)
Slide: HandlerSocket – A NoSQL plugin for MySQL

會後有部份聽眾提出了一些問題,PIXNET 也已經回報給 MySQL 請他們修復這些問題,可以參考 gslin 大神回覆的這篇: MySQL HandlerSocket 的情況…,不過 NoSQL 有個缺點就是沒有帳號密碼,這部份蠻好解覺的,因為 DB 都直接放在後面,前面加上防火牆就好了。

3. Use command line tool in Python

講者:hychen
Slide: Use command line tool in Python

此主題前面先介紹 Python command line 一些基本技巧,最後講到 ucltip 這支 hychen 撰寫的 Python tool。

import commands
ret=commands.getoutput('ls -al')

subprocess - Replacing os.system (不支援 shell 變數)

subprocess.call(['ls', '-al'])
subprocess.call(['ls', '-al', '$HOME'])

所以利用 shlex 將變數轉換 (處理 argument, parameter)

4. 從 U-boot 移植 NDS32 談嵌入式系統開放原始碼開發的一些經驗

講者:macpaul
Slide: 從 U-boot 移植 NDS32 談嵌入式系統開放原始碼開發的一些經驗

這場是我覺得第一天講得最好的,可能現在大部分科技業都在實做嵌入式系統,所以聽起來特別有感覺,裡面包含一些 Linux Kernel C 語言開發程式的 Codeing Style,這塊我認為相當重要阿,每次看到同事的程式碼,幾乎沒有排版過,看到眼睛相當不舒服,講者介紹了 u-boot 的歷史,還有本篇最重要的就是如何提交 (submit) patch,講者被國外打很多槍的經驗分享,雖然自己本身是 FreeBSD committer,知道這些格式都很重要,FreeBSD 有自訂指令 follow 的格式,那 Kernel Driver 部份也是有 standard。講者介紹兩套 diff patch tool: filterdiff, splitdiff。Coding Style 請參考底下:

當然版本控制主推 Git 了,現在幾乎所有 Kernel 版本都是用 git 下去維護。

5. Trading with opensource tools, two years later

講者:Chia-liang Kao
Slide: Trading with opensource tools, two years later

此講者利用 Perl 開發了一套分析一些股市債倦的系統,幫助自己下單,其實還蠻屌的,分享了開發上實做的一些經驗,以及主機的規劃,由於作者喜歡泡溫泉,所以取名 Trade Spring,大家有興趣可以看看投影片

6. Yappo Groonga – with japanese search software history

講者:yappo
Slide: Yappo Groonga – with japanese search software history

講者介紹一套在日本文字上面開發的 Search engine,官方網站:groonga.org,在現場其實它很想用英文表達很多意思,可是好像也表達不出來,有些階段是用日文,但是有時候用英文,看了文件都只有支援日文,講者也提到現在已經快把英文文件寫好了,我自己本身是用 Sphinx,在本網站搜尋可以找到 Sphinx 相關文件

第一天早上超早去,結果不小心在微軟攤位抽到一本 jQuery 實戰手冊,早起的鳥兒有蟲吃,我看阿民也有抽到 XD。

Related View

七月 30, 2010

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» [網站] 好站連結 (七) Android, javascript, Css, PHP, Perl, FreeBSD, Linux

Windows C# C# 比較字串 MSDN 比較字串 Request.Form Collection Request Query String / Form Parametrs ...詳全文(共1347字)

十一月 3, 2009

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» [Perl&PHP] time() and Class::Date 日期轉換運算

為了看個 MLB 美國職棒,寫了一個網站:美國職棒影片收集站,裡面的內容影片連結,以及連結說明,都是利用 Perl 搭配 MySQL 資料庫,以及 CodeIgniter PHP Framework 寫出來的,美國 MLB 開打時間,會比台灣晚一天的時差,所以在 PHP 跟 Perl 都要針對時間作修改以及轉換運算,那底下會寫 PHP 跟 Perl 如何控制時間,還有資料庫如何設計,會比較適當。

PHP 日期轉換

MySQL 在資料庫時間格式方面,最主要常見的兩種儲存方式,一種就是 MySQL 預設 datetime,顯示的格式就會像是 2009-11-03 20:10:43,另一種就是存成 UNIX time 格式,可以設定為 int(11),這兩種其實都可以使用,在 phpBB2 是採用後者的方式,因為 open source 要支援多種資料庫,但是又要統一程式碼,所以乾脆用 UNIX 的時間標記,這樣比較好轉換時區,如果使用 UNIX 格式,可以利用 time() 函式來取的。

#
# 得到目前系統 UNIX 時間
echo time();
# 下個禮拜時間
$nextWeek = time() + (7 * 24 * 60 * 60);
# 7 days; 24 hours; 60 mins; 60secs
# 另一種可以用 mktime 來取得系統 UNIX 時間
# 今天日期的 UNIX 時間
echo mktime(0,0,0, date("Y"),date("m"),date("d"));

所以我們可以存放到 mysql 資料庫,利用 time() 來 INSERT,接下來如何顯示時間:date() 函式

# 利用 date() 函式
$time = time();
echo date("Y-m-d H:i:s", $time);
$nextWeek = time() + (7 * 24 * 60 * 60);
echo date("Y-m-d H:i:s", $nextWeek);

如果資料庫格式用 datetime,那取出來的值必定是 Y-m-d H:i:s 格式,那如何轉成 UNIX time 呢,可以用 strtotime

#
# 將標準時間放入第一參數
echo strtotime("2009-10-10 20:22:10");
echo strtotime("now");

結論是
1. 如果資料庫用 int(11),就利用 date(), mktime(), time() 轉換成時間格式
2. 如果資料庫用 datetime,就利用 strtotime() 轉換成 UNIX time 來做日期相加減

Perl 日期轉換

CPAN 裡面找到 Class-Date,裡面就有我想要的日期相加減,以及如何轉換到昨天前天格式,FreeBSD 請找到 devel/p5-Class-Date

cd /usr/ports/devel/p5-Class-Date; make install clean

使用方法請參考底下:

# creating absolute date object (local time) 建立日期物件
$date = now; #同等於 $date = date(time);
# getting values of an absolute date object 取得物件內容
$date->year;        # year, e.g: 2001
$date->_year;       # year - 1900, e.g. 101
$date->yr;          # 2-digit year 0-99, e.g 1
$date->mon;         # month 1..12
$date->day;         # day of month
$date->epoch;       # UNIX time_t 取得 UNIX 時間
# 美國時間減一天
my $now = now - '1D';
my $now_day = sprintf("%04d-%02d-%02d", $now->year, $now->month, $now->mday);
my $now_month = sprintf("%04d-%02d", $now->year, $now->month);

Related View

八月 31, 2009

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» [FreeBSD] 取得 FreeBSD CVSUP 的更新狀態

FreeBSD CVS Site_1251699923593 (by appleboy46)
在 Sayya Joehorn 個人版看到有人實做出偵測台灣 CVSUP Server 更新狀態,以及更新的時間,也有程式碼的釋出,參考這篇:Script: 取得 FreeBSD CVSUP 的更新狀態,這篇寫的蠻清楚的,只需要 perl 跟 php 就可以完成,不過在使用過程有些事項必須要注意,在 FreeBSD 6.2 R 之後,已經內建了 csup 指令來更新 ports 或者是核心,所以要在另外安裝上 cvsup ports 套件,在 Perl 方面,也先裝 net/p5-Net-Rendezvous 才可以正確使用。

# 安裝必備軟體
cd /usr/ports/net/p5-Net-Rendezvous/ && make install clean
cd /usr/ports/net/cvsup-without-gui && make install clean


Perl 程式碼我有改過一些,不然沒辦法抓到正確資訊:

#!/usr/bin/perl
 
# Check the update status for CVSUP servers
# Copyright (C) 2007 - Shen Cheng-Da (cdsheen AT gmail.com)
# modified by appleboy (appleboy.tw AT gmail.com) 2009.08.31
 
use POSIX qw(strftime);
use Net::DNS;
use Time::HiRes qw( gettimeofday tv_interval );
 
@servers = qw( www.cn.ee.ccu.edu.tw cvsup.tw.freebsd.org cvsup1.tw.freebsd.org cvsup2.tw.freebsd.org
                cvsup3.tw.freebsd.org cvsup4.tw.freebsd.org cvsup5.tw.freebsd.org
                cvsup6.tw.freebsd.org cvsup7.tw.freebsd.org cvsup8.tw.freebsd.org
                cvsup9.tw.freebsd.org cvsup10.tw.freebsd.org cvsup11.tw.freebsd.org
                cvsup12.tw.freebsd.org cvsup13.tw.freebsd.org cvsup14.tw.freebsd.org );
 
$dir    = '/home/cvsup-monitor';
 
$cvsup  = '/usr/local/bin/cvsup';
$base   = $dir . '/base';
$log    = $dir . '/check.log';
 
chdir( $dir ) || die "ERROR: Can not change to directory [$dir]\n";
 
mkdir( $base, 0755 ) unless -d $base;
 
@files_src = qw( CVSROOT-src/commitlogs/CVSROOT CVSROOT-src/commitlogs/bin
                CVSROOT-src/commitlogs/etc CVSROOT-src/commitlogs/contrib
                CVSROOT-src/commitlogs/gnu CVSROOT-src/commitlogs/games
                CVSROOT-src/commitlogs/include CVSROOT-src/commitlogs/lib
                CVSROOT-src/commitlogs/release CVSROOT-src/commitlogs/sys
                CVSROOT-src/commitlogs/sbin CVSROOT-src/commitlogs/share
                CVSROOT-src/commitlogs/tools CVSROOT-src/commitlogs/user
                CVSROOT-src/commitlogs/usrbin CVSROOT-src/commitlogs/usrsbin );
 
@files_ports = qw( CVSROOT-ports/commitlogs/CVSROOT
                   CVSROOT-ports/commitlogs/ports);
 
$includes = '';
foreach $f ( @files_src ) {
        $includes .= " -i $f";
}
foreach $f ( @files_ports ) {
        $includes .= " -i $f";
}
 
open( LOG, ">$log");
 
my $resolver = Net::DNS::Resolver->new;
 
$resolver->usevc(1);
$resolver->udp_timeout(5);
$resolver->tcp_timeout(5);
$resolver->retrans(3);
$resolver->retry(2);
$resolver->persistent_tcp(1);
 
foreach $server ( @servers ) {
        my $query = $resolver->query($server, 'A');
        @ipaddr = @cname = ();
        if( $query ) {
                foreach $rr ($query->answer) {
                        if( $rr->type eq 'A' ) {
                                print LOG "$server => [A] ".$rr->address."\n";
                                push( @ipaddr, $rr->address );
                        }
                        elsif( $rr->type eq 'CNAME' ) {
                                print LOG "$server => [CNAME] ".$rr->cname."\n";
                                push( @cname, $rr->cname );
                        }
                }
        }
        $ip = $ipaddr[0];
        $ipaddr = join( '|', @ipaddr );
        $cname  = join( '|', @cname  );
 
        $ibase   = "$base/$server";
        mkdir( $ibase, 0755 ) unless -d $ibase;
        mkdir( "$ibase/SRC", 0755 ) unless -d "$ibase/SRC";
 
        $cmd = "$cvsup -b $ibase -h $ip -L 0 -r 0 $includes $dir/cvs-supfile";

        $time_start = [gettimeofday];
        system($cmd);
        $elapsed = tv_interval( $time_start );
        printf LOG ("$server => cvsup on $ip elapsed %.2fs\n", $elapsed);
 
        unless( $? ) {
                $mt_src = $mt_ports = 0;
                foreach $f ( @files_src ) {
                        $t = (stat( "$f" ))[9];
                        $mt_src = $t if $t > $mt_src;
                }
                foreach $f ( @files_ports ) {
                        $t = (stat( "$f" ))[9];
                        $mt_ports = $t if $t > $mt_ports;
                }
                open( REC, ">$ibase/last-commit.txt" );
                printf REC ("$mt_src,$mt_ports,%.2f,$ipaddr,$cname",$elapsed);
                close(REC);
 
                printf LOG ("$server => SRC: %s\n",
                        strftime("%Y/%m/%d %H:%M:%S", localtime($mt_src)) );
                printf LOG ("$server => PORTS: %s\n",
                        strftime("%Y/%m/%d %H:%M:%S", localtime($mt_ports)) );
        }
}
 
close(LOG);

PHP 顯示部份,這邊就沒有動到,直接 copy 就可以

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>FreeBSD CVS Site </title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<style type="text/css">
  td       { font-size: 12px; vertical-align: top }
  td.head  { background: #FFFFC0 }
  td.c     { background: #E0E0FF }
  td.red   { background: #FFE0E0 }
  td.green { background: #E0FFE0 }
</style>
</head>
<body>

<table border=1 cellspacing=0 cellpadding=2>
<tr><td class=head>Server Name</td><td class=head>IP</td>
<td class=head>CNAME</td><td class=head>latest commit of src</td>
<td class=head>latest commit of ports</td>
</tr>
<?
        $dir = '/usr/home/cvsup-monitor';
        $servers = array(
              'www.cn.ee.ccu.edu.tw', 'cvsup.tw.freebsd.org',  'cvsup1.tw.freebsd.org',  'cvsup2.tw.freebsd.org',
              'cvsup3.tw.freebsd.org', 'cvsup4.tw.freebsd.org', 'cvsup5.tw.freebsd.org',
              'cvsup6.tw.freebsd.org', 'cvsup7.tw.freebsd.org', 'cvsup8.tw.freebsd.org',
              'cvsup9.tw.freebsd.org', 'cvsup10.tw.freebsd.org', 'cvsup11.tw.freebsd.org',
              'cvsup12.tw.freebsd.org', 'cvsup13.tw.freebsd.org', 'cvsup14.tw.freebsd.org' );
        $check = time() - 86400;
        $time_format = '%Y/%m/%d %H:%M:%S';
        $latest_src = $latest_ports = 0;
        foreach( $servers as $server ) {
                $data = @file_get_contents("$dir/base/$server/last-commit.txt");
                $data = trim($data);
                if( $data != '' ) {
                        $SERVER[$server] = explode(',', $data);
                        if( $SERVER[$server][0] > $latest_src )
                                $latest_src = $SERVER[$server][0];
                        if( $SERVER[$server][1] > $latest_ports )
                                $latest_ports = $SERVER[$server][1];
                }
        }
        foreach( $servers as $server ) {
                if( is_array($SERVER[$server]) ) {
                        list( $src, $ports, $elapsed, $ipaddr, $aliases ) = $SERVER[$server];
                        $ipaddr = str_replace( '|', '<br />', $ipaddr );
                        $aliases = str_replace( '|', '<br />', $aliases );
                        if( $aliases == '' )
                                $aliases = '&nbsp;';
                        print "<tr>\n";
                        print "  <td class=c>$server</td>\n";
                        print "  <td class=c>$ipaddr</td>\n";
                        print "  <td class=c>$aliases</td>\n";
                        if( $src == $latest_src )
                                print "  <td class=green>";
                        elseif( $src < $check )
                                print "  <td class=red>";
                        else
                                print "  <td class=c>";
                        print strftime( $time_format, $src ) . "</td>\n";
                        if( $ports == $latest_ports )
                                print "  <td class=green>";
                        elseif( $ports < $check )
                                print "  <td class=red>";
                        else
                                print "  <td class=c>";
                        print strftime( $time_format, $ports ) . "</td>\n";
#                       print "  <td align=right>$elapsed s</td>\n";
                        print "</tr>\n";
                }
        }
?>
</table>
</body>
</html>

Related View

七月 1, 2009

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» [Perl] 解決 Wide character in print with UTF-8 mode

最近在寫 Perl 的程式,發現在正規比對的時候,print 出中文資料會出現 “Wide character in print at” 的 warning 訊息,在 google 找到一篇解決方法:Perl with UTF-8 mode,這篇提出的解決方法有很多種,comment 留言也有提供解法,可以去看一下,還蠻不錯的,那底下是我參考的解法:

只要在表頭加上:

use utf8;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');

完整的檔案如下:

#! /usr/bin/perl -w
use Carp;
use File::Basename;
use LWP::Simple;
use WWW::Mechanize;
use LWP::UserAgent;
use WWW::Shorten '0rz';
use Getopt::Std;
use DBI;
use utf8;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');
if($_ =~ m/\s*<div\s*class="title"><a\s*href=".+">(.+)<\/a><\/div>\s*/)
{
  $pic_desc = $1;
  print "desc: " . $1 . " \n" if $verbose;
}

Related View

六月 17, 2009

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» [MySQL] 利用 perl 單行印出 my.cnf

MySQL Performance Blog 裡面發現這篇:How to pretty-print my.cnf with a one-liner,利用一行 perl 指令把 my.cnf 的註解拿掉:

perl -ne 'm/^([^#][^\s=]+)\s*(=.*|)/ && printf("%-35s%s\n", $1, $2)' /etc/my.cnf

輸出為:

[client]
port                               = 3306
socket                             = /tmp/mysql.sock
[mysqld]
port                               = 3306
socket                             = /tmp/mysql.sock
skip-locking
key_buffer                         = 256M
max_allowed_packet                 = 1M
table_cache                        = 256
sort_buffer_size                   = 1M
read_buffer_size                   = 1M
read_rnd_buffer_size               = 4M
myisam_sort_buffer_size            = 64M
thread_cache_size                  = 8
query_cache_size                   = 16M
thread_concurrency                 = 8
log-slow-queries                   = /var/log/mysql/mysql-slow.log

當然同樣的,你也可以利用在 php.ini 或者是其他設定檔上面,提供我平常用 bash 指令來做的,只是沒有經過排版:

cat /usr/local/etc/php.ini | grep -v '^$' | grep -v '^[;]'

上面同樣的把空白行,以及開頭為 ; 的註解拿掉,同樣是可以做到。

Related View

七月 14, 2008
» [tips] rewrite debian/ubuntu 's lighttpd conf script from perl to python

Today I want to port lighttpd on another platform which basically a debian sarge system but without perl and dpkg package system on it. Since it's a debian based platform so I start from porting debian's binary lighttpd package, however I've found there're some perl script lays in /usr/share/lighttpd which are used when lighttpd startup.

While I can easily dump the result of perl script into a textfile,
and then startup my lighttpd correctly, I thought "maybe port it to python is not a bad idea." (since my target platform has python!), so here is the effort:
create-mime.assign.py

#!/usr/bin/python
#
# This script directly translate from debian's lighttpd perl script:
# create-mime.assign.pl
#
# Author: timchen119.at.nospam.gmail.com
# License: Public Domain
#
import sys

try:
f = open("/etc/mime.types",'r')
extensions = {}
print "mimetype.assign = ("
for line in f:
line = line.strip()
if line.startswith('#'): continue
if line != "":
splitlist = line.split()
if len(splitlist) < 2: continue
mime = splitlist[0]
for ext in splitlist[1:]:
if ext in extensions.keys(): continue
extensions[ext] = 1
print '".%s" => "%s",' % (ext,mime)
f.close()
print ")"
except Exception,e:
print e
sys.exit(1)


include-conf-enabled.py
#!/usr/bin/python
#
# This script directly translate from debian's lighttpd perl script:
# include-conf-enabled.pl
#
# Author: timchen119.at.nospam.gmail.com
# License: Public Domain
#

import os,glob

confdir = "/etc/lighttpd/"
enabled = "conf-enabled/*.conf"

os.chdir(confdir)

for file in sorted(glob.glob(enabled)):
print 'include "%s"' % file

use-ipv6.py
#!/usr/bin/python
#
# This script directly translate from ubuntu's lighttpd perl script:
# use-ipv6.pl
#
# Author: timchen119.at.nospam.gmail.com
# License: Public Domain
#

import socket

##this sometimes not accurate. (like in vserver mode)
#if socket.has_ipv6:
#

try:
if socket.socket(socket.AF_INET6,socket.SOCK_STREAM,0):
print 'server.use-ipv6 = "enable"'
except:
pass

All of these files can be found in http://kalug.linux.org.tw/~tim/lighttpd-debian-python-script/
Well something quite interesting happened when I port the debian's create-mime.assign.pl into python, It's that my python script's final result is not equivalent to perl one and has more mime types than its :
--- perlmime.txt    2008-07-14 15:29:23.000000000 +0800
+++ pymime.txt 2008-07-14 15:29:33.000000000 +0800
@@ -114,6 +114,11 @@
".dvi" => "application/x-dvi",
".rhtml" => "application/x-httpd-eruby",
".flac" => "application/x-flac",
+".pfa" => "application/x-font",
+".pfb" => "application/x-font",
+".gsf" => "application/x-font",
+".pcf" => "application/x-font",
+".pcf.Z" => "application/x-font",
".mm" => "application/x-freemind",
".gnumeric" => "application/x-gnumeric",
".sgf" => "application/x-go-sgf",
@@ -193,6 +198,11 @@
".pk" => "application/x-tex-pk",
".texinfo" => "application/x-texinfo",
".texi" => "application/x-texinfo",
+".~" => "application/x-trash",
+".%" => "application/x-trash",
+".bak" => "application/x-trash",
+".old" => "application/x-trash",
+".sik" => "application/x-trash",
".t" => "application/x-troff",
".tr" => "application/x-troff",
".roff" => "application/x-troff",
@@ -282,6 +292,7 @@
".tgf" => "chemical/x-mdl-tgf",
".mcif" => "chemical/x-mmcif",
".mol2" => "chemical/x-mol2",
+".b" => "chemical/x-molconn-Z",
".gpt" => "chemical/x-mopac-graph",
".mop" => "chemical/x-mopac-input",
".mopcrt" => "chemical/x-mopac-input",

So I start to dig why this happened, and I've found a strange perl regex filter all these mimetypes out, I believe it's a minor bug in original perl program. (or it does implicitly doing something meaningful? well I can't figure it out.)
--- create-mime.assign.pl    2008-07-14 15:35:58.000000000 +0800
+++ create-mime.assign.pl.new 2008-07-14 15:36:07.000000000 +0800
@@ -7,7 +7,7 @@
chomp;
s/\#.*//;
next if /^\w*$/;
- if(/^([a-z0-9\/+-.]+)\s+((?:[a-z0-9.+-]+[ ]?)+)$/) {
+ if(/^([A-Za-z0-9\/+-.~%]+)\s+((?:[A-Za-z0-9.+-~%]+[ ]?)+)$/) {
foreach(split / /, $2) {
# mime.types can have same extension for different
# mime types

replace this line and this will produce same results as mine.

usage:
just copy these py scripts to /usr/share/lighttpd
and change these lines if you're using debian based system
#### external configuration files
## mimetype mapping
#include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/create-mime.assign.py"

## load enabled configuration files,
## read /etc/lighttpd/conf-available/README first
#include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.py"

A Feedjack powered Planet
A Django site.