JeffHung.Blog

(My smile insists of having nose. :-)

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

Doxygen syntax coloring in Vim

Vim 的 syntax coloring 功能強大,讓人愛不釋手;而 doxygen 的出現,讓 C、C++ 甚至 Perl,也都能有像 Javadoc 那樣的 in-code documentation solution。如果能夠兩者結合,如許多 Java IDE 在 editor 裡對 Javadoc 的支援那樣[1],連 comment 裡的文件內容,都能夠把 syntax coloring 弄得漂漂亮亮的,那就更棒了。
剛剛在逛 doxygen 網站,被我發現這個 script:《DoxyGen Syntax : DoxyGen Highlighting on top of c/c++/java》。簡單說,就是能夠在原本 Vim 對 C/C++/Java/... 的 syntax coloring 的基礎上,再增加對註解裡 doxygen 文件內容的 syntax coloring。於是趕緊抓下來試試。
網頁上的安裝方法比較複雜,我試了幾次沒有成功。所以就研究了一下 Vim 的 online document,發現 *mysyntaxfile-add* 這一節這麼說道:

If [...]

Save current visio page as PNG and SVG files using VBA

為了要在 OpenOffice.org2 裡用 Visio 畫出來的圖,我總是得先在 Visio 裡 save as 成 PNG 格式,然後再在 OpenOffice.org2 的 writer 裡插入並設定連結。由於要不斷地在 Visio 與 OpenOffice.org2 之間修改,所以每次都要另外設定存檔格式,十分麻煩。所以簡單地寫了個 VBA,簡化這個步驟:

將目前正在編輯的 Visio 檔案的目前頁面,以目前檔名去掉延伸檔名的部分,存檔成 PNG 格式的圖檔 (當然要再加上 .png 副檔名)。
理想上,透過 SVG 格式會更好。但是因為目前 OpenOffice.org2 對 SVG 的支援,只有一個半官方的 XML filter 叫 SVG Import Filter for OpenOffice 2.0 勉強可以用,所以暫時還是在 Visio 裡同時存檔成 PNG 與 SVG 檔,先用 PNG,以後有機會再用 SVG。

用 macro [...]

Enhance Wordpress posting bookmarklet

由於內建了 WYSIWYG 的 HTML editor,Wordpress 2.0.* 的 posting bookmarklet 也可以直接以 WYSIWYG 的形式編輯文章了 (之前的 WYSIWYG 靠的是 plug-in,posting bookmarklet 沒有 plug 到)。
但是,官方的 posting bookmarklet 會取代掉目前的網頁,這樣在編輯文章時很麻煩,沒辦法回來參照原文編寫。所以只好下手改改這個 posting bookmarklet。基本上關鍵在這裡 (其中,Q 是目前被選取的文字,如果有的話):

location.href
= 'http://www.jeffhung.idv.tw/blog/wp-admin/post.php?text='
+ encodeURIComponent(Q)
+ '&popupurl='
+ encodeURIComponent(location.href)
+ '&popuptitle='
+ encodeURIComponent(document.title);

因為是更改 location.href 來啟動 blog 編輯,所以目前頁面會被替換掉,換成 window.open() 開新視窗,應該就可以了。所以我把這段改成這樣:

window.open(
'http://www.jeffhung.idv.tw/blog/wp-admin/post.php?text='
+ encodeURIComponent(Q)
+ '&popupurl='
+ encodeURIComponent(location.href)
+ '&popuptitle='
+ encodeURIComponent(document.title)
);

卻沒想到,雖然新的 blog 編輯視窗有正確出現了,但原來的頁面卻被切換成這樣:

[object Window]
研究了網路上其他的 bookmarklet 的寫法,才恍然大悟,如果 bookmarklet 的最後一個 statement 有「值」的話,browser (firefox) 就會把這個值顯示在頁面上。所以在最後加一個 [...]

__WFILE__ and generic __FILE__, __TFILE__

