星期三, 5月 30, 2007

最近實在是不順

最近遇到一些倒楣的事情。其實一直以來,似乎都多多少少會遇到一些倒楣的事情,只是似乎最近頻率比較高。

先是房租續約因為 leasing office 的作業問題,搞得一團亂,到現在還不確定到底完全解決了沒有。接下來,似乎我的好人名號太出名了,沒事就被一堆人找去當好人。再來,又遇到該死的手機公司的爛網站,多跟我的信用卡扣了一筆實際上沒有完成的交易的經額,目前還在交涉中。還有,似乎莫名其妙被某事件波及,某甲問我某乙的狀況,然後沒幾句之後,卻叫我不要再問了,問題是我啥都沒問啊!是他先問我的,怎麼變成好像我太閒去探人隱私的感覺呢?

情緒管理實在是很重要的事情。自從三年多前的某事件,讓我見識到了高 IQ 絕不等同於高 EQ 以後,我一直覺得,跟人打交道實在是非常累的事情。其實從高中以後就已經有這種感覺了,這也導致我越來越不擅長和人打交道。這年頭情緒管理不好的人實在是越來越多了。唉!

諸事不順的同時,又要處理討厭的人際關係,實在是非常的令人厭煩。趁著最近打算重新安裝我的 notebook pc 上的 Linux 的同時,暫時切斷 IM 一段時間好了。
繼續閱讀全文

星期四, 5月 24, 2007

使用 OpenOffice.org 建立 PDF 電子表單

上週,在學校的校友信箱中,收到了系上某位自稱是負責校友會校友資料更新的學妹寄來的 e-mail,信中附上了一個叫『校友更新資料表』的 Word 檔,希望我填完以後寄回去。

基本上看到是 Word 檔,想填的意願就已經不高了,又不是每個人都會裝 MS Office,也不是每個人都用死微軟的暈倒系統啊!不過由於之前似乎系上也寄過相同的調查表的紙本到台灣的家裏,所以還是打開看看。打開一看,果然是用 Word 畫的表格。這到還好,雖然填起來不是那麼方便,但還可以接受。直到我看到了某個讓我受不了的東西 -- 使用『□』符號做出來的 checkbox--我決定不填了。使用『□』符號來『畫』checkbox 是在製作紙本表格時,蠻多人會用的方法。問題是在電子表格裡面,這種作法實在很糟:填表人還要想辦法去找到『■』符號來把原來的『□』取代掉!這是相當不專業的方法。

在現在,電子表單逐漸成為無紙作業中,相當重要的一個基本工具。不過以往看到的 PDF 電子表單,大都是使用一些昂貴的 Windows 平台軟體製作的。至於使用 FS/OSS 製作 PDF 表單的方法倒不是沒有,我第一個可以想到的,是使用 pdfTeX 搭配 hyperref 等 package 來達成,不過這種製作方式對於不懂 LaTeX 的人來說,相當不方便。那是否有更方便的方法呢?

其實是有的,OpenOffice.org(以下簡稱 OOo) 目前已經支援 PDF 表單的製作了。OOo 的英文版目前最新版本是 2.2,而中文版則是 2.1。以中文版為例,要製作 PDF 表單,基本的步驟如下:
  1. 啟動 OpenOffice.org Writer
  2. 在 [檔案]->[開啟新檔] 中,選取『XML 表單文件』
  3. 使用提供的元件設計想要的表單。各個元件都有一些設定項目可以設定,只要 double click 該元件,就可以開啟設定視窗。設計完畢存檔。
  4. 使用 [檔案]->[匯出成 PDF...] 將 XML 表單轉換為 PDF 表單
就只要這幾個步驟,可直接填寫的 PDF 表單就完成了,而且中文的支援也沒有明顯的問題。各個元件也可以設定是否在列印時會被印出來,因此對於表單的列印輸出,也可以有不錯的控制。

OOo 實在是越來越強悍了,搭配蓬勃發展的其他各種自由軟體,使用電腦而不必被 MS 綁死的難度直線下降,尤其是對末端使用者來說,實在是一大福音。
繼續閱讀全文

mplayer/mencoder 的 profile

Mplayer 原本是在 Linux 環境下發展的一個功能強悍的媒體播放程式,除了播放之外,附屬的 Mencoder 也可以用來做媒體壓縮處理,是個相當強悍,幾乎所以格式都通吃的媒體播放與壓縮軟體。在許多人的努力之下,Mplayer 目前除了 Linux 以外,連 Windows 以及 MacOS 上,都有了可用的官方版本了。
Mplayer/Mencoder 自從 1.0pre8 版本以後,支援所謂的 preset profile。所謂的 profile 是允許使用者把一些特殊設定結合起來,在呼叫 mplayer/mencoder 的時候,使用 "-profile profile_name" 的方式來使用這些設定,而不需要每次都在命令列下給一堆參數。這個功能對 mplayer 來說,用途比較沒有那麼明顯,但對於 mencoder 而言,則是一個很有用的功能。

