西元2009年11月24日
[軟體] PCMan Telnet/BBS for Firefox 2009 全新套件

最近突然心血來潮,想學習怎樣寫 Firefox extension,
順便學習之前一直沒有學的 Javascript,於是,就重寫了 PCMan 作為練習
經過長時間的研究 + 三天密集 coding + 參考 FireBBS,目前已經初步可用了

PCMan Telnet/BBS extension for Firefox,誕生!
專案網頁: http://code.google.com/p/pcmanfx/

功能還不夠完整,但是該有的基本功能都有了,彩色顯示也很正常
重點是可以支援中文雙色字,顯示效果也很接近原 PCMan 系列。
當然效能和記憶體用量遠不能和原版 PCMan 相比,但是對於用純
Javascript 寫成的套件來說,目前的執行效率還在可接受的範圍。

歡迎大家測試或給予意見,或者是...最好可以有熱血的朋友加入開發,
小弟最近很忙,可能會沒有時間繼續寫完。
目前程式碼相當短,而且最困難的核心部分我幾乎都已經寫完了,
剩下就是許多小地方的補強。 這次是純 Javascript,
有能力改寫的人應該就很多了吧! 快加入吧!

主要特色:
1. 使用 Javascript + XUL + 少量 html 開發
2. 程式簡潔,可讀性佳,模組化,初版僅 1000 行,
易讀,易改,相當適合想學習 Telnet 程式撰寫的朋友,
作為學習的參考。
3. 雖然是使用 Javascript,執行效率仍在可接受的範圍,
操作上有接近原生軟體的表現。
4. 支援一字雙色的顯示,畫面呈現效果優良,接近原生軟體。
5. 跨平台,目前確定可運作於 Windows (優) 和 Linux (可),
Mac 及其他 Firefox 能運作的平台尚未測試,理論上可用,
但顯示效果會略有出入,中文輸入部分可能會有些小問題。
6. 開放原始碼,以 GNU/GPL V2 自由授權釋出。

想加入開發的朋友,請和我聯絡,加入這個專案。

西元2009年11月24日 (週二) 23時57分41秒  評論與迴響 (36)  | 人氣:10591

西元2009年06月19日
glib/gio 研究心得

之前本來覺得 glib/gio 的 local 檔案系統實做有點問題
後來發現,其實沒有 gvfs,本地端檔案確實還是可以運作的,
只是會不太完整。 因為雖然 g_local_file_copy 裡面
只會顯示「不支援此操作」的錯誤,但 g_file_copy 裡面還暗藏了
fallback 的程式碼,而這部份是可以運作的。
所以大體而言,沒有 gvfs,glib/gio 的檔案 I/O 還是可以
對本地端的檔案提供最基本的支援。

不過,經過實地測試,gio 即使是操作本地端的檔案,
在某些操作上,效能都不是很理想...也比使用 POSIX
的 system call 要慢上非常多倍。看來 gio 還是需要加油啊。

西元2009年06月19日 (週五) 00時24分32秒  評論與迴響 (4)  | 人氣:1687

西元2008年11月21日
騙人的 glib/gio

Glib 在新版當中引入了 GIO,作為檔案操作和 streaming 的 lib
官方網頁寫了一大堆的優點,並且宣稱得多好多好,其實...
雖然號稱是 Glib 的一部分,而 Glib 理論上是跨桌面跨平台,
但少掉了 GVFS,GIO 其實就完全的不會動了...
而 GVFS,其實前身就是 GNOME VFS。
GIO 雖然宣稱可以在沒有 GVFS 的環境下運作,其實真相並非如此
Volume management 的部份就不會動了,而且磁碟的掛載
內部是直接「寫死」呼叫 gnome-mount,沒有這些 gnome 的工具程式
存在時,相關的部份根本完全都不會動。
沒有 GVFS 它是可以「編譯」沒錯,但實際上幾乎所有功能都廢了...
另外像是檔案操作的部份,雖然文件上宣稱,少了 GVFS,GIO 仍然可以運作,
只是會剩下只支援本地端檔案,而不能支援各種通訊協定,但是...
讀過程式碼之後,就會發現這是謊言...

glib-2.16.5/gio/glocalfile.c, line: 2305


