2009-06-28

GIF photo images written with LZW compression

Tk 在 8.6 除了加入 PNG 格式的支援,同時因為 LZW 演算法專利已經過期,所以 Tk 8.6 也會加入 GIF photo images written with LZW compression 的支援。
下面是一些資訊:
"Unisys U.S. LZW Patent No. 4,558,302 expired on June 20, 2003, the counterpart patents in the United Kingdom, France, Germany and Italy expired on June 18, 2004, the Japanese counterpart patents expired on June 20, 2004 and the counterpart Canadian patent expired on July 7, 2004."
IBM 也握有 LZW 的專利,但是根據 GNU GIF 的網頁,IBM 的專利也將於 2006/10 到期,也就是說,實作的人將不用擔心觸碰到 LZW 專利地雷。
雖然我們有了 PNG,但是能夠使用 GIF 也不錯。

2009-06-27

Scripting: Higher Level Programming for the 21st Century

這是由 John K. Ousterhout 所寫的文章,而從現在 PHP/Perl/Python/Ruby/Tcl 各種 scripting language 的發展來看,似乎也是如 John K. Ousterhout 所推測的一樣。當然,自由軟體所帶來的效應,可能也是其中的一個原因之一。

Scripting language 的缺點就是慢,但是開發快速而且除錯方便,但是當硬體的速度愈來愈快的時候,Scripting language 的缺點也就不太算是缺點了,各種 Scripting language 只會愈來愈重要。

2009-06-25

Try/Catch/Finally syntax

Tcl 原本就有錯誤處理的機制(使用 catch),而在 TIP #329  (in 8.6 b1)又加入了類似 Try/Catch/Finally 來增強原本的機制。
proc read_hex_file {fname} {
set f [open $fname "r"]
set data {}
try {
while { [gets $f line] >= 0 } {
append data [binary format H* $line]
}
} trap {POSIX} {} {
puts "POSIX-type error"
} on error {em} {
error "Could not process file '$fname': $em"
} finally {
close $f
}
}
也就是說,原本 catch 是執行如果出錯,那就依據取得的 error code,再來判斷怎麼處理;而 try/finally 則是如果發生錯誤,會依據 error code 而把程式的流程流向該處理這個錯誤的 error handler,因此整個 code 如果寫的好會看起來比較清晰。對於錯誤的處理策略看起來比較清晰。

2009-06-24

SQLite and PostgreSQL

雖然 Tcl 在 8.6 終於加入了 TDBC,但是目前只有支援 SQLite, MySQL 等少數的資料庫,而沒有支援 PostgreSQL

PostgreSQL 有提供 Tcl 的介面(只是不是使用 TDBC API,而是 specify for PostgreSQL 的),而且需要自己去網站下載相關的檔案。

Google Student Summer 計畫裡,關於 Tcl 的部份,有看到關於 TDBC-PostgreSQL 的部份,只是不知道目前的進度怎麼樣了。

對我而言,SQLite 是單機使用的最佳選擇,而 PostgreSQL 雖然在 Open Source 界使用聲勢上弱於 MySQL,但是我還是最喜歡使用他(好吧,雖然現在因為沒有在寫關於網路和 WEB 的應用,所以沒有在用他了)。 而在甲骨文併購昇陽之後,MySQL 的前途變成了一件不明確的事情(雖然甲骨文不太可能就這樣壞掉自己的聲譽,所以囉),因此版權和 source code 所有權明確的 PostgreSQL 是一個好選擇,特別是當 PostgreSQL 的可靠度其實很可怕的時候(台灣的中鋼就是使用 PostgreSQL 哦)。

However,如果 TDBC-PostgreSQL 出來了,我會稍微測試一下相關的東西,看看這個 TDBC-PostgreSQL driver 的情況,如果有東西給我修改,對我而言比從零開始好,所以我已經放棄了一開始的想法,先從熟悉 TDBC 的方向著手。

另外,在 TDBC 之後,[Incr Tcl] 4.0(這個版本使用 TclOO 全部改寫)已經進入 Tcl core code,將會以 package 的方式存在,在 8.6 beta 2 就會進去了,所以 8.6 beta 2 出來的時候,我也會看看這部份的情況。

