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 [...]

Google Map 的門牌查詢,也太爛了吧?

看到 Neo 在介紹 Wamap (挖地圖),想到還沒試過 Google Map 的中文門牌查詢,就試了一下,發現了驚人的笑果:

查「民族路30-9號」跑出「民族路16-9號」[1];
查「民族路30-9號14樓之3」跑出「民族路29巷3弄9號」。

感覺像是前端文字處理就爛掉了的樣子。
只看第一筆查詢,還可以解釋說是因為圖資不夠,所以演算法自動找「從地址來看最接近的地點」來顯示。但搭配第二筆查詢來看,很明顯就是前端文字處理爛掉了,樓層高度對這種地圖門牌查詢來說,並無意義,本來就應該先濾掉。但很明顯地,整個被攪和進去,結果跟第一筆的結果不同。
台廠有 UrMap 可以用,門牌查詢還蠻準的,雖然說路徑規劃太多結果,大部分都很莫名其妙,但也都至少有一、兩個是有用的。剛剛 h 君也推薦[2]了 Yahoo! 奇摩生活+地圖,試用了一下也很不錯。
我隱藏了完整測試地址,文中的地址片段也不是與我有關的地址。有興趣的人,可以拿自己家地址試試。 ↩利益揭露:h 君與 Yahoo! TW 有工作往來關係。 ↩

Sudo_root - prompt when needed in script

(這是一篇積存的舊文。)
Sudo 是個很好用的工具,讓我們可以盡可能地減少擁有 root 權限的時間,並隱藏 root 密碼,以提升系統安全性[1]。不過,當我們在使用 shell script,而 script 裡只有一小部分需要用到 root 權限時,卻通常是直接用 sudo 或 su 成 root 執行整個 script,讓 script 裡面大部分沒有需要 root 權限的地方,也獲得了 root 權限。如果,我們能夠善用 sudo,只在 script 裡真正需要 root 權限的地方,才切換成 root 身份執行,這樣應該可以降低 script 其他部分,對系統可能的危害。
最簡單的想法,就是在 script 裡,有需要 root 權限的指令前面,加上 sudo 就好了。由於 sudo 會記錄上一次執行的 time-stamp,因此就算我們加上 sudo 的指令,在一個跑上千次的迴圈裡面,我們也只需要輸入密碼一次。好比說:

#!/bin/sh
# backup all configuration files in /etc.
for i in /etc/*; do
[...]

在 screen 裡顯示 vi 正在編輯的檔案

Rafan 在問,怎樣在 screen 裡顯示 ssh 出去的 hostname。這個以前我有搞過類似的:在 screen 裡顯示 vi 正在編輯的檔案。
怎樣使用 screen 的 shelltitle 功能
Screen 可以利用 shelltitle 功能,只要畫面上出現規定的 pattern,就可以抓取其中指定的區域,當作 shell window 的 title。Screen 的 manpage 是這麼說的:
TITLES (naming windows)
You can customize each window's name in the window display (viewed with
the "windows" command [...]

Auto-switching utf8/big5 mode when installing ~/.screenrc

目前算是都會碰到 big5/utf8 的時代,我原本有在 ~/.screenrc 底下,使用下面的技術,以便在 big5 的 terminal 裡看 utf8,或在 utf8 的 terminal 裡看 big5:
如果 terminal 使用 big5:

# C-a b --(switch to)--> view big5 data
bind b encoding big5 big5
# C-a u --(switch to)--> view utf8 data
bind u encoding utf8 big5 # convert utf8 to big5
如果 terminal 使用 utf8:

# Same as the encoding command except that [...]

Obtaining java env vars from javavmwrapper

JRE 有很多版本,也有很多廠商出,因此,FreeBSD 有提供一個 ports 叫做 java/javavmwrapper,是一組 shell script,會自動依據設定,從安裝於系統中的眾多 JRE 中,選擇最新或最適當的 JVM,設定環境變數後,執行 java 程式。java/javavmwrapper 安裝的主 script 叫 javavm,後面以此稱之。
然而,有些用 Java 寫的重量級套件,會附上完整的啟動 script,自動進行相關的設定,如 CLASSPATH 等。而這些啟動 script,其實並不懂怎麼使用 javavm,因此需要人工設定如 JAVA_HOME 等環境變數。也就是說,要用這些 script,我們就沒辦法利用 javavm 聰明的功能,來幫我們管理 JVMs。
還好,UNIX 系統的強項,就是方便的指令組合功能。如果 JAVAVM_DRYRUN 環境變數存在的話,javavm 就不會真的執行 JVM,而是將相關的環境變數印出來。透過這個機制,我們就可以重用 javavm 的聰明管理機制。如下:
env `env JAVAVM_DRYRUN=yes java | xargs echo` bin/startup.sh
在 FreeBSD 裡,裝了 java/javavmwrapper 以後,/usr/local/bin/java 其實會指到 javavm,自動幫我們選擇 JVM,因此上面的指令我們可以直接使用 java 呼叫。利用 env,我們讓 javavm [...]

pipe2arg.sh - Turn pipe input to file argument

Subversion (SVN) 的 --file 選項有個問題就是,不能像一般的指令一樣,當為路徑為 - 時,就從 stdin 讀資料。舉個例子來說:

SHELL> echo value | svn propset foo:bar --file - pipe2arg.shsvn: Reading from stdin is currently broken, so disabledExit 1
理論上,我會希望 foo:bar 這個 property 的值,從 stdin 讀進來,但 SVN 卻跟我說,現在這個功能壞掉了。因此,有些特殊的玩法,就沒辦法用。例如我們就沒辦法這麼下指令:

SHELL> svn propget svn:keywords pipe2arg.sh \ | sed -e 's/LastChangedDate/Date/' \ [...]

Setting svn:keywords in many files simultaneously

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

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 實作

因為同事「發現」了 Visual SourceSafe 的 keyword expansion 的功能,很開心地要用在「檔頭註解」[1]裡,於是我就推薦他使用 Id、Date、Revision 與 Author 這四個 keyword,因為這四個 keyword 在 VSS、CVS 與 Subversion 裡都可以用,且用法一樣。既然終於要正式用了,那我寫的那些程式早已經在用的「檔頭註解」,也要跟著對應過去才行。在剛開始的時候,Subversion (SVN) 只可以使用 Id、LastChangedDate、LastChangedRevision/Rev 與 LastChangedBy 等,所以我也都是用這幾個一直到現在。不過既然後來較通用的 Id、Date、Revision 與 Author 也可以用了[2],就趁此機會換回來。
理論上,我自己在 SVN 這邊用的時候,這些 keywords [...]

use grep(1) accompany with my wcfind via xargs(1)

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

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 實作

Sorry, the comment system do not allow me to use rich-format styles. So I reply Laurent's comment of "wcfind - avoid find(1) into subversion meta directories" here.

Hi, Laurent, There are [...]

wcfind - avoid find(1) into subversion meta directories

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

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 實作

Ben Reser contributed a bash script called wcgrep that is useful for greping in a Subversion working copy by ignoring the Subversion meta directories .svn/ and vi(m) backup files. We may [...]

 1 2 Next