static gboolean
g_local_file_copy (GFile *source,
GFile *destination,
GFileCopyFlags flags,
GCancellable *cancellable,
GFileProgressCallback progress_callback,
gpointer progress_callback_data,
GError **error)
{
/* Fall back to default copy */
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED, "Copy not supported");
return FALSE;
}


所謂的沒有 GVFS 還剩下本地端的支援,只是秀個錯誤跟你說:「對不起,不支援這個功能喔...」
所以,雖然宣稱是 Glib 的一部分,雖然表面上作成跨桌面,不需要 GNOME,但實際上,
少了 GNOME/GVFS,基本上你很難讓 GIO 真正發揮功用,大部分的功能,其實都是故障的。


西元2008年11月21日 (週五) 00時52分56秒  評論與迴響 (2)  | 人氣:2621

西元2008年10月15日
libunique, 協助撰寫 single instance application 的好物

之前沒有用過,今天才發現有這個,看來是個有趣的東西
透過這個小 lib,處理 single instance 的 gtk+ 程式
就變得非常的簡單了。
http://live.gnome.org/LibUnique


西元2008年10月15日 (週三) 12時29分30秒  評論與迴響 (7)  | 人氣:4175

西元2008年06月18日
[程式] PCMan 私房密技 - 用 glib 的 GKeyFile 來處理 IPC

不知道我是不是第一個發明這樣搞的人,但這絕對是個有用的密技

在 C 語言裡面,處理程式的命令列參數,一直是很討厭的事情。
在 UNIX 類系統上,伴隨 GTK+ library 而來的 glib,很方便的提供了現成工具
GOption commandline parser

這在每一台 Linux 桌面的機器上都有,所以不用裝額外的 library
加上在寫 gtk+ 程式時本來就是直接用 glib 現成的工具比較方便
GOption 可以很方便的幫你把 argv 翻譯成各個變數的數值,大幅度簡化程式
不過,這樣方便的工具,還是有他的限制。

當你需要做 single instance 程式時 (我不知道正確的名稱,總之,就是讓
同一個程式多次啟動時,可以共用同一個 process,避免資源的浪費,
例如你打 firefox 指令,並且傳給他網址當參數,他會去找執行中的 firefox
process,然後把參數傳過去開新視窗,避免再重複執行另一個 firefox)
在這種情境下,GOption 變得不方便了,因為他無法處理由其他 process
傳過來的參數,只能處理 main() 裡面的 argv,而且只能處理一次。
第二次再傳給他另一個 argv,就會出問題了,所以無法用在這種用途。
這種設計上的缺陷,大大的限制了他的可用性。

於是,你有兩個選擇:

1. 不用 GOption,自己寫個函數來處理 argv 的參數,這樣從其他 process
透過 IPC 傳過來的參數,也可以用同樣方式處理。

2. 使用 GOption,但是在每個啟動的 process 都先用 GOption parse 過
把 argv 轉成你程式當中的變數,再透過你自己設計的方式,用 IPC
把這些變數傳遞給 single instance 的主 process

不管是哪一種,都很累,也很麻煩。
但是,透過 GKeyFile 的協助,第二種方式將變得簡單。以下是密技:

在 main 當中,先用 GOption 把 argv 翻譯成在程式內有意義的變數
然後,要透過 IPC 傳給主 process 之前,先把他寫成 INI 格式!
這樣一來,在主 process 收到的參數,就不再是一堆無意義的 argv
而是形同收到一個有 key/value pairs 的 ini 檔案。

這時候,透過 g_key_file_load_from_data 這個 glib 提供的 ini parser
可以很容易的,把收到的參數,轉回程式可了解的變數。
使用起來不但簡單,而且程式相當的可讀,乾淨。
比起實做自己的資料編碼/解析方式,透過 GKeyFile,以 ini 格式編碼
IPC 時傳輸的資料,要簡單的太多了,程式可讀性也會好很多。
因為是 UNIX socket 傳輸,而不是寫入 on disk 的 ini 檔
所以實際運作並不會有明顯的效能損傷,但會大幅簡化程式的設計。
適當使用手邊現有的工具,做讓人意想不到的結合,就可以創造出新的價值

以上是對很多人沒有任何用處的 PCMan 私房 GTK+ 密技,
亂無章法,隨手記下,也沒時間寫範例,但希望對看得懂的有緣人有幫助...


西元2008年06月18日 (週三) 00時58分32秒  評論與迴響 (14)  | 人氣:2823

<< 上一頁 | 下一頁 >>