作者彙整: dada

關於「dada」

I'm dada

svndumpfilter with wildcards support ?

Subversionsvnadmin obliterate 功能一直沒有實作出來,這實在是有點麻煩,尤其是當負責管理一個 repository 時,常常就會有人把 *.exe, *.obj, *.lib, *.a 統統給 commit 進去了….

然後你就會發現整個 repository 長大的速度越來越快,就算事後用 svn delete 把它砍掉還是無濟於事,因為那已經成為無法抹滅的歷史了

雖然可以事先設定 svn:ignore 來解決,不過偶而還是會有漏網之魚,官方提供的解決方法是使用 svndumpfiler 來把不要的檔案徹底從歷史記憶中濾除

# svnadmin create REPOS2
# svnadmin dump REPOS1 | svndumpfilter exclude XX.exe | svnadmin load REPOS2

這方法當然沒有 svnadmin obliterate 好,不過也是目前狀況下不得不的作法

但是這個方法最大的問題在於 svndumpfilter 無法接受 wildcards (萬用字元),也就是你無法指定 svndumpfilter exclude ‘*.exe’

所以,萬一不小心遇上了機車的狀況,你可能要一個一個把檔名找出來濾掉 XD

所以不久前就想辦法修改了 svndumpfilter 的程式,把它加上直接濾除特定副檔名檔案的功能…

[patch to subversion/svndumpfilter/main.c]
(the filename with leading dot will be matched against filename extension)

--- subversion/svndumpfilter/main.c.orig
+++ subversion/svndumpfilter/main.c
@@ -111,7 +111,12 @@
       pfx_len = strlen(pfx);
       if (path_len < pfx_len)
         continue;
-      if (strncmp(path, pfx, pfx_len) == 0)
+      if( pfx[0] == '.' )
+      {
+        if( strncmp( path+path_len-pfx_len, pfx, pfx_len ) == 0 )
+          return TRUE;
+      }
+      else if (strncmp (path, pfx, pfx_len) == 0)
         return TRUE;
     }
 
@@ -1257,7 +1262,8 @@
             style, and absolute. */
        SVN_INT_ERR(svn_utf_cstring_to_utf8(&prefix, os->argv[i], pool));
        prefix = svn_path_internal_style(prefix, pool);
-       prefix = svn_path_join("/", prefix, pool);
+       if( prefix[0] != '.' )
+          prefix = svn_path_join("/", prefix, pool);
        APR_ARRAY_PUSH(opt_state.prefixes, const char *) = prefix;
      }
  }

這個 patch 有點投機取巧,因為我懶得真的去實作 wildcards,我需要的功能只要能濾除指定的副檔名就可以了…

所以這個 patch 把原來 svndumpfilter include/exclude 後面接的檔名參數作特殊判斷,只要第一字元是小數點,就當作要去 match 的副檔名,因此,要濾除 *.exe 只要這樣作就可以了:

# svnadmin create REPOS2
# svnadmin dump REPOS1 | svndumpfilter exclude .exe | svnadmin load REPOS2

剛好看到前幾天也有人寫了個 PATCH 讓 svndumpfilter 完全支援 wildcards… 不過我沒試過,相信不久的將來應該會被整合進正式版本中

當然最希望還是 svmadmin obliterate 能早日被支援,就不用這麼辛苦了

Zooomr 終於有照片上傳工具了!

話說 Zooomr 已經推出有一段時間了,功能是很多沒錯,而且又有免費的 2.5GB/month 的 PRO 級帳號可申請

只是可惜一直以來都沒有 upload tool 可用,導致只能一張一張從網頁上傳,所以沒能好好利用它的空間…

不過好消息來了,就是新版的 jUploadr 除了支援 Flickr 之外,現在也開始支援 Zooomr 了!

雖然上傳的速度有點慢,不過現在我可以很容易把照片一拖拉庫都丟上去了,而理所當然,第一本丟上去的相簿當然就是昨天登玉山的照片囉…

使用 bcompiler 來編譯(加密)您的 PHP 原始碼

Using bcomipler to compile (encode) your PHP script (in FreeBSD)

eAccelerator 的 encoder 在 PHP 5.1 以後就無法運作了,使是最新的版本 0.9.5 也不行,因此如果您還想用 eAccelerator 的 encoder,乖乖待在 PHP 4.x or PHP 5.0 吧,相關資訊可參考之前的兩篇文章:

根據 mailing list 上面作者最新的說法,短期內應該都還不會修復,甚至有可能還會放棄支援 encoder 部份,作者還推薦大家改用 bcompiler … orz
所以如果你跟我一樣必須要用 PHP 5.1 的話,就跟我一起來玩看看 bcompiler

