JeffHung.Blog

(My smile insists of having nose. :-)

再探 wcfind -- 用 find2perl 實作

本系列目前有四篇文章,建議依照以下順序閱讀:

wcfind - avoid find(1) into subversion meta directories
use grep(1) accompany with my wcfind via xargs(1)
Setting svn:keywords in many files simultaneously
再探 wcfind — 用 find2perl 實作

由於 CVS、Subversion 這類的 version control systems,通常會在 working copy 目錄下,建立如 CVS/、.svn/ 的 meta directories,使得一些 command-line 工具會水土不服。例如,grep 會連 .svn/ 目錄下的檔案都去尋找,不僅拖慢速度,更讓結果雜亂,難以使用。因此,很久以前,我參照了 Ben Reser 的作法,弄了一個 wcfind 給自己用。
可是,之前的 wcfind 是使用 Bourne Shell 實作,並依賴於 FreeBSD 下的 find [...]

"mail".toUpperCase() 不等於 "MAIL"?

(這是一篇積存的舊文,文中的連結可能已經失效,請見諒。)
從這篇《Comment On Extra Sensitive Case Insensitivity》的 comments 裡,看到一段有趣的程式:

下面這段 Java 並非永遠回傳 true。

"mail".toUpperCase().equals("MAIL")
因為,在土耳其,"i" 的大寫不是 "I"。

不過因為我不懂土耳其文,所以無法驗證這個說法的正確性。

pkginfo2dot.pl - draw freebsd installed package dependencies

承襲上篇《dsw2dot.pl - extract and draw project dependencies》,又手癢寫了 pkginfo2dot.pl,將 freebsd 裡已安裝的 packages,彼此之間的 dependencies 畫出來。這個 script 的 usage 如下:
Usage: pkginfo2dot.pl [ <option> ... ] <dot-file> <pkg-glob> ...

Generate graphviz digraph script <dot-file> according to pkg_info(1) outputfor package <pkg-glob>s..  If path of digraph script <dot-file> is a singledash, will output to standard output.

Options:

  -h,--help               Show this help message.  -n,--name <graph-name>  Set [...]

dsw2dot.pl - extract and draw project dependencies

很多時候,build 程式時最後會死在 link error,一堆 symbol 會找不到。最後追查下來,通常會發現是 project dependencies 沒有設好的緣故。由於是「找不到」而不是「用得不對」,因此我們通常得用 grep 之類的工具,從十幾萬行的程式裡,去尋找遺失的 symbol 在哪裡。當一個 dependency 忘記設時,可能遺失的 symbols 會達上百個[1],要一個一個手動尋找時,就很討厭了。
為了避免這樣的情形,也為了方便確認目前系統各 components 的關聯情形,如同原本預計的理想狀態,我寫了一個簡單的 script,叫 dsw2dot.pl,能夠 parse VC6 的 dsw 檔,然後依據內函的各 project 檔的相依情形,產生 GraphViz 的 dot 檔 script。這樣一來,我就可以用 dot 產生 png/svg/... 等各種圖形了。
這個程式的 usage 如下:
Usage: dsw2dot.pl [ <option> ... ] <dsw-file> [ <dot-file> ]

Generate graphviz digraph script <dot-file> according to project dependenciesthat [...]

Perl with UTF-8 mode

發現其實我沒對這個作筆記,剛好和 PipperL 在他的 blog 裡聊到,就順便作個簡單的說明好了。

問題描述
為什麼要用 UTF-8 mode 執行 perl 呢?因為 Perl 的字串預設是 byte string,對於使用 ASCII 的人來說,沒有影響,但對於 CJK 使用者來說,就很麻煩。舉例來說,以下程式使用的 regular expression 會無法正確 match 出「英」字,因為其 big5 碼的第二個 byte 是 '^' 符號,導致 regular expression 錯誤:

SHELL> more -x4 plain.pl#!/usr/bin/perl -w# Source encoded in big5.my $s = '英雄人物';if ($s =~ m/英/o) { print "是我\n";}else { [...]

SubStation - Split and synchronize subversion repositories (i)