在 C/C++ 裡 debug 的時候,__FILE__ 和 __LINE__ 很好用,可以幫我們將錯誤發生的地點指出來。可是,因為 __FILE__ 對應的型別是 const char* (__LINE__ 對應的型別是 size_t),在使用 wide character I/O 的時候,便不能用。就算像 L"some string" 一樣,前面加一個 L 也不行,因為這樣子就變成了 L__FILE__,是另外一個 symbol 了。空一格也不行,因為 L"some string" 的 L 必須與引號直接連接。 還好,使用 ## 這個 preprocessor operator 可以解決這個問題:
#define WIDEN_(x) L##x#define WIDEN(x) WIDEN_(x)#define __WFILE__ WIDEN(__FILE__)
這樣子我們就可以依據 output 的環境,選擇 __FILE__ 或 __WFILE__ 來使用了:
void fout(ostream& os){ [...]

TSDropCopy - Copying files between terminal server and client

今天同事介紹了一個很有用的軟體:TSDropCopy,這是一個可以讓您在 Windows Terminal Server 和 client 之間,方便傳檔的小軟體。只要把在兩端各自執行,TSDropCopy 就會停留在桌面的右下方,點兩下,就會跑出一個小視窗,將您要傳的檔案拉到這個小視窗裡,檔案就會自動傳到令一邊去。
由於平常工作時,網路是設定在部門獨立使用的 ADSL 這邊,必須透過 terminal service 連到 server 開 Outlook 才能看信。如果信件裡有夾檔,就很難傳回本機電腦,必須要到外面找台 server,用 command-line FTP 先傳上去,再從本機抓回來,非常麻煩。現在有了這個 TSDropCopy,收夾檔從此就不再是個問題了。

沒有寫好程式以前,不能上網

flyinsaucer 在這篇《寫作指南》裡,提出了三個方法,幫助我們增進寫作 (工作) 的效率:

設條件寫作法 (Contingency):沒有做 XXX 之前 (XXX 是和寫作看書有關),不可以做 YYY (就是喜歡做的事);
改變環境:要把會分心的東西拿掉;
設定目標無法達成的懲罰:寫一張支票給你最討厭的機構,如果沒有照達成計畫的目標,保管那張支票的人就可以把它寄出去。

所以,,就此規定,在我沒有寫好程式以前,不能上網。 可是,寫程式需要上網找資料啊!><

Search plug-in for FreeBSD manpage search

寫 blog 時,常會提到 UNIX/FreeBSD 指令,為方便加 link,以及自己的查詢需求,寫了下面這個 FreeBSD man-page search plug-in ,歡迎大家使用。:-)
# Search Plug-in for FreeBSD man-page search

<search
version = "1.0"
name="FreeBSD Man"
description="FreeBSD Hypertext Man Pages"
method="GET"
action="http://www.freebsd.org/cgi/man.cgi"
>

<input name="query" user>

</search>

<browser
update="http://www.jeffhung.idv.tw/~jeffhung/firefox/search-plugin/freebsd-man.src"
updateIcon="http://www.jeffhung.idv.tw/~jeffhung/firefox/search-plugin/freebsd-man.png"
updateCheckDays="7"
>

在 unicode 文字檔裡檢查 big5 字元

之前碰到一個問題就是,我們有一堆 UTF-8 的 XML 檔案,但實際上這些檔案應該都只包含中文字,也就是可以用 BIG5 呈現的字。然而,因為是 UTF-8 是 Unicode 的關係,所以實際上可能存在有無法轉換成 BIG5 的字,因而違反程式的期待,造成程式的問題。為了避免這樣子的問題,我們必須要檢查這堆 UTF-8 的 XML 檔案,確認每個檔案裡用到的每個 UTF-8 字元,都可以被轉換成 BIG5。這個問題,在考慮到其實 BIG5 也有很多變種的情況下,越是複雜。
不過還好,想通了話其實就很簡單:用 iconv 試轉不就得了:

SHELL> find . -type f -name '*.xml' \
| xargs -n 1 -t -x iconv -f UTF-8 -t CP950 \
[...]