附帶一提,原本是要買 ionCube 公司開發的 PHP Encoder 的,這看來是目前編譯(加密)PHP 原始碼最好的選擇,價格也不算貴,而且花的是公司的錢,不過還是先試用看看 bcompiler 好了,真的不好用的話,再來買囉

以下的安裝與使用說明均以 FreeBSD 為範例,其他作業系統應該也差不多,請自己試看看吧

在正式安裝之前提醒你,bcompiler 會用到 bzip2 這個 extension,所以先安裝一下 php5-bz2:

# cd /usr/ports/archivers/php5-bz2
# make install clean

bcompiler 是一個收容於 PECL 的 PHP extension,您可以直接使用 pecl 這個命令來安裝,而 pecl 的使用方法與 pear 相同,因此你必須先安裝 pear :

# cd /usr/ports/devel/pear
# make install clean

pear 安裝好後,同時會有一個 pecl 命令可用 (/usr/locel/bin/pecl),可用它來安裝 bcompiler

pecl install channel://pecl.php.net/bcompiler-0.8

不過呢,我發現直接執行 pecl 會發生錯誤(至少在 FreeBSD 下是如此):

# pecl
Fatal error: Call to undefined function preg_match() in ...

問題出在 /usr/local/bin/pecl 這個 script 的最後一行:

exec $PHP -C -n -q $INCARG -d output_buffering=1 -d safe_mode=0 ...

這一行的 -n 這個選項代表不載入 php.ini 設定檔,因此 pcre.so 就沒有被載入,
然後你就看到上面的錯誤了,所以自己去改一下程式把 -n 拿掉吧….

拿掉之後,安裝程式應該就可以正常運作了了:

pecl install channel://pecl.php.net/bcompiler-0.8

安裝好後,記得要改設定把 bcompiler 這個 extension 載入

# echo "extension=bcompiler.so" >> /usr/local/etc/php/extensions.ini

bcompiler 全名是 PHP bytecode Compiler,詳細的使用方法可以參考 PHP 網站上的詳細說明: PHP bytecode Compiler: http://www.php.net/manual/en/ref.bcompiler.php

看不懂的話,bcompiler_write_file() 這個 function 的說明裡面有範例:

$fh = fopen("example.phb", "w");
bcompiler_write_header($fh);
bcompiler_write_file($fh, "example.php");
bcompiler_write_footer($fh);
fclose($fh);

為了易於使用,我寫了一個簡單的 script,使用方法如下:

BENCODER v1.3 - Encode your PHP script using bcompiler

Usage: bencoder [-f] [-q] -o FILE    file1.php
       bencoder [-f] [-q] -o OUTDIR  file1.php file2.php ...
       bencoder [-f] [-q] -o OUTDIR  -s SRCDIR  [-e SUFFIX] [-r] [-c] [-l]

  -o FILE   : the file name to write the encoded script
              (default to '-encoded.XXX' suffix)
  -o OUTDIR : the directory to write all encoded files

  -a SRCDIR
  -s SRCDIR : encode all files in this source directory

  -r        : encode directories recursively (no by default)
  -f        : force overwriting even if the target exists
  -e SUFFIX : encode the files with the SUFFIX extension only (default: php)
              (regular expression allowed, ex: "php|inc")
  -c        : copy files those shouldn't be encoded (no by default)
  -l        : follow symbolic link (no by default)
  -q        : do not print the file name while encoding or copying
  -b
  -bz2      : compress the encoded files with bz2 (needs bzip2-extension)

想用的人到 這邊 自己抓回去玩玩看吧

# wget http://bencoder.urdada.net/bencoder
# chmod 755 bencoder
# mv bencoder /usr/local/bin/

在把程式使用 bcompiler 編碼之後,執行的時候發覺 $_SERVER 以及 $_ENV 的變數都不見了,後來查了資料,才發現要把 auto_globals_jit 關掉 (Off) 才行,請直接修改您的 php.ini :

; When enabled, the SERVER and ENV variables are created when they're first
; used (Just In Time) instead of when the script starts. If these variables
; are not used within a script, having this directive on will result in a
; performance gain. The PHP directives register_globals, register_long_arrays,
; and register_argc_argv must be disabled for this directive to have any affect.
auto_globals_jit = Off

Boston 近郊旅遊

四月底到美國東岸出差,不巧正好碰上 Boston 的雨季,所以幾乎都只能待在旅館內,只有幾天碰上難得好天氣可以出去玩

這一天放假,剛好天氣不錯,就和 Hsian 兩個人開著租來的車車,利用車上的 GPS 導航設備選了幾個景點準備讓科技帶我們到處走走囉

首先我們想去海邊,所以就把 GPS 定位到位於 Boston 東南方的「Plymouth」港口,這裡是1620年從英國運送清教徒的船隻「五月花號」登陸的地方,後來在這邊簽了一份《五月花協定》(Mayflower Compact)。這份自治宣言後來成了《獨立宣言》和《美國憲法》的先驅。