看起來 Tcl/Tk 8.6 將會是一個巨大的改版,不管是物件導向套件的引入(TclOO/iTcl),或者是資料庫 API 的統一(TDBC),甚至是引入 zlib 與 png 的支援,都將深刻的改變這個語言,同時也讓這個語言更好用更強壯。

A Slightly Skeptical View on Scripting Languages

A Slightly Skeptical View on Scripting Languages

一篇對於 Scripting Language 的文章。

比較語言的差異與優缺點是浪費時間,因為每個語言都有其優缺點,挑順手的就好了(除非是因為 project 還是 Boss 要求)。

不過就算是現在,我還是覺得 Tcl 很棒(雖然用的人沒有很多),因為 Tcl 的語言規則很簡單但是卻又變化無窮,John Ousterhout 真的好強啊~~~

Tkhtml v3

TkHTML

Tkhtml 是個通過 ACID2,for Tk 可以用來顯示 HTML/CSS 內容的 widget。

下面是在 Tcler's Wiki 上示範使用 Tkhtml 做出一個 Label widget 的範例:
package require Tkhtml 3.0

# Create and populate an html widget.
html .label -shrink 1
.label parse -final {
<b>Hello <i>world</i></b> example
}

# Pack the new html widget
pack .label

bind .label <KeyPress-q> exit
focus .label

Thread and Tcl

package require Thread
catch {console show}

set ::gThread [thread::create {thread::wait} ]

proc printTime { } {
thread::send -async $::gThread { puts stdout [clock format [clock seconds]] }
after 1000 printTime
}

printTime
puts "started test..."

#only needed for tclsh, to keep the interpreter alive and keep the event loop running
vwait forever
在經過一段時間的學習以後,我才慢慢的看懂了 Tcl 的 Thread 擴充套件應該怎麼用才對,相關的資訊可以看 Tcl Threading Model

如果要檢查 tclsh 是不是 build 成支援 thread,則可以用
expr {[info exists ::tcl_platform(threaded)] && $::tcl_platform(threaded)}
來做到。當值為 1 時,表示有支援。

Tcl/TK 8.5 new syntax: {*} 與 Eval

Tcl/Tk 8.5 引進了新的語法 {*},可以用來動態的建立命令執行,可以讓程式看起來更為簡單(使用 eval 會看起來比較複雜)。

我們可以用 Eval 這個指令將參數串接成一個字串後,將字串視為一個 Tcl Script 丟給解譯器去執行。下面是使用 Eval 版:
eval button .b $stdargs -text \$mytext -bd $border

{*} 可以將可以將串列的各個值分開為不同的參數,下面是改寫過後的版本:
button .b {*}$stdargs -text $mytext -bd $border

列出目前的磁碟機

我們可以使用 file 這個 command 來做到這件事,所拿到的是目前磁碟機的 list,下面是範例程式:
set disks [file volumes]

puts "Disks:"
foreach local $disks {
puts " $local --- [file system $local]"
}

在範例中,我們同時也使用了 file system 來取得檔案系統的資料(是 FAT 或者是 NTFS 等資料)。

Tcl/Tk 與 Thread

不知道為什麼,我對於 Thread 總是心存恐懼,雖然我已經懂得避掉一些不好的情況,但是遇上 Thread 總是怕怕的,可能是因為 Thread 非循序的特性讓我覺得無法自在的使用吧?

Tcl/Tk 在自己的 C API 已經有支援 Thread 的 API(編譯的時候要 enable),並且從 8.1 開始就已經是 thread safe 的軟體,而 Thread 這個套件則是讓我們可以透過 Tcl scripting 的方式來操作。

下面是 Tcl C API 關於 Thread 的部份:
Tcl_ConditionNotify, Tcl_ConditionWait, Tcl_ConditionFinalize, Tcl_GetThreadData, Tcl_MutexLock, Tcl_MutexUnlock, Tcl_MutexFinalize, Tcl_CreateThread, Tcl_JoinThread

在 Linux/FreeBSD/UNIX 世界裡,通常是遵循 POSIX 標準,所以是使用 PThread,而 Windows 平台則有自己的一套 API,而 Tcl/Tk 已經幫我們建立了一個中介層,所以不用管底層的差異。