pdftotext win32

幫朋友試的,轉 pdf 為文字檔。本來是要用 pdfbox 跟 iTextSharp 的,無奈 pdfbox 編譯不出 .net 的 dll,而 iTextSharp 的 model 又太複雜。

Linux 下的 pdftotext 正巧是可以轉的,所以首要就先找 win32 版本的。pdftotext 由兩個套件提供,一個是 xpdf,另一個是 poppler,目前 ubuntu 預設是使用 poppler。但是 popper 卻沒有善心人事編譯出 win32 的版本,只有 xpdf 有 (gnuwin32提供)。

所以就先下載來安裝,裝完以後,就有 pdftotext 指令可用,但是轉換時,卻轉不出中文。參考 pdftotext 的使用說明,發現有 -enc 選項可用,但指定以後,卻會出現

Error: Couldn't find unicodeMap file for the 'cp950' encoding
Error: Couldn't get text encoding

看來是少了檔案。
xpdf 官方網頁上有提供 xpdf-chinese-traditional.tar.gz,印象中,linux 下使用時,通常也是要再額外安裝才可以看到中文。那麼,就下載來使用吧。下載以後,把檔案解開放到 C:\Program Files\GnuWin32\share\xpdf\chinese-traditional 下,然後修改 C:\Program Files\GnuWin32\etc\xpdfrc ,加上這幾行:

#----- begin Chinese Traditional support package (2004-jul-27)
cidToUnicode	Adobe-CNS1	c:\progra~1\gnuwin32\share\xpdf\chinese-traditional\Adobe-CNS1.cidToUnicode
unicodeMap	Big5		c:\progra~1\gnuwin32\share\xpdf\chinese-traditional\Big5.unicodeMap
unicodeMap	Big5ascii	c:\progra~1\gnuwin32\share\xpdf\chinese-traditional\Big5ascii.unicodeMap
cMapDir		Adobe-CNS1	c:\progra~1\gnuwin32\share\xpdf\chinese-traditional\CMap
toUnicodeDir			c:\progra~1\gnuwin32\share\xpdf\chinese-traditional\CMap
#----- end Chinese Traditional support package

這樣設定就完成了。
使用的時候就可以用 “c:\Program Files\GnuWin32\bin\pdftotext.exe” -cfg c:\progra~1\gnuwin32\e
tc\xpdfrc -enc Big5 your_file.pdf your_file.txt 來進行轉換了。

註:我是 xpdf 的 setup 檔來安裝,所以會裝到 c:\program files\gnuwin32 下,若你是用.zip檔,那麼路徑請自行調整。

Microsoft Security Essential與Proxy

公司的NB一直都沒裝防毒軟體,也不知道要去公司的哪裡下載防毒軟體來安裝。前公司是很貼心,只要一登入公司的網域,如果沒裝公司御定的防毒軟體,那麼防毒軟體的安裝程式就會跳出來,要你安裝。
好吧,前一陣子有聽說Microsoft Security Essential免費又很不錯,就裝上來試試看。裝完以後馬上遇到的第一個問題就是proxy,爬文以後,發現幾乎都是說不支援proxy。但很幸運的在微軟論壇裡找到方法,原來Microsoft Security Essential是用winhttp,而不是會自動使用IE設定的wininet,也就是說要用proxycfg來設定,才可以。
所以看你是要 proxycfg -u 去 follow IE proxy 設定,或是 proxycfg -p your_proxy_server 來設定,就可以了。

Yahoo Traffic Server

因為最近發現公司的 proxy 不理我 NB 上的 https request 了(我NB是走正常公司網路設定,也就是上網都會透過proxy),想到 COSCUP 2010 有介紹 Yahoo Traffic Server,想說架在另外一台不受限的機器上,讓 NB 透過這個 proxy 上網。
安裝不難,參考:Build instructions,三兩下就能 build 好,開發團隊好像就是在 Debian/Ubuntu 上開發的樣子,步驟寫的蠻仔細的。
設定倒是考倒我了,預設的設定是不 work 的。試了一陣,才找到這篇:Yahoo Traffic Server,裏面提到在 records.config 裡的兩個關鍵設定:

  • proxy.config.reverse_proxy.enabled
  • proxy.config.url_remap.remap_required

把這兩個設成 0,大致上就 ok 了。
我還有改到的設定:

  • records.config
    • proxy.config.cluster.ethernet_interface: 改 eth0
    • proxy.config.cache.ram_cache.size: 改 256M
  • storage.config: var/trafficserver 加大到 256M

事實上除了可以當類似 squid 的 proxy server 以外,也可以當 reverse proxy、Forward proxy(remap),同時也支援 cluster 架構、DNS cache…等,可以挖的功能相當多,以後有空再來挖好了。
其他可參考資料:Yahoo Traffic Server中文介紹以及for RHEL5 64bit/Gentoo 的 rpm檔

VirtualBox的VM啟動不了兒

好久沒啟動公司的VirtualBox OSE,就想說啟動起來,打算開個新VM,裝個Debian來玩玩兒,結果不知道是不是太久沒啟動,他鬧了脾氣,出現這樣的錯誤訊息:

VirtualBox can’t operate in VMX root mode. Please disable the KVM kernel extension, recompile your kernel and reboot.

這真是一個糟,所以我立馬就把所有視窗都關掉(天知道我關了多少),然後重新開機,再試試,居然還是不行。拜請Google大神,果然早有人回報到 https://bugs.launchpad.netBug #292588 in virtualbox-ose (Ubuntu): “VirtualBox can’t operate in VMX root mode.”
照看起來,只要用這指令 workaround 一下就行了:sudo modprobe -r kvm-intel
我想應該是昨天裝了 qemu 的關係,因為印象中有裝 qemu-kvm,應該跟他有關係。Bug #292588後面的 comment 也有人提到這點,不過看起來,這 bug 真的很久了啊~