Subversion (SVN) 是一個集中式的版本控制系統,因此,其中一個主要的限制便是,在使用的時候,必須要連上網路,以便與其 server 連結。儘管在架構設計上,SVN 已經盡可能的減少網路頻寬的使用,但在正常運作上,仍然是有許多操作,是必須連結到 server 上進行的。
然而,實際上,在開發的過程當中,並不是能夠無時無刻的連結在網路上。最近我們就遇到了這樣子的一個需求,因應業務需要,我們需要有一組人,南下到客戶的工廠 on site,當場在工廠內改程式。由於環境的因素,在該處無法連結到 Internet,因此也就不可能連回位於公司內的 SVN server。因為程式複雜度的關係,這支遠在南部的特遣隊,有可能需要北部辦公室的支援,方能解決一些程式的問題,因此我們需要一套機制,讓在南部的同事,能夠與台北辦公室,進行程式碼的同步。換言之,我們需要一套機制,能夠 offline 使用 SVN。
也正是為了 offline 開發的需求,clkao 開發了 SVK 這套建基於 SVN 的工具,使開發者可以將 SVN repository 映射 (mirror) 在自己的電腦裡,離線進行開發、commit,事後在得以 online 時,再與主 SVN repository 進行同步。SVK 是套很棒的工具,然而卻還是沒有辦法滿足我們的需求。最主要的問題在於,SVK 是設計給單人使用,而我們外派到南部的,是一整組人馬,且彼此之間,也有程式碼相互同步的需求。換句話說,實際上我們需要的,是要能夠複製一份 SVN repository,並能夠在特定的時候,與主 SVN repository 同步。這樣一來,複製出來的 SVN repository,就可以作為在南部的同事們之間,協同開發的基礎。
我們希望,透過這樣子的機制,能夠在南下前,將主 repository 予以 split 出一個複本,帶到南部去工作。白天時,南下的組員們,彼此之間就使用南部的 repository 同步工作。等到晚上回到宿舍,能夠上網時,再透過 SSH tunnel,將南部的 repository,與北部的主 repository,予以 synchronize:將北部新修改的程式,送進南部的 repository 裡;亦將南部新修改的程式,送進北部的 [...]

用 TH-55 看 bloglines

PalmIsLife 的阿輝在這篇《[交流] RSS Web Host 很適合在 PDA 上瀏覽》介紹了如何使用他的 Treo 650 看 Bloglines,我才知道,原來 Bloglines 有提供 mobile 版本,如果搭配 data stream 吃到飽的 3G 門號的話,非常地吸引人。 所以我就提了兩個問題如下:

我直接用 TH-55 連上 Bloglines,畫面仍然是分 <frame> 的,並沒有出現適合 PDA 閱讀的畫面版本。請問阿輝是直接連就可以了嗎?還是用 PDA 專用的 Bloglines 網址?我的 TH-55 的瀏覽器是 NetFront v3.1 r2.0.26 (en)。
大多數的 Blog 以及 Bloglines 的網頁皆是採用 UTF-8 編碼。請問阿輝的 PDA 畫面能夠正常顯示中文,是因為有裝「Unicode 補完計畫」的關係嗎?還是用了其他特殊的技巧?

阿輝的解答是,對於第一個問題,他直接上就可以了,所以 Bloglines 沒辦法偵測我用的 NetFront v3.1,自動切換成 mobile [...]

File-based database 與 client/server-based 的效能差異

薄荷因為嫌他的 blog 速度太慢,轉而尋求其他 database back-end 的方案,比較了 MySQL、PostgreSQL、Berkeley DB 以及 SQLite 等四種解決方案。他的測試結果是:

MySQL: 3 min 17 sec
PostgreSQL: 3 min 50 sec
Berkeley DB: 4 min 32 sec
SQLite: 4 min 36 sec

我也曾經訝異於,宣稱比 MySQL 快上一籌的 SQLite,竟然會輸給 MySQL。後來搜尋文件與實驗後,才曉得,如果把 SQLite 的 sychronization (transaction) 功能關掉的話,SQLite 就可以在速度上領先 MySQL。
原理很簡單,Berkeley DB 和 SQLite 這種 file-based 資料庫,為了要因應 multi process 的環境,只好使用 file lock 來處理 concurrent access 的需求。也因此必須每次都 [...]