以下是我自己的設定檔中,幾個比較有趣的 profile:

[wii]
profile-desc="Wii Video standard format"
oac=pcm=yes
ovc=lavc=yes
lavcopts=vcodec=mjpeg
sws=9
font=c:/windows/fonts/arialuni.ttf

[flv]
profile-desc="Flash Video"
of=lavf=yes
lavfopts=i_certify_that_my_video_stream_does_not_use_b_frames=yes
oac=mp3lame=yes
lameopts=abr=yes:br=64
srate=22050
ovc=lavc=yes
lavcopts=vcodec=flv:keyint=50:vbitrate=300:mbd=2:mv0=yes:trell=yes:v4mv=yes:cbp=yes:last_pred=3

[flv-ntsc]
profile-desc="Flash Video in 29.97fps"
profile=flv
ofps=29.97
vf=scale=320:240
sws=9

[flv-pal]
profile-desc="Flash Video in 25fps"
profile=flv
ofps=25
vf=scale=320:240
sws=9

其中 "wii" profile 是用來把影像檔轉換成符合 Wii Video 的格式用的,而 "flv" 則是把檔案轉換成 Flash video 用的。簡單的使用方式如下:
  • 轉換檔案成 Wii Video:
    mencoder -profile wii -o output.avi source.whatever
  • 轉換檔案成 Flash Video (frame rate 為 29.97fps)
    mencoder -profile flv-ntsc -o output.flv source.whatever

不過使用 flv profile 產生的檔案,還必須使用 yamdi 或 flvtools 等工具來插入 metadata,才能夠在播放器上進行快轉等等。
繼續閱讀全文

星期二, 5月 15, 2007

yamdi 的Windows porting

最近似乎找東西都還蠻順利的,一些以前找不到的資訊,最近都找到解答了。像是使用自由軟體來產生 Flash video (FLV) 的方式,最近也找到了,而且還是使用我個人偏好的 mencoder 來達成。這個等我下一篇 blog 再詳述。

yamdi 是 Yet Another MetaData Injector 的縮寫。這個軟體的作用主要是用來在使用某些軟體轉換出來的 Flash Video (FLV) 檔案中,插入一些缺乏的 metadata,使檔案可以在 flash video player 上快轉和倒帶等等。這個軟體本來是針對 Un*x 平台,使用 C 語言所寫的,原作者也還沒有放出可以在 Win32 上使用的版本。相同功能的自由軟體還有一個叫做 flvtool2 的軟體,不過是用 Ruby 寫的,而我不會 Ruby,也懶得為了跑一個 script 而去裝一套我可能不會再去用的直譯器。Win32 下倒是還有其他的 freeware 可以用,例如 flvmdi,但 flvmdi 不是自由軟體,事實上根據網頁的說明,甚至不算是 freeware。

昨晚發現了 yamdi 這個 C 語言的自由軟體實做,下載回來看,發現其實程式碼不長。雖然作者在網頁上只說了這個軟體能夠在 *BSD 和 Linux 上跑(作者在 FreeBSD、MacOS、以及 Ubuntu Linux 上試過),但沒有提到到底行不行在 Win32 的環境上編譯。看到這種小程式,當然就要實際拿到 MinGW 上試試看啦!使用 MinGW 也是我的個人偏好,雖然移植 Un*x 程式到 Win32 上用 Cygwin 會簡單很多,但畢竟有一種隔靴搔癢的感覺.....回歸正題,使用 MinGW 的 MSys 環境,呼叫 GCC 去編譯時,馬上就發現了為何不能在 Win32 上編譯的主要原因:該程式使用到了 mmap() 這個記憶體映射函式。yamdi 的作者會使用 mmap() 的理由其實很明顯,他覺得 flvtool2 是把整個 FLV 檔案載入到記憶體中處理,這樣對檔案很大時,就會很慢又吃光記憶體。不過問題出在 MinGW 並沒有實做 mmap() 這個函式,所以這個程式在沒有修改的狀況下,沒辦法在 MinGW 上編譯通過。除了 mmap() 這個主要的問題外,還有使用到了 bzero() 這個也是 MinGW 沒有定義的函式,以及存取到了 /dev/null 這個在 native Win32 下不存在的裝置檔案。