在這邊,我們看到了一艘仿製五月花號的船隻「Mayflower II」以及古老的登陸踏腳石「Plymouth Rock

然後,我們把 GPS 定位到 Boston 西北邊的「Concord」,在這邊我們遊覽了「Walden Pond」以及走訪了美國古老的戰場 MINUTE MAN NATIONAL HISTORICAL PARK),這邊是1775年美國爆發獨立戰爭的第一聲槍響的地方

最後,我們把 GPS 定位到 Boston 東北邊的 Gloucester、Rockport,這是一個漁港小鎮,我們一個禮拜後還再來了一次享受超便宜的龍蝦大餐,一人一隻大龍蝦只要12塊美金

重點來了,我們在 Rockport 附近找到一個州立保留區 Halibut Point State Park,其實這是一個以前的採石場,後來廢棄後蓄水成一個小湖,感覺就是很漂亮的美景,配合夕陽光輝,這一天過得真是十分充實且愉快

和信超媒體以 1790 萬美元出售 ADSL

和信超媒體 今天 宣佈 將以 1790 萬美元(約 5.7 億台幣)出售 ADSL 業務給 Webs-TV

此交易包含部份營運用固定資產以及 62000 個 ADSL 用戶,並允許 Webs-TV 使用 GIGA 品牌一段時間

初期基本上的營運還是由和信超媒體負責,和信超媒體會收取代管營運費用

此交易並不包含 Cable Modem 用戶以及原有和信超媒體以及和網寬頻的企業用戶

ADSL 的毛利率愈來愈小,和信超媒體的母公司 GigaMedia 打算將資金投入其他毛利率更高的事業

和信超媒體原是 Cable Modem 營運商,自 2001 年投入 ADSL 營運的行列,至今約五年的時間,五年來和信超媒體創造了幾個紀錄:

2001年剛推出時,和信超媒體是台灣第一家 ADSL 使用計時制(PPPoE)發放固定 IP 的業者(單機型產品),同時當時推出的頻寬方案為 768k/128k,在當時其他 ISP 仍主推 512k/64k 時順利突圍搶佔市場。

2002年,和信超媒體更是台灣獨家首創採用 DHCP 方式發放浮動 IP,更一舉提供高達 16 個 IP(多機型產品)

2004年,和信超媒體更首創浮動結合固定制,讓 DHCP 浮動 IP 與可設在電腦網卡上的固定 IP 同時並存的產品(多機型12浮動+4固定IP)讓用戶有更多元的選擇

可惜中華電X的壟斷以及居高不下的電路費成本還是讓所有 ADSL ISP 的毛利率嚴重被侵蝕
此次出售的動作應該會讓財報好看一點.. 且協助營運至少有保證的固定的收入

Webs-TV 則是以網路電視起家的網路內容營運商,藉由併購寬頻 ISP,預期將會有更大的整合行銷效益。祝福 Webs-TV 接下 GIGA ADSL 這個招牌能夠更把它發揚光大!

FreeBSD Software RAID-1 (gmirror)

手邊某台伺服器的 root 硬碟太小了(只有 8GB),然後上面又丟了很多重要的東西,所以一直想把它給換成大一點的,剛好手邊有一些換下來的 18GB 硬碟備品,就決定來換一下,並玩玩 Software RAID-1 (Mirror)

首先是把系統碟先換到比較大顆的硬碟,步驟請參考:

FreeBSD Handbook: How do I move my system over to my huge new disk?

接下來就要玩玩 Software RAID-1 (Mirror) 了

過去 FreeBSD 下面 Software RAID 的作法大多使用 vinum,但 vinum 的用法比較複雜,而且似乎只能適用新的分割區,無法對原有的硬碟直接建立一份 Mirror。

GEOM Mirror (gmirror) 是一種從 FreeBSD 5.3 開始支援的新 Software RAID-1,尤其適用於系統碟 (root partition)。

關於 FreeBSD 下面幾種 Disk Mirroring 的作法,可參考:

FreeBSD System Disk Mirroring – How to establish a RAID-1 for the system partitions

詳細的作法可參考這篇文章:

ONLamp.com: Using Software RAID-1 with FreeBSD

對舊硬碟設定一下,然後重開機後,把新硬碟加上去,再稍微設定一下,十分鐘內就搞定了!

最方便的是,使用 GEOM Mirror 建立的系統碟在系統內部並不會有特殊設定檔,所有的設定是直接放在硬碟最後一個磁區的 metadata 內,而且使用 gmirror RAID-1 的系統碟可以隨時切換用任何一顆開機,不會有任何問題

除了 gmirror 提供 RAID-1 之外,同樣採用 GEOM 架構的程式還有 gstripe (RAID-0) 及 graid3 (RAID-3),有興趣的人可以玩看看…