ChangeLog and svn2cl

目前大部分的開放原始碼專案都是遵從 GNU 的Changelog 格式,基本上寫起來不難,只是有點煩。
所以有的開發工具,例如 monodevelop (Version Control Screencast),甚至把你 commit 的格式也固定下來,讓你省掉許多功夫。
好吧,其實只是我今天突然想到以前有用過 cvs2log 這個 perl script,還不錯用,可以直接把 cvs 裡的 log 轉出來成 Changelog,所以,就想到 svn 應該有類似的工具,之前好像有用過,但我忘了。於是我就用 svn2log 去找,嘿,當然有這工具,可是這工具的網站已經連不上了。我只好退而求其次,用 apt-cache 找找,但也沒找到,只是有 subversion-tools 這個 package。裝起來試試看吧,裏面有不少東西,有一個小程式叫作 svn2cl,試了一下,果然這就是我要的東西。
要使用 svn2cl 來產生 Changelog 的話,在你 commit 時,log 就不需要加什麼格式了,就儘可能地在一行之內把 log 寫完,然後不要一次修改很多檔案,這樣產生出來的 Changelog 就會很不錯了。svn2cl 有相當多選項,甚至可以產生 html、只產生某段期間的 log…等,有時間再來研究看看。

Vimana

Vimana 在 ubuntu 裡所需要的套件大致有這些:libdatetime-perl libexporter-lite-perl libjson-perl libmouse-perl libyaml-perl libapp-cli-perl libfile-type-perl libarchive-zip-perl
HTTP::Lite 則找不到適當的 deb,所以執行 perl Makefile.PL 時,會問說要不要從 CPAN 安裝,這時候要選 y。

==> Auto-install the 1 mandatory module(s) from CPAN? [y] y

接著 make 的時候,就會開始安裝 HTTP::Lite,同時編譯 Vimana
最後輸入 sudo make install,就會開始安裝 Vimana
如果你跟我一樣遇到 make 時,沒反應的話,不妨中斷他,然後輸入 sudo cpan HTTP::Lite 先手動用 cpan 安裝 HTTP::Lite,再重新 perl Makfeile.PL、make、sudo make install 就可以把 Vimana 安裝好了。
安裝 Vimana 以後,首先得用 vimana update 更新套件資料,接著就可以用 vimana install 來進行安裝了。

bash裡的進制轉換

之前朋友問說為什麼 010 不是 10? 我告訴他這是因為這樣的數字會被認定為八進位,像很多語言(如C語言)也有一樣的慣例。後來他就問說該怎麼在 bash 裡轉換,後來我找了一下,才知道要用 bc 來轉換。

#!/bin/bash
# program name: forloop.sh
ss=`echo "ibase=10;$1"|bc`
ee=`echo "ibase=10;$2"|bc`
for((var=$ss; var<=$ee; var++ ))
do
echo $var
done

上面的程式演示了 bc 的用法,所以你輸入 ./forloop.sh 001 011 的話,就會印出 1~11,而不是 1~9。
你可以試著把 ss 跟 ee 換為 ss=$1、ee=$2,然後再執行 ./forloop.sh 001 011 看看,會很清楚地發現差異點。

svndiff 0.2

託 A 同事的福,找到了前一版 svndiff 潛在的問題-不加參數時,zenity 顯示出來的檔案比預定的要少。原因是餵給 zenity 的資料錯誤,應該要在實際的資料前多加一行空白,所以我在 awk 裡改用 printf 來輸出。
[bash]
#!/bin/sh
if [ -z $1 ]; then
FILES=`svn status | awk ‘/^[MCA]/{printf “\n%s\n”,$2;}’ | zenity –list –width=600 –height=400 –separator=\ –checklist –title “The files which modified/conflict” –text ‘Please select files’ –column ” –column ‘Files’`
else
FILES=$@
fi
for FILE in $FILES; do
svn diff –diff-cmd /usr/bin/meld $FILE
done
exit 0
[/bash]

Reactions in state

IBM Rational Rhapsody 裡的 Reactions in state 其實就是 UML User Guide – State machine 一章裡講的 Internal transitions。我覺得 Internal transitions 一詞比較清楚,一看就明白是什麼意思。
意即進入 State 以後,可以收到 event,但不會轉移到其他的 state,執行完以後,仍然還在原來的 state,這邊要注意的是,原 state entry/exit 裡的程序不會再被觸發。
舉例來說,假設有個 display state,entry 會執行 display(); reactions in state 裡定義了 evRepaint 時,會執行 repaint()。那麼,在進入 display state 時,display() 會被執行,如果此時收到 evRepaint,repaint() 會被執行,但 display() 不會再執行一次。

svndiff

想不到 svn 要用 –diff-cmd 才能指定用哪個 diff,因為不想每次打 svn diff –diff-cmd 這麼長的指令,就寫成了 script。既然要寫成 script,那乾脆再簡化,如果不帶參數,就自動帶出所有有更動/衝突的檔案,讓我來挑選哪些要比對。

#!/bin/sh
# Dependencies: zentiy subversion awk meld
if [ -z $1 ]; then
FILES=`svn status | awk '/^[MC]/{print $2;}' | zenity --list --width=600 --height=400 --separator=\  --checklist --title "The files which modified/conflict" --text 'Please select files' --column '' --column 'Files'`
else
FILES=$@
fi
for FILE in $FILES; do
svn diff --diff-cmd /usr/bin/meld $FILE
done
exit 0