我對 Win32 API 可以說是個門外漢,事實上對於用 MinGW 寫純的 Win32 程式也只是略知一二而已,所以這種情況下,當然只好拜請古狗大神啦 XD bzero() 和/dev/null 的問題好解決,根據 bzero() 的 manpage,bzero() 做的事情就只是把某塊記憶體空間填滿 0,因此可以用 memset() 來取代。至於 /dev/null,根據在 DOS 時代的記憶,以及以前做過的試驗,在 Win32 下可以使用 "nul"這個特殊的虛擬檔案來取代。剩下最麻煩的是 mmap() 了。查了好幾下 Google,Win32 API 中,與 mmap() 類似的對應函式是 CreateFileMapping() 以及 MapViewOfFile() 這兩個函式的組合。根據從 Google 找到的一個 libgda 的 MinGW porting 的 patch,我依樣畫葫蘆的,很快的改好了第一個可以編譯的版本。不過很不幸的,事情沒有這麼簡單。這樣依樣畫葫蘆的結果是,CreateFileMapping() 每次都會失敗。翻了一堆 MSDN 的網頁,也看了幾個範例程式,本來以為問題只是單純的參數或者旗標設錯。呼叫 GetLastError() 取得錯誤代碼後,發現是 File handle 錯誤。這下頭大了,我完全是照著該 patch 的邏輯,把 fopen() 回傳的指標,使用 fileno() 轉換成 file descriptor 之後,再強制型別轉換成 HANDLE 類型,難道這樣做不行嗎?經過幾次使用 gdb 去看一些變數的內容後,我決定放棄這條途徑,改用 MSDN 裡面建議的 CreateFile() 這個 API 來開啟檔案,直接取得 CreateFileMapping() 能夠接受的 file handle,這樣總不會錯了吧?又經過一些修改,總算產生了一個可以運作的版本啦!

經過一連串的找找改改,程式是編出來了,但到底能不能正常運作呢?當然要實際測試一下才知道了。找了一個很短的影像檔,先用 mencoder 轉換成 FLV 格式,然後再用我編出來的 yamdi.exe 來插入 metadata,最後再用另一個 flash video 播放器的自由軟體 -- FlowPlayer 來測試,果然成功,可以正常快轉和倒帶等等。辛苦還是有代價的。確定成功之後,我做了個 patch,並貼上該計畫網頁的 patch 頁面去了。

好久沒有這樣改程式了,加上 Win32 API 我本來就不熟,看了一堆 MSDN 的網頁,頭好昏啊 :P
繼續閱讀全文

星期五, 5月 11, 2007

遠在天邊,近在眼前

今天在偶然的機會,想起了在東引當兵時的兩項特產 -- 『東引地雷』和『乖乖』。在東引時就很好奇,這兩樣東西的學名到底是什麼?以前也做過一些搜尋,不過沒有得到太有用的結果。今天再次用 Google 做了些搜尋,總算找到了學名以及相關圖片。

我在 2001 年 4 月到 2002 年 6 月份期間,在東引下部隊,駐地是西引島,職位是兵器連排長。剛到部時,就有老兵和士官告訴我,要小心東引的兩樣特產,『東引地雷』和『乖乖』。

東引地雷其實是一種植物,印象中幾乎一年四季都會看到,不過似乎春夏時最茂盛。東引地雷會開花,其實也還蠻漂亮的,只是葉子尖端有刺,和含羞草類似,都會穿透衣服刺到皮膚,被刺到的部位會刺痛紅腫很久。在花謝了以後,只剩下葉子的部份,隱藏在草叢中,不小心就會中彈,我想『東引地雷』的稱號可能是這樣來的。Google 找到的學名是『南國薊』,而且其實不用跑到東引,在陽明山國家公園就有了:(圖片取自陽明山國家公園的網頁)


至於『乖乖』,號稱是東引毒物之首,在老兵的眼中,是威脅性遠超過蜈蚣和蛇的一種毒昆蟲,每次只要看見,就一定全力撲殺。這個東西到底有多毒?我在當地的一年多裡面,沒有遇到過有『體驗』過的人,我自己也只有在寢室被蜈蚣偷襲而已,但在老兵的口中,是相當毒,甚至可能會致死的東西。乖乖之所以讓老兵如此畏懼,除了毒性之外,恐怕最可怕的地方在於,它常常無聲無息的出現在意想不到的地方:安全士官室的牆上、休息時脫下的鋼盔上、內務櫃上、甚至是直接出現在床上、棉被上、身上等等。乖乖的外型其實也許猛一看沒有像蜈蚣那麼令人驚悚,但其實也有點讓人毛骨悚然,尤其是在聽到老兵們的一些『現身說法』之後。這個東西在 Google 查到的學名則是『蜒蚰』(音同延由),而且也一樣,不必到東引,在陽明山國家公園裡,一樣可以找得到:(圖片一樣引自陽明山國家公園的網頁)


沒想到在東引赫赫有名的兩樣毒物,竟然在陽明山國家公園裡都有,著實讓我吃了一驚。不過,我在東引的回憶中,毒物不是最毒的,最毒的是人心。一心想要整備戰備,但完全不顧基層死活,心狠手辣的旅長;加上逢迎拍馬超一流,但沒肩膀又陰險的營級主官主管;還有本來相當有新人新氣象,但被旅長嚇到後,龜縮推卸責任的連長;最後還有出身師大體系,但卻帶頭擺爛擺老的另一位預官排長,還有一樣出身師大體系,但卻擺爛到連冰都看不起的預官學弟。軍隊真的是社會的縮影,但是是黑暗的那一面。事後回想,我能夠平安退伍,真的是福大命大了,有好幾次演習時,因為一些長官不懂裝懂,差點把整個山頭炸掉,還好後來都沒有釀成大禍。唉!
繼續閱讀全文