<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1350456806348278691</id><updated>2012-02-16T22:16:35.259+08:00</updated><category term='Syntax'/><category term='Tips'/><category term='Example'/><category term='Tk'/><category term='dotNET'/><category term='API'/><category term='書藉'/><category term='Release'/><category term='Database'/><category term='Active Tcl'/><category term='相關文章'/><category term='套件'/><title type='text'>Scripting Tcl 大小事</title><subtitle type='html'>關於各種 Tcl/Tk 的資訊，以及 Tcl/Tk 各種使用上的記錄分享</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>50</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-6715669875191620686</id><published>2012-01-10T00:13:00.002+08:00</published><updated>2012-01-10T00:14:50.613+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='套件'/><title type='text'>tcllib 1.14 is out</title><content type='html'>&amp;nbsp;我現在才注意到，在 2011.12.13，tcllib 已經釋出了新版 &lt;a href="http://sourceforge.net/projects/tcllib/files/tcllib/1.14/"&gt;v1.14&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;Overview&lt;br /&gt;========&lt;br /&gt;&lt;br /&gt;21  new packages                in 7   modules&lt;br /&gt;30  changed packages            in 24  modules&lt;br /&gt;8   internally changed packages in 8   modules&lt;br /&gt;328 unchanged packages          in 89  modules&lt;br /&gt;393 packages, total             in 107 modules, total&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-6715669875191620686?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/6715669875191620686/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=6715669875191620686' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/6715669875191620686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/6715669875191620686'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2012/01/tcllib-114-is-out.html' title='tcllib 1.14 is out'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-8055697098487423296</id><published>2012-01-08T13:13:00.000+08:00</published><updated>2012-01-08T13:13:04.225+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Syntax'/><title type='text'>Coroutines</title><content type='html'>在 8.6 引進新的 Non-Recursive Engine (NRE) 之後，帶進了新的功能 &lt;a href="http://www.tcl.tk/cgi-bin/tct/tip/328.html"&gt;Coroutines&lt;/a&gt;。不過 Coroutine&amp;nbsp;對我而言是很陌生的東西，所以做一下初學筆記。&lt;br /&gt;&lt;br /&gt;在看過網路上對於 Coroutine&amp;nbsp;的介紹以後，我想可以簡單的總結如下：&lt;br /&gt;&lt;br /&gt;Croutine 是自 1960 年代就已經現身的多工實做技術，原理相當單純，在 Coroutine 的 "&lt;span style="font-weight: bold;"&gt;yield&lt;/span&gt;"  是屬於程式語言層面，透過特定技巧或機制，讓原本循序執行的陳述指令，得以做出交錯執行的結果，可以說是 Windows 3.X  「合作式多工」的基礎概念（十分類似）。&lt;br /&gt;&lt;br /&gt;用簡單的一句話來說 Coroutine，就是可以暫時中斷，之後再繼續執行的程序。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;下面是從 Tcl 8.6 manual page copy 出來的例子：&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;coroutine accumulator apply {{} {&lt;br /&gt;    set x 0&lt;br /&gt;    while 1 {&lt;br /&gt;        # yield $x: 丟資料並且把主控權交給呼叫者&lt;br /&gt;        incr x [yield $x]&lt;br /&gt;    }&lt;br /&gt;}}&lt;br /&gt;&lt;br /&gt;for {set i 0} {$i &amp;lt; 10} {incr i} {&lt;br /&gt;    puts "$i -&amp;gt; [accumulator $i]"&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;在 &lt;a href="http://www.tcl.tk/man/tcl8.6/TclCmd/coroutine.htm"&gt;manual page&lt;/a&gt; 裡還有其它的例子幫助理解，希望我對 Coroutines 的理解是正確的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-8055697098487423296?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/8055697098487423296/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=8055697098487423296' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8055697098487423296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8055697098487423296'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2012/01/coroutines.html' title='Coroutines'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-1702461226393609660</id><published>2012-01-08T11:16:00.000+08:00</published><updated>2012-01-08T11:16:51.689+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='套件'/><title type='text'>Wub</title><content type='html'>&lt;a href="http://wiki.tcl.tk/15781"&gt;Wub&lt;/a&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/wub/"&gt;wub - Wub pure tcl HTTP1.1 server, client and tool suite&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;雖然 Wub 發展有一段時間了，不過我是最近才發現的。&lt;br /&gt;&lt;br /&gt;截錄自 Tcler Wiki 的介紹：&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;b&gt;Wub is a web-server written in pure-Tcl. It runs the Wiki you're now reading. It absolutely requires &lt;span style="color: red;"&gt;Tcl 8.6&lt;/span&gt; and tracks the HEAD closely. It should help in creating highly-dynamic (and portable) web applications. It is the successor in spirit of Tclhttpd, aiming to preserve the best of it while using the bleeding-edge latest Tcl facilities to simplify and extend.&lt;/b&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tcler Wiki 就是使用 Wub 架起來的，非常好的 working example。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-1702461226393609660?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/1702461226393609660/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=1702461226393609660' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/1702461226393609660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/1702461226393609660'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2012/01/wub.html' title='Wub'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-897694436454223479</id><published>2012-01-07T17:01:00.000+08:00</published><updated>2012-01-07T17:01:27.979+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>備份 (on Windows)</title><content type='html'>跟之前一樣的程式，只是加上 GUI 表示目前正在備份中，加上練習 thread 使用的部份。&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;#!/usr/bin/tclsh&lt;br /&gt;#&lt;br /&gt;# This file is used to backup my homepage&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;package require Tk&lt;br /&gt;package require Thread&lt;br /&gt;&lt;br /&gt;set ::gThread [thread::create {thread::wait} ]&lt;br /&gt;&lt;br /&gt;label .greetings -text "Now backup my homepage..." -bd 4 -relief ridge&lt;br /&gt;pack .greetings -fill both&lt;br /&gt;&lt;br /&gt;wm title . "Backup"&lt;br /&gt;&lt;br /&gt;thread::send -async $::gThread { &lt;br /&gt;    set backupfile $env(HOME)&lt;br /&gt;    append backupfile "\\My Documents"&lt;br /&gt;    append backupfile "\\Homepage-"&lt;br /&gt;    append backupfile [clock format [clock seconds] -format %Y%m%d]&lt;br /&gt;    append backupfile ".7z"&lt;br /&gt;&lt;br /&gt;    set backupdir $env(HOME)&lt;br /&gt;    append backupdir "\\My Documents"&lt;br /&gt;    append backupdir "\\public_html"&lt;br /&gt;&lt;br /&gt;    set fileExist [file exists $backupfile]&lt;br /&gt;    if {$fileExist &amp;gt; 0} {&lt;br /&gt;        puts "Now try to remove old backup file."&lt;br /&gt;        file delete $backupfile&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    set var [list 7z a $backupfile $backupdir]&lt;br /&gt;    exec {*}$var        &lt;br /&gt;} result&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;vwait result&lt;br /&gt;exit&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-897694436454223479?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/897694436454223479/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=897694436454223479' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/897694436454223479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/897694436454223479'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2012/01/on-windows.html' title='備份 (on Windows)'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-8018313332135405413</id><published>2011-11-07T23:37:00.001+08:00</published><updated>2011-11-07T23:38:21.029+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>使用 7-zip 壓縮目錄與檔案 (on Windows)</title><content type='html'>&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;#!/usr/bin/tclsh&lt;br /&gt;#&lt;br /&gt;# This file is used to backup my homepage&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;set backupfile $env(HOME)&lt;br /&gt;append backupfile "\\My Documents"&lt;br /&gt;append backupfile "\\Homepage-"&lt;br /&gt;append backupfile [clock format [clock seconds] -format %Y%m%d]&lt;br /&gt;append backupfile ".7z"&lt;br /&gt;&lt;br /&gt;set backupdir $env(HOME)&lt;br /&gt;append backupdir "\\My Documents"&lt;br /&gt;append backupdir "\\public_html"&lt;br /&gt;&lt;br /&gt;set fileExist [file exists $backupfile]&lt;br /&gt;if {$fileExist &amp;gt; 0} {&lt;br /&gt;    puts "Now try to remove old backup file."&lt;br /&gt;    file delete $backupfile&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;set var [list 7z a $backupfile $backupdir]&lt;br /&gt;exec {*}$var&lt;br /&gt;&lt;br /&gt;puts "Done."&lt;br /&gt;&lt;br /&gt;exit&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;因為在 Windows XP 上也有需要網頁的備份，所以把之前在 Linux 上用的稍微改寫以後就搬過來了。要注意的是，我已經把 7-ZIP 加進去 PATH 環境變數裡了，所以就不用寫絕對路徑，只要寫  7z 就可以了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-8018313332135405413?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/8018313332135405413/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=8018313332135405413' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8018313332135405413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8018313332135405413'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2011/11/7-zip-on-windows.html' title='使用 7-zip 壓縮目錄與檔案 (on Windows)'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-4950734580273052598</id><published>2011-08-18T16:51:00.000+08:00</published><updated>2011-08-18T16:51:10.616+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Active Tcl'/><title type='text'>ActiveTcl 8.6.0.0b6 released</title><content type='html'>comp.lang.tcl 的消息：&lt;br /&gt;&lt;a href="http://groups.google.com/group/comp.lang.tcl/browse_thread/thread/f6be45598f46b62e#"&gt;ActiveTcl 8.6.0.0b6 released&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Code base 為最近釋出的 Tcl 8.6 b2。&lt;br /&gt;&lt;br /&gt;== New in ActiveTcl 8.6.0.0b6 ==&lt;br /&gt;&lt;br /&gt;A beta update release with updates, including:&lt;br /&gt;&lt;br /&gt;* Updated Tcl/Tk 8.6 core&lt;br /&gt;* Updated packages&lt;br /&gt;** BWidget 1.9.5&lt;br /&gt;** Thread 2.6.7&lt;br /&gt;** platform 1.0.10&lt;br /&gt;** msgcat 1.4.4&lt;br /&gt;** tcltest 2.3.3&lt;br /&gt;** sqlite 3.7.7.1&lt;br /&gt;** Tktable 2.11&lt;br /&gt;** Treectrl 2.3.2&lt;br /&gt;** Tablelist 5.3.1&lt;br /&gt;** cmdline 1.3.3&lt;br /&gt;** ftp 2.4.10&lt;br /&gt;** style::as 1.4.1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-4950734580273052598?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/4950734580273052598/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=4950734580273052598' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/4950734580273052598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/4950734580273052598'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2011/08/activetcl-8600b6-released.html' title='ActiveTcl 8.6.0.0b6 released'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-5431776864498797038</id><published>2011-07-24T00:15:00.000+08:00</published><updated>2011-07-24T00:15:27.737+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Active Tcl'/><title type='text'>ActiveTcl 8.5.10.1 released</title><content type='html'>&lt;a href="http://www.activestate.com/activetcl"&gt;ActiveTcl&lt;/a&gt; 8.5.10.1 已經在 2011/07/21 釋出，我把目前的使用環境更新為這個版本。&lt;br /&gt;&lt;br /&gt;可以看一下 comp.lang.tcl 的&lt;a href="http://groups.google.com/group/comp.lang.tcl/browse_thread/thread/a28e61e92a009a40#"&gt;消息&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;== New in ActiveTcl 8.5.10.1 ==&lt;br /&gt;&lt;br /&gt;A patchlevel release with updates, including:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Updated Tcl/Tk 8.5.10 core&lt;/li&gt;&lt;li&gt;Updated teacup package management application&lt;/li&gt;&lt;li&gt;Updated packages&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Sqlite 3.7.7.1&lt;/li&gt;&lt;li&gt;Tablelist 5.3.1 &lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-5431776864498797038?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/5431776864498797038/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=5431776864498797038' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5431776864498797038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5431776864498797038'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2011/07/activetcl-85101-released.html' title='ActiveTcl 8.5.10.1 released'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-8582328050506689602</id><published>2011-07-20T07:21:00.001+08:00</published><updated>2011-07-23T16:14:37.983+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>使用 7-zip 壓縮目錄與檔案</title><content type='html'>&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;#!/usr/bin/tclsh&lt;br /&gt;#&lt;br /&gt;# This file is used to backup my homepage&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;set backupfile $env(HOME)&lt;br /&gt;append backupfile "/Homepage-"&lt;br /&gt;append backupfile [clock format [clock seconds] -format %Y%m%d]&lt;br /&gt;append backupfile ".7z"&lt;br /&gt;&lt;br /&gt;set backupdir $env(HOME)&lt;br /&gt;append backupdir "/public_html"&lt;br /&gt;&lt;br /&gt;set fileExist [file exists $backupfile]&lt;br /&gt;if {$fileExist &amp;gt; 0} {&lt;br /&gt;    puts "Now try to remove old backup file."&lt;br /&gt;    file delete $backupfile&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;set var [list 7z a $backupfile $backupdir]&lt;br /&gt;exec {*}$var&lt;br /&gt;&lt;br /&gt;puts "Done."&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;使用 7-zip 建立網頁的備份檔案 (on Linux)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-8582328050506689602?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/8582328050506689602/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=8582328050506689602' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8582328050506689602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8582328050506689602'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2011/07/7-zip.html' title='使用 7-zip 壓縮目錄與檔案'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-2386153221365542740</id><published>2011-06-26T16:34:00.000+08:00</published><updated>2011-06-26T16:34:32.286+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>Tcl/Tk 8.5.10 RELEASED</title><content type='html'>&lt;a href="http://groups.google.com/group/comp.lang.tcl/browse_thread/thread/9c1543a3770218d7#"&gt;Tcl/Tk 8.5.10 RELEASED&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Summary of Changes since Tcl/Tk 8.5.9:&lt;br /&gt;--------------------------------------&lt;br /&gt;&lt;br /&gt;The following were the main changes in Tcl/Tk 8.5.10.  A complete list&lt;br /&gt;can be found in the changes file at the root of the source tree.  The&lt;br /&gt;more complete ChangeLog is also included with each source release.  This&lt;br /&gt;is a patch release, so it primarily includes bug fixes and corrections&lt;br /&gt;to erratic behavior.  Below are only the most notable changes.&lt;br /&gt;&lt;br /&gt;* TIP 378: reduced [info frame] accuracy to gain performance.&lt;br /&gt;- use [interp debug] to restore accuracy and lose performance gain.&lt;br /&gt;&lt;br /&gt;* Unicode codepoint definitions updated to Unicode 6.0 (BMP only)&lt;br /&gt;&lt;br /&gt;* New subcommand [ttk::entry validate].&lt;br /&gt;&lt;br /&gt;* Improved performance formatting numbers for string output.&lt;br /&gt;&lt;br /&gt;* dlopen() in Unix/Mac OS X [load] now uses RTLD_NOW|RTLD_LOCAL.&lt;br /&gt;*** POTENTIAL INCOMPATIBILITY ***&lt;br /&gt;&lt;br /&gt;* Forbid [labelframe $w -container true].&lt;br /&gt;*** POTENTIAL INCOMPATIBILITY ***&lt;br /&gt;&lt;br /&gt;* Fixed crash in [$treeview tag add/remove].&lt;br /&gt;&lt;br /&gt;* Fixed crash in [tk_getSaveFile] on Windows.&lt;br /&gt;&lt;br /&gt;* Repaired server [socket] race condition on Win that stopped new&lt;br /&gt;accepts.&lt;br /&gt;&lt;br /&gt;* Fixed memory corruption when [$canvas dchars] removes all polygon&lt;br /&gt;coords.&lt;br /&gt;&lt;br /&gt;* Corrected failure of [$canvas insert $line] to completely refresh&lt;br /&gt;display.&lt;br /&gt;&lt;br /&gt;* Restored [spinbox $w -from $lo -to $hi] display of "08" and "09".&lt;br /&gt;&lt;br /&gt;* Fixed command name resolution caching involving [namespace path].&lt;br /&gt;&lt;br /&gt;* Fixed crash when append trace unsets traced variable.&lt;br /&gt;&lt;br /&gt;* Fixed Win crash in [wm manage] using Tkhtml3.&lt;br /&gt;&lt;br /&gt;* Fixed crash in Ttk unset traces.&lt;br /&gt;&lt;br /&gt;* Fixed failure of Tcl_ResetResult() to clear Tcl_ObjType information.&lt;br /&gt;&lt;br /&gt;* New version 2.3.3 of tcltest package.&lt;br /&gt;- Improved reporting from tests in slave interps&lt;br /&gt;&lt;br /&gt;* New version 2.7.6 of http package.&lt;br /&gt;- Stop surplus \n in POST requests.&lt;br /&gt;&lt;br /&gt;* New version 1.0.10 of platform package.&lt;br /&gt;- DEB_HOST_MULTIARCH support&lt;br /&gt;&lt;br /&gt;* New version 1.4.4 of msgcat package.&lt;br /&gt;&lt;br /&gt;* Restored tearoff submenus in XP.&lt;br /&gt;&lt;br /&gt;* Modal dialogs on Windows now use MB_TASKMODAL | MB_SETFOREGROUND.&lt;br /&gt;&lt;br /&gt;* Corrected [wm forget $w] losing $w.&lt;br /&gt;&lt;br /&gt;* Corrected loss of -in value by [grid remove].&lt;br /&gt;&lt;br /&gt;* Make [$treeview see] schedule a redisplay.&lt;br /&gt;&lt;br /&gt;* Corrected [console] treatment of '\0'.&lt;br /&gt;&lt;br /&gt;* Fixed crash in nested, traced, compiled [catch].&lt;br /&gt;&lt;br /&gt;* Fixed crash when list parsing overflows int limits.&lt;br /&gt;&lt;br /&gt;* Revised interface of internal routine TclFindElement().&lt;br /&gt;*** POTENTIAL INCOMPATIBILITY ***&lt;br /&gt;&lt;br /&gt;* Imported fixes from libtommath 0.42.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-2386153221365542740?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/2386153221365542740/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=2386153221365542740' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/2386153221365542740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/2386153221365542740'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2011/06/tcltk-8510-released.html' title='Tcl/Tk 8.5.10 RELEASED'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-8996795786096188190</id><published>2011-04-10T19:04:00.000+08:00</published><updated>2011-04-10T19:04:00.420+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Active Tcl'/><title type='text'>file command with ActiveTcl 8.6b5</title><content type='html'>&lt;a href="http://groups.google.com/group/comp.lang.tcl/browse_thread/thread/2a839ad7e01200fc/439631b4f885bf5c"&gt;Safe interp and file command with ActiveTcl 8.6b5&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;我也遇到 ::tcl::mathfunc::maxunknown hidden command "file" 這個錯誤訊息（在使用 ActiveTcl 8.6b5 執行 TclHttpd 的時候），只是在 Windows XP 上遇到，目前看起來應該是 ActiveTcl 8.6b5 的問題。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-8996795786096188190?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/8996795786096188190/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=8996795786096188190' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8996795786096188190'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8996795786096188190'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2011/04/file-command-with-activetcl-86b5.html' title='file command with ActiveTcl 8.6b5'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-7217831661319206670</id><published>2011-02-19T06:56:00.000+08:00</published><updated>2011-02-19T06:56:59.171+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Active Tcl'/><title type='text'>ActiveTcl 8.6.0.0b5</title><content type='html'>這版和 beta-3, beta-4 一樣都是基於 Tcl 8.6 beta1.2 的 code base，如果要下載可以到 ActiveState &lt;a href="http://www.activestate.com/activetcl/activetcl-8-6"&gt;ActiveTcl 8.6 的網頁&lt;/a&gt;。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-7217831661319206670?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/7217831661319206670/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=7217831661319206670' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/7217831661319206670'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/7217831661319206670'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2011/02/activetcl-8600b5.html' title='ActiveTcl 8.6.0.0b5'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-275621275062398649</id><published>2011-01-26T21:50:00.000+08:00</published><updated>2011-01-26T21:50:26.745+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='套件'/><title type='text'>tcllib 1.13 is out</title><content type='html'>2011.01.24，tcllib 釋出了新版 v1.13。&lt;br /&gt;&lt;br /&gt;Overview&lt;br /&gt;========&lt;br /&gt;44 new packages in 10 modules&lt;br /&gt;29 changed packages in 24 modules&lt;br /&gt;62 internally changed packages in 11 modules&lt;br /&gt;207 unchanged packages in 79 modules&lt;br /&gt;348 packages, total in 103 modules, total&lt;br /&gt;&lt;br /&gt;相關連結：&lt;a href="http://sourceforge.net/projects/tcllib/files/tcllib/1.13/"&gt;http://sourceforge.net/projects/tcllib/files/tcllib/1.13/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-275621275062398649?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/275621275062398649/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=275621275062398649' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/275621275062398649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/275621275062398649'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2011/01/tcllib-113-is-out.html' title='tcllib 1.13 is out'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-5958867980241393891</id><published>2010-10-03T11:47:00.001+08:00</published><updated>2010-10-03T13:01:37.946+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Syntax'/><title type='text'>apply and procedure</title><content type='html'>&lt;a href="http://local.joelonsoftware.com/wiki/%E4%BD%A0%E7%9A%84%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80%E5%8F%AF%E4%BB%A5%E9%80%99%E6%A8%A3%E5%81%9A%E5%97%8E%EF%BC%9F"&gt;你的程式語言可以這樣做嗎？&lt;/a&gt; &amp;nbsp;讀完以後，用 Tcl 實驗匿名函式能力以後的結果。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;寫程式的時候，你注意到有二段 code 一模一樣，除了一個反覆呼叫一個叫 BoomBoom 的函數，另一個反覆呼叫一個喚作 PutInPot 的。&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;puts "get the lobster"&lt;br /&gt;PutInPot "lobster"&lt;br /&gt;PutInPot "water"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;and &lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;puts "get the chicken"&lt;br /&gt;BoomBoom "chicken"&lt;br /&gt;BoomBoom "coconut"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;現在你需要一個辦法，使得你可以將一個函數用作另一個函數的參數。這是個重要的能力，因為你更容易將常用的程式碼收藏在一個函數內。而 Tcl 所具有的彈性讓我們可以這樣做：&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;proc Cook {arg1 arg2 func} {&lt;br /&gt;   puts -nonewline "get the "&lt;br /&gt;   puts $arg1&lt;br /&gt;   &lt;br /&gt;   $func $arg1&lt;br /&gt;   $func $arg2&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;所以我們就可以這樣用：&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Cook  "lobster" "water" "PutInPot"&lt;br /&gt;Cook  "chicken" "coconut" "BoomBoom" &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;這樣就可以將函數作為參數了。&lt;br /&gt;&lt;br /&gt;假設你未定義 PutInPot 或 BoomBoom 這些函數。如果能直接將它寫進一行內，不是比在其他地方宣告它們更好嗎？&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;proc Cook {arg1 arg2 func} {&lt;br /&gt;   puts -nonewline "get the "&lt;br /&gt;   puts $arg1&lt;br /&gt;   &lt;br /&gt;   set result [info procs $func]&lt;br /&gt;&lt;br /&gt;   if {[string length $result] == 0} {&lt;br /&gt;    apply $func $arg1&lt;br /&gt;    apply $func $arg2&lt;br /&gt;   } else {&lt;br /&gt;    $func $arg1&lt;br /&gt;    $func $arg2&lt;br /&gt;   }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;所以：&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Cook &lt;/code&gt;&lt;code&gt;"chicken" "coconut"&lt;/code&gt;&lt;code&gt; {{food} { &lt;br /&gt;    puts -nonewline "BoomBoom --- "&lt;br /&gt;    puts $food}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;這樣是不是很方便？我建立函數時，甚至不用考慮怎麼命名，直接拿起它們，丟到一個函數內就可以了。&lt;br /&gt;&lt;br /&gt;apply - Apply an anonymous function&lt;br /&gt;apply func ?arg1 arg2 ...?&lt;br /&gt;&lt;br /&gt;其中的 func 定義了參數和 procedure 要執行的東西（procedure body），思考一下 Tcl 如何定義 procedure，就知道該怎麼做：&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;proc anonymous_function {food} {&lt;br /&gt;    puts -nonewline "BoomBoom --- "&lt;br /&gt;    puts $food}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;所以&lt;br /&gt;&lt;br /&gt;&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;Cook "chicken" "coconut" {{food} {&lt;br /&gt;    puts -nonewline "BoomBoom --- "&lt;br /&gt;    puts $food&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-5958867980241393891?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/5958867980241393891/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=5958867980241393891' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5958867980241393891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5958867980241393891'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2010/10/apply-and-procedure.html' title='apply and procedure'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-4726832626277247701</id><published>2010-09-26T22:40:00.001+08:00</published><updated>2010-09-26T22:52:25.345+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>使用 tcom 取得 network adapter name list</title><content type='html'>&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;proc getNetworkAdapter {} {&lt;br /&gt;&lt;br /&gt;    package require tcom;&lt;br /&gt;&lt;br /&gt;    if [catch {::tcom::ref getobject "winmgmts:root/CIMV2"} wmi] then {&lt;br /&gt;     return -code error $wmi;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    set wql {SELECT * FROM Win32_NetworkAdapter}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;    if [catch {$wmi ExecQuery $wql} tmp] then {&lt;br /&gt;        return -code error $tmp;&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    ::tcom::foreach instance $tmp {&lt;br /&gt;        set propSet [$instance Properties_]&lt;br /&gt;        set msgVal [[$propSet Item NetConnectionID] Value]&lt;br /&gt;        &lt;br /&gt;        if {[string equal $msgVal ::tcom::NULL] == 0} {                         &lt;br /&gt;            lappend Result $msgVal&lt;br /&gt;        }&lt;br /&gt;    }     &lt;br /&gt;&lt;br /&gt;    return $Result    &lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;使用 tcom 透過 WMI 拿到 network adapter name 的 list。&lt;br /&gt;&lt;br /&gt;參考資料：&lt;br /&gt;&lt;a href="http://wiki.tcl.tk/11633"&gt;Matthias Hoffmann - Tcl-Code-Snippets - tcom &amp;amp; wmi - Examples&amp;nbsp;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-4726832626277247701?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/4726832626277247701/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=4726832626277247701' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/4726832626277247701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/4726832626277247701'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2010/09/tcom-network-adapter-name-list.html' title='使用 tcom 取得 network adapter name list'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-1617280503693220397</id><published>2010-09-17T22:23:00.002+08:00</published><updated>2010-09-17T22:24:40.997+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Active Tcl'/><title type='text'>ActiveTcl 8.5.9.0</title><content type='html'>ActiveTcl 8.5.9.0 已經在 ActiveState 的網站上可以下載了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Tcl 8.5.9 的改變：&lt;br /&gt;&lt;br /&gt;* TIP 359: new X11 option: [wm attributes -type]&lt;br /&gt;- stops inappropriate Compiz animation of Tk menu &amp;amp; combobox.&lt;br /&gt;&lt;br /&gt;* TIP 360: modernize menus on X11.&lt;br /&gt;* New widget [ttk::spinbox].&lt;br /&gt;&lt;br /&gt;* [lappend arr(elem)] no longer fires read traces as it inconsistently&lt;br /&gt;has in some situations, but not in others.&lt;br /&gt;*** POTENTIAL INCOMPATIBILITY ***&lt;br /&gt;&lt;br /&gt;* [tk_getOpenFile] on Windows: unlimited multiple-file selection.&lt;br /&gt;&lt;br /&gt;* [load] uses LOAD_WITH_ALTERED_SEARCH_PATH for fewer surprises when&lt;br /&gt;bringing in DLLs via dependencies on Windows.&lt;br /&gt;*** POTENTIAL INCOMPATIBILITY ***&lt;br /&gt;&lt;br /&gt;* Updated [send] security rules to current Ubuntu/Fedora conventions.&lt;br /&gt;* Fixed [wm iconphoto] on LP64 unix systems.&lt;br /&gt;* [chan copy] of more than 2**31 bytes is now possible.&lt;br /&gt;* min() and max() functions now work in safe interps.&lt;br /&gt;* [$menu delete $tooBig end] now properly a no-op.&lt;br /&gt;* canvas items now properly updated when canvas state changes.&lt;br /&gt;* Revised [ttk::sizegrip] to accommodate Compiz.&lt;br /&gt;&lt;br /&gt;* Revised default Text bindings for &lt;delete&gt; and &lt;backspace&gt; to account;&lt;br /&gt;for insertion point relationship to the selection.&lt;br /&gt;&lt;br /&gt;* Corrected result of [tcl::mathfunc::abs 0.0].&lt;br /&gt;* New version 1.432 of msgcat package.&lt;br /&gt;* New version 1.0.9 of platform package.&lt;br /&gt;* New version 0.8.6 of tile package.&lt;br /&gt;* Changes to support building with MSVC++ 2010.&lt;br /&gt;* Prevent race condition in some XIM implementations.&lt;br /&gt;* Fixed bad results from [file rootname].&lt;br /&gt;* Prevent consumption of all memory when [chan copy] copies to slow channel.&lt;br /&gt;* [wm transient] now works even with withdrawn windows.&lt;br /&gt;* $DISPLAY can now contain "::".&lt;br /&gt;* Restored compatibility of [entry] validation with Itcl variable scope.&lt;br /&gt;* Fixed line-sensitive matching by [regexp].&lt;br /&gt;* Fixed memory corruption in complex canvas tag searches.&lt;br /&gt;* Fixed crash in encoding finalization.&lt;br /&gt;* Fixed crashes in widget destruction.&lt;br /&gt;* Fixed crash in GetFontFamilyName().&lt;br /&gt;* Fixed crash in menu deletion.&lt;br /&gt;* Fixed crash in peer text dump.&lt;br /&gt;* Fixed crash when bind scripts are empty.&lt;br /&gt;* Fixed crash in unset traces during [array unset].&lt;br /&gt;* Fixed crash deleting vars during callframe pop.&lt;br /&gt;* Fixed crash in [open |noSuchFile rb].&lt;br /&gt;* Fixed crash in [chan postevent].&lt;br /&gt;* Fixed programming error in [clock format] in he_IL locale.&lt;br /&gt;* Safe Base and Safe Tk rewrites&lt;br /&gt;&lt;br /&gt;下載地點：&lt;br /&gt;&lt;a href="http://www.activestate.com/activetcl/downloads"&gt;Download ActiveTcl Community Edition&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-1617280503693220397?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/1617280503693220397/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=1617280503693220397' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/1617280503693220397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/1617280503693220397'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2010/09/activetcl-8590.html' title='ActiveTcl 8.5.9.0'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-8993330544338972338</id><published>2010-06-22T08:42:00.002+08:00</published><updated>2010-06-22T08:46:17.386+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>下載中央銀行貨幣總計數M2年增率資料</title><content type='html'>&lt;pre style="background-color: #eeeeee; border: 1px dashed #999999; color: black; font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;#!c:/tcl/bin/tclsh86.exe&lt;br /&gt;########################################################################&lt;br /&gt;# 下載中央銀行貨幣總計數M2年增率資料 &lt;br /&gt;########################################################################&lt;br /&gt;&lt;br /&gt;package require http&lt;br /&gt;&lt;br /&gt;set url "http://www.cbc.gov.tw/np.asp?ctNode=643&amp;mp=1"&lt;br /&gt;set token [http::geturl $url -validate 1]&lt;br /&gt;&lt;br /&gt;# create an easy-to-use array variable&lt;br /&gt;upvar #0 $token head&lt;br /&gt;&lt;br /&gt;set location "http://www.cbc.gov.tw/"&lt;br /&gt;append location [dict get $head(meta) Location]&lt;br /&gt;&lt;br /&gt;puts "### Get file: $location"&lt;br /&gt;http::cleanup $token&lt;br /&gt;&lt;br /&gt;set filename "cbc_m1b.xls"&lt;br /&gt;&lt;br /&gt;set f [open $filename {WRONLY CREAT EXCL}]&lt;br /&gt;set token [http::geturl $location -channel $f]&lt;br /&gt;http::cleanup $token&lt;br /&gt;close $f&lt;br /&gt;&lt;br /&gt;exit&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;中央銀行貨幣總計數M2年增率資料在首頁就有，只是不是採用直接連結的方式，而是要從 head 裡取得檔案的下載位址，再從下載位址下載。在查過 Tcler's Wiki 該怎麼處理以後，我稍微改寫一下，目前可以正確的從網站下載我需要的資料。&lt;br /&gt;&lt;br /&gt;如果中央銀行讓使用者下載資料的位址是固定的，那麼這段 code 就可以一直用下去，如果位址不固定的話，那就要想一下該怎麼做才對。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-8993330544338972338?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/8993330544338972338/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=8993330544338972338' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8993330544338972338'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8993330544338972338'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2010/06/m2.html' title='下載中央銀行貨幣總計數M2年增率資料'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-8975719850919972830</id><published>2010-06-03T23:28:00.000+08:00</published><updated>2010-06-03T23:28:29.475+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>下載台灣證券交易所的市值週報</title><content type='html'>&lt;pre style="background-color: #eeeeee; border: 1px dashed rgb(153, 153, 153); color: black; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; font-size: 12px; line-height: 14px; overflow: auto; padding: 5px; width: 100%;"&gt;&lt;code&gt;#!c:/tcl/bin/tclsh86.exe&lt;br /&gt;package require http&lt;br /&gt;package require vfs::zip&lt;br /&gt;&lt;br /&gt;########################################################################&lt;br /&gt;# Download zip file&lt;br /&gt;########################################################################&lt;br /&gt;set remoteFile "http://www.twse.com.tw/ch/statistics/download/week.zip"&lt;br /&gt;set localFile "week.zip"&lt;br /&gt;&lt;br /&gt;set token [::http::geturl $remoteFile -binary 1]&lt;br /&gt;set data [::http::data $token]&lt;br /&gt;&lt;br /&gt;set channel [open $localFile w+]&lt;br /&gt;fconfigure $channel -encoding binary -translation binary&lt;br /&gt;puts -nonewline $channel $data&lt;br /&gt;close $channel&lt;br /&gt;&lt;br /&gt;::http::cleanup $token&lt;br /&gt;&lt;br /&gt;########################################################################&lt;br /&gt;# Now handle zip file&lt;br /&gt;########################################################################&lt;br /&gt;set mnt_file [vfs::zip::Mount $localFile $localFile]&lt;br /&gt;file copy -force [glob $localFile/*] ./&lt;br /&gt;vfs::zip::Unmount $mnt_file $localFile&lt;br /&gt;file delete $localFile&lt;br /&gt;&lt;br /&gt;exit&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;和之前寫的東西很像，使用 http 套件下載檔案，然後使用 vfs::zip 來解 zip 檔。要取得台灣證券交易所的市值週報資料的原因是因為我看到&lt;a href="http://buffettism.blogspot.com/2009/09/blog-post_8768.html"&gt;一篇 GDP 與市場大盤的文章&lt;/a&gt;，所以想要自己算看看目前的情況。&lt;br /&gt;&lt;br /&gt;因為有可能會長期並且以季為單位的進行觀測，所以寫了這個 script，讓自己不用開瀏覽器就拿到資料，應該可以節省一些時間。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-8975719850919972830?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/8975719850919972830/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=8975719850919972830' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8975719850919972830'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8975719850919972830'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2010/06/blog-post.html' title='下載台灣證券交易所的市值週報'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-8909598923658275037</id><published>2010-05-22T23:01:00.000+08:00</published><updated>2010-05-22T23:01:12.954+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Active Tcl'/><title type='text'>ActiveTcl 8.6.0.0 beta-3</title><content type='html'>我很高興的發現 ActiveTcl 8.6 釋出了新的測試版本（beta-3），這個測試版本主要更新：將 code base 更新為 8.6b1.2 Tcl core。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Note:&lt;/b&gt; This release should not be deployed in a production  environment.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.activestate.com/activetcl/downloads"&gt;Download ActiveTcl Community Edition&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-8909598923658275037?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/8909598923658275037/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=8909598923658275037' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8909598923658275037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8909598923658275037'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2010/05/activetcl-8600-beta-3.html' title='ActiveTcl 8.6.0.0 beta-3'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-92011911122206634</id><published>2010-04-14T11:09:00.001+08:00</published><updated>2010-04-14T11:10:35.874+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='套件'/><title type='text'>Threading Support: Configuration and Package</title><content type='html'>&lt;a href="http://www.tcl.tk/cgi-bin/tct/tip/364.html"&gt;TIP #364: Threading Support: Configuration and Package&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在 [incr Tcl] , TDBC 之後，Thread package 也成為內建的 contributed package，因此 Thread package 也會成為 8.6 的一員。&lt;br /&gt;&lt;br /&gt;節錄會有影響的地方：&lt;br /&gt;&lt;br /&gt;This will have no effect on Windows and OSX, where threaded configurations are default anyway, but will have an impact on other Unixes (Linux, Solaris, etc.)&lt;br /&gt;&lt;br /&gt;The main issues arising from this relate to the Expect and TclX packages. This is because they make &lt;b&gt;fork&lt;/b&gt; and &lt;b&gt;signal&lt;/b&gt; commands available; these APIs are troublesome because of how they interact with Tcl's notifier and the POSIX Thread system in general.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-92011911122206634?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/92011911122206634/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=92011911122206634' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/92011911122206634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/92011911122206634'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2010/04/threading-support-configuration-and.html' title='Threading Support: Configuration and Package'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-2303515013446182963</id><published>2010-01-29T18:51:00.003+08:00</published><updated>2010-01-29T19:28:54.867+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><category scheme='http://www.blogger.com/atom/ns#' term='套件'/><title type='text'>使用 EXIF 的時間資料來改檔案名稱</title><content type='html'>第一版的 script 已經 OK 了，不過考慮到如果有多過於一天的照片，這樣好像還是有點麻煩，所以改寫變成為讀取 EXIF 的資料以後，再用檔案內的日期資料來改檔名。&lt;br /&gt;&lt;br /&gt;Tcllib 有提供 jpeg 和 exif 二個套件可以使用，因為 jpeg 有提供範例，所以最後使用 jpeg 套件來實作：&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;#!/usr/bin/tclsh&lt;br /&gt;#&lt;br /&gt;# Rename script&lt;br /&gt;#&lt;br /&gt;# argument 1: folder location (option)&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;package require jpeg&lt;br /&gt;&lt;br /&gt;puts "##########   Start   ##########"&lt;br /&gt;&lt;br /&gt;if {$argc &amp;gt;= 1} {&lt;br /&gt; cd [lindex $argv 0]&lt;br /&gt;} elseif {$argc == 0} {&lt;br /&gt; cd "c:/tmp"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;foreach filename [glob *.jpg] {&lt;br /&gt; array set exif [::jpeg::getExif $filename]&lt;br /&gt; set today [clock format [clock scan $exif(DateTimeOriginal) \&lt;br /&gt;          -format {%Y:%m:%d %H:%M:%S}] -format %Y%m%d]&lt;br /&gt;&lt;br /&gt; regsub -all {\mIMG} $filename $today newFileName&lt;br /&gt;&lt;br /&gt; file rename $filename $newFileName&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;puts "##########    End    ##########"&lt;br /&gt;&lt;br /&gt;exit&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;相關資訊：&lt;br /&gt;Wiki：&lt;a href="http://en.wikipedia.org/wiki/Exif"&gt;Exchangeable image file format&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Exchangeable image file format (Exif) is a specification for the image file format used by digital cameras. The specification uses the existing JPEG, TIFF Rev. 6.0, and RIFF WAV file formats, with the addition of specific metadata tags. It is not supported in JPEG 2000, PNG, or GIF.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-2303515013446182963?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/2303515013446182963/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=2303515013446182963' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/2303515013446182963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/2303515013446182963'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2010/01/exif.html' title='使用 EXIF 的時間資料來改檔案名稱'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-7258640990564960995</id><published>2010-01-16T19:29:00.002+08:00</published><updated>2010-01-16T19:50:37.123+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>File rename</title><content type='html'>&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;#!/usr/bin/tclsh&lt;br /&gt;#&lt;br /&gt;# Rename script&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;puts "##########   Start   ##########"&lt;br /&gt;&lt;br /&gt;if {$argc &amp;gt;= 1} {&lt;br /&gt;   cd [lindex $argv 0]&lt;br /&gt;} elseif {$argc == 0} {&lt;br /&gt;   cd "c:/tmp"&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;set today [clock format [clock seconds] -format %Y%m%d]&lt;br /&gt;&lt;br /&gt;foreach filename [glob *.jpg] {&lt;br /&gt;   regsub -all {\mIMG} $filename $today newFileName&lt;br /&gt;  &lt;br /&gt;   file rename $filename $newFileName&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;puts "##########    End    ##########"&lt;br /&gt;&lt;br /&gt;exit&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;會寫這個 script，是因為我的數位相機照完相以後，會是 IMG_0001.JPG, IMG_0002.JPG 這樣編號，而我習慣用日期來整理，所以要把檔名改為 20100116_0001.JPG 這種形式，而自己手動改有點浪費時間，所以寫一個改檔名的 script 來做這件事情。&lt;br /&gt;&lt;br /&gt;使用了 glob 來列出所有 *.JPG 的檔案，再來把檔名前半部的 IMG 換成今天的日期，最後改檔名，應該就完成任務了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-7258640990564960995?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/7258640990564960995/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=7258640990564960995' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/7258640990564960995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/7258640990564960995'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2010/01/file-rename.html' title='File rename'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-7926611511160866415</id><published>2009-12-11T10:17:00.002+08:00</published><updated>2009-12-11T10:25:52.525+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='套件'/><title type='text'>tcllib 1.12 is out</title><content type='html'>這個消息已經晚了幾天（1.12 在 2009/12/08 已經 release 了），不過因為我是到現在才知道，所以還算是「新」消息吧。&lt;br /&gt;&lt;br /&gt;官方網站還沒有更新，但是 SourceForge &lt;a href="http://sourceforge.net/projects/tcllib/files/"&gt;檔案列表&lt;/a&gt;上已經有放上去檔案了。&lt;br /&gt;&lt;br /&gt;Read Me 上的 Overview：&lt;br /&gt;&lt;br /&gt;72  new packages                in 10 modules&lt;br /&gt;46  changed packages         in 25 modules&lt;br /&gt;14  internally changed packages in 12 modules&lt;br /&gt;166 unchanged packages    in 65 modules&lt;br /&gt;301 packages, total              in 95 modules, total&lt;br /&gt;&lt;br /&gt;有趣的是，我看到有一個 coroutine package 包含在 1.12 這次的 release 裡，這需要 Tcl/Tk 8.6 或者是更高的版本才可以使用。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-7926611511160866415?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/7926611511160866415/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=7926611511160866415' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/7926611511160866415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/7926611511160866415'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/12/tcllib-112-is-out.html' title='tcllib 1.12 is out'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-6845928183255759096</id><published>2009-11-20T20:05:00.002+08:00</published><updated>2009-11-20T20:09:19.205+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Active Tcl'/><title type='text'>ActiveTcl 8.5.8 is out</title><content type='html'>ActiveTcl 已經釋出了 ActiveTcl 8.5.8，因此有興趣或者是有需要的人可以前往 &lt;a href="http://www.activestate.com/activetcl/"&gt;ActiveTcl&lt;/a&gt; 下載了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-6845928183255759096?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/6845928183255759096/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=6845928183255759096' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/6845928183255759096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/6845928183255759096'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/11/activetcl-858-is-out.html' title='ActiveTcl 8.5.8 is out'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-8470319425038450900</id><published>2009-11-18T11:10:00.002+08:00</published><updated>2009-11-18T11:20:53.146+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Release'/><title type='text'>Tcl/Tk 8.5.8 RELEASED</title><content type='html'>Tcl/Tk 8.5.8 已經發佈了，這一版修正了許多問題，我想 ActiveTcl 接下來就會釋出 ActiveTcl 8.5.8 的版本。&lt;br /&gt;&lt;br /&gt;在釋出 8.5.8 這個穩定版本之後，我想只要 bug fix 的差不多，我推測 Tcl/Tk 8.6 beta 2 應該也就會釋出了。&lt;br /&gt;&lt;br /&gt;下面是 change log：&lt;br /&gt;&lt;br /&gt;Summary of Changes since Tcl/Tk 8.5.7:&lt;br /&gt;--------------------------------------&lt;br /&gt;&lt;br /&gt;The following were the main changes in Tcl/Tk 8.5.8. A complete list can be found in the changes file at the root of the source tree. The more complete ChangeLog is also included with each source release. This is a patch release, so it primarily includes bug fixes and corrections to erratic behavior. Below are only the most notable changes.&lt;br /&gt;&lt;br /&gt;* Resized mp_digit / mp_int storage on 64-bit systems.&lt;br /&gt;*** POTENTIAL INCOMPATIBILITY see http://wiki.tcl.tk/24693 ***&lt;br /&gt;&lt;br /&gt;* Vista Ttk theme support.&lt;br /&gt;&lt;br /&gt;* [tk_chooseDirectory] has newer style on Windows.&lt;br /&gt;&lt;br /&gt;* &lt;span style="color:#ff0000;"&gt;Tk 8.5.8 can now [load] into a Tcl 8.6 or later interp&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;* Updated [send] security for compatibility with Fedora 8 systems.&lt;br /&gt;&lt;br /&gt;* Corrected scope of [tk_get*File -typevariable].&lt;br /&gt;&lt;br /&gt;* [glob */foo] now returns ./~x/foo and not ~x/foo .&lt;br /&gt;&lt;br /&gt;* [wm iconphoto] now works on non-32-bit displays and big endian systems.&lt;br /&gt;&lt;br /&gt;* Safe Base now permits access to complete TM search path.&lt;br /&gt;&lt;br /&gt;* [info frame] now accounts for continuation lines.&lt;br /&gt;&lt;br /&gt;* [chan create]d channels can now signal EAGAIN.&lt;br /&gt;&lt;br /&gt;* Repaired broken "tclTomMath.h" header file.&lt;br /&gt;&lt;br /&gt;* New version 1.0.5 of platform package:&lt;br /&gt;- accounts for ia64_32&lt;br /&gt;&lt;br /&gt;* New version 2.7.5 of http package:&lt;br /&gt;- accept "quoted" charset value in headers&lt;br /&gt;- RFC 3986 compliance for ? in URLs&lt;br /&gt;&lt;br /&gt;* New version 2.3.2 of tcltest package.&lt;br /&gt;&lt;br /&gt;* Fixed nested event loop problems with TkAqua Cocoa and CoreFoundation.&lt;br /&gt;&lt;br /&gt;* Fixed Core Foundation memory bug in Tiger.&lt;br /&gt;&lt;br /&gt;* Fixed [checkbutton] state confusion on Windows.&lt;br /&gt;&lt;br /&gt;* Update [tk_messageBox] to work with Ttk buttons.&lt;br /&gt;&lt;br /&gt;* Fixed buffer overflows in [format].&lt;br /&gt;&lt;br /&gt;* Fixed EIAS failures in filesystem paths like ~foo.&lt;br /&gt;&lt;br /&gt;* Fixed XLFD font parse of {-family sans-serif ...}.&lt;br /&gt;&lt;br /&gt;* Fixed keyboard traversal of Windows menus.&lt;br /&gt;&lt;br /&gt;* Stop [grab .] preventing minimization.&lt;br /&gt;&lt;br /&gt;* Stop "tiny fonts" problem on Russian Windows.&lt;br /&gt;&lt;br /&gt;* Fixed tearoff menu operations on Windows.&lt;br /&gt;&lt;br /&gt;* Fixed underline and overstrike in Xft fonts.&lt;br /&gt;&lt;br /&gt;* Fixed crash when [exec] redirects to [chan create]d channel.&lt;br /&gt;&lt;br /&gt;* Fixed incorrect ** results like [expr {7**9 == 7**65545}] =&gt; 1.&lt;br /&gt;&lt;br /&gt;* Enable image data transfer through [selection get].&lt;br /&gt;&lt;br /&gt;* Proper tcl_platform(user) value on Windows when run as SYSTEM.&lt;br /&gt;&lt;br /&gt;* Repaired many segfaults and panics due to integer overflow on long values.&lt;br /&gt;&lt;br /&gt;* Fixed crashes sending focus to windows dead or not yet born.&lt;br /&gt;&lt;br /&gt;* Fixed crash drawing sash on panedwindow.&lt;br /&gt;&lt;br /&gt;* Fixed crash allocating fonts.&lt;br /&gt;&lt;br /&gt;* Fixed X crash on overlong color name.&lt;br /&gt;&lt;br /&gt;* Stopped hang in [fcopy -size] with mismatched translations/encodings.&lt;br /&gt;&lt;br /&gt;* Repaired memory leak in Tcl_ThreadQueueEvent().&lt;br /&gt;&lt;br /&gt;* Repaired memory leak in [dict incr].&lt;br /&gt;&lt;br /&gt;* Fixed crash in self-deleting variable unset traces.&lt;br /&gt;&lt;br /&gt;* Fixed crash in nested compiles (traces on ::errorInfo).&lt;br /&gt;&lt;br /&gt;* MIPS FPU settings for floating point underflow.&lt;br /&gt;&lt;br /&gt;* Support for portability to gcc 2.95 on Haiku OS.&lt;br /&gt;&lt;br /&gt;* Corrections and updates to timezone data and DST calculations.&lt;br /&gt;&lt;br /&gt;* Several Tk appearance corrections.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-8470319425038450900?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/8470319425038450900/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=8470319425038450900' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8470319425038450900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8470319425038450900'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/11/tcltk-858-released.html' title='Tcl/Tk 8.5.8 RELEASED'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-5888667271942586877</id><published>2009-10-25T13:39:00.002+08:00</published><updated>2009-10-25T13:43:43.879+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Active Tcl'/><title type='text'>更新 Windows 平台環境： 使用 ActiveTcl 8.6 beta-2</title><content type='html'>&lt;p&gt;&lt;a href="http://www.activestate.com/activetcl/tcl8_6/"&gt;Active Tcl 8.6 Beta&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我發現 Active Tcl 更新了安裝檔案，所以也跟著更新了。這次的更新也更新了原本附帶的套件到目前的最新版（例如說 VFS），所以我已經昇級到這個版本了。&lt;/p&gt;&lt;p&gt;注意：這一版的 code base 仍然是 &lt;strong&gt;Tcl/Tk 8.6 beta 1&lt;/strong&gt;，可以算是針對一些套件做 upgrade 的吧。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-5888667271942586877?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/5888667271942586877/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=5888667271942586877' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5888667271942586877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5888667271942586877'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/10/windows-activetcl-86-beta-2.html' title='更新 Windows 平台環境： 使用 ActiveTcl 8.6 beta-2'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-2258837659304145984</id><published>2009-10-23T22:58:00.009+08:00</published><updated>2009-11-01T09:49:03.680+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tk'/><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>清除掉 Visual C++ 2008 Express 最近使用的專案列表</title><content type='html'>&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;&lt;code&gt;package require registry&lt;br /&gt;&lt;br /&gt;label .show -text "Below is the list:"&lt;br /&gt;grid .show -row 0 -column 0 -columnspan 2 -pady 3 -ipady 1&lt;br /&gt;&lt;br /&gt;set count 0&lt;br /&gt;set rootKey "HKEY_CURRENT_USER\\Software\\Microsoft\\VCExpress\\9.0\\ProjectMRUList"&lt;br /&gt;&lt;br /&gt;foreach id [registry values $rootKey] {&lt;br /&gt;if {[string length $id] &amp;amp;gt;= 4} {&lt;br /&gt;set text [registry get $rootKey $id]&lt;br /&gt;ttk::checkbutton .$count -text $text -variable check($id)&lt;br /&gt;grid .$count -column 0 -columnspan 4 -ipady 1 -sticky nsew&lt;br /&gt;set check($id) 0&lt;br /&gt;incr count 1&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;proc doClean {} {&lt;br /&gt;foreach id [registry values $::rootKey] {&lt;br /&gt;if {[string length $id] &amp;amp;gt;= 4} {&lt;br /&gt;    if {$::check($id) == 1} {    &lt;br /&gt;        registry delete $::rootKey $id&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;exit&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# Let our button in next row&lt;br /&gt;incr count 1&lt;br /&gt;&lt;br /&gt;button .exit -text "Exit" -command exit&lt;br /&gt;grid .exit -column 2 -row $count -pady 3 -ipady 1 -sticky nsew&lt;br /&gt;button .clean -text "Clean" -command doClean&lt;br /&gt;grid .clean -column 3 -row $count -pady 3 -ipady 1 -sticky nsew&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;使用 checkbutton 建立列表，讓使用者選擇要清除最近使用的專案列表中的哪一個。我們使用一個陣列記住目前使用者的選擇，如果使用者按 Clean，就去清掉使用者所選擇的那些項目。&lt;br /&gt;&lt;br /&gt;Geometry Manager 使用 grid 來管理。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-2258837659304145984?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/2258837659304145984/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=2258837659304145984' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/2258837659304145984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/2258837659304145984'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/10/visual-c-2008-express.html' title='清除掉 Visual C++ 2008 Express 最近使用的專案列表'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-4859857507756968590</id><published>2009-10-10T20:02:00.003+08:00</published><updated>2009-11-01T22:53:05.497+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='套件'/><title type='text'>tDom and TclXML</title><content type='html'>&lt;p&gt;Tcl 是個極容易擴充的語言（並且因此影響到後面出現或者是同期的 scripting language），在處理 XML 方面，有二個主要的套件：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.tdom.org/"&gt;tDom&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://tclxml.sourceforge.net/"&gt;TclXML&lt;/a&gt;/TclDOM&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;我會比較偏好 tDom，因為他雖然是用 C 實作，而且在架構上沒有 TclXML 的野心那麼大，但是 tDom 在管理上比較簡單（只有一個套件），不像 TclXML/TclDOM 需要好幾個套件組合起來、而且 TclDOM 隨著各個實作的不同，能力也不同（pure Tcl, Expat, libxml2）。&lt;/p&gt;&lt;p&gt;更多資料：&lt;a href="http://wiki.tcl.tk/9098"&gt;TclDOM vs tDOM&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-4859857507756968590?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/4859857507756968590/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=4859857507756968590' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/4859857507756968590'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/4859857507756968590'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/10/tdom-and-tclxml.html' title='tDom and TclXML'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-196870359540487131</id><published>2009-10-10T05:55:00.007+08:00</published><updated>2009-10-10T07:44:51.497+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='套件'/><title type='text'>TDBC 1.0 b13 已經包含 tdbc::postgres</title><content type='html'>我發現 TDBC PostgreSQL driver 已經&lt;a href="http://wiki.tcl.tk/23192"&gt;完成&lt;/a&gt;了，所以小小的測試了一下（使用 PostgreSQL 8.4.1）：&lt;br /&gt;&lt;pre style="BORDER-BOTTOM: #999999 1px dashed; BORDER-LEFT: #999999 1px dashed; PADDING-BOTTOM: 5px; LINE-HEIGHT: 14px; BACKGROUND-COLOR: #eee; PADDING-LEFT: 5px; WIDTH: 100%; PADDING-RIGHT: 5px; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; COLOR: #000000; FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: #999999 1px dashed; BORDER-RIGHT: #999999 1px dashed; PADDING-TOP: 5px"&gt;&lt;code&gt;package require tdbc::postgres&lt;br /&gt;tdbc::postgres::connection create db -user danilo -password test -port 5432&lt;br /&gt;&lt;br /&gt;set statement [db prepare {&lt;br /&gt; SELECT VERSION()&lt;br /&gt;}]&lt;br /&gt;&lt;br /&gt;$statement foreach row {&lt;br /&gt; puts [dict get $row version]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;$statement close&lt;br /&gt;db close&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;沒錯，確實已經可以運作了，而 tdbc::postgres 主要是透過 libpg 來實作的。&lt;br /&gt;&lt;br /&gt;另外，TDBC 同時也包含了 Oracle 的 driver，但是這一個我就沒有測試了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-196870359540487131?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/196870359540487131/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=196870359540487131' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/196870359540487131'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/196870359540487131'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/10/tdbc-10-b13-tdbcpostgres.html' title='TDBC 1.0 b13 已經包含 tdbc::postgres'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-5637361954646959658</id><published>2009-09-22T08:53:00.004+08:00</published><updated>2009-10-20T08:02:06.497+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>刪除 Adobe Flash Sol 記錄</title><content type='html'>看到 &lt;a href="http://blog.ofset.org/ckhung/index.php?post/098k"&gt;Adobe Flash 用戶: 請笑一個給世界看, 您上鏡頭了!&lt;/a&gt; 以後，因為不知道怎麼樣在 IE8 上讓 Flash 可以正常使用但是又不會使用 Sol 記錄使用者的一些資訊，所以我寫了一個 tcl script 來嘗試刪除這些記錄，下面就是我寫的 script：&lt;br /&gt;&lt;pre style="BORDER-BOTTOM: #999999 1px dashed; BORDER-LEFT: #999999 1px dashed; PADDING-BOTTOM: 5px; LINE-HEIGHT: 14px; BACKGROUND-COLOR: #eee; PADDING-LEFT: 5px; WIDTH: 100%; PADDING-RIGHT: 5px; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; COLOR: #000000; FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: #999999 1px dashed; BORDER-RIGHT: #999999 1px dashed; PADDING-TOP: 5px"&gt;&lt;code&gt;set SolFile [set env(USERPROFILE)]&lt;br /&gt;append SolFile {\Application Data\Macromedia}&lt;br /&gt;&lt;br /&gt;if {[file exist $SolFile]==1} {&lt;br /&gt;   file delete -force $SolFile&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;使用了大絕招（加上參數 -force）來刪除目錄以及其中的所有檔案，這樣就可以半自動的刪除掉這些試圖記錄的資訊。如果有其它的需要或者是需要再增加其它的目錄進行刪除，只要修改一下就 OK 了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-5637361954646959658?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/5637361954646959658/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=5637361954646959658' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5637361954646959658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5637361954646959658'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/09/adobe-flash-sol.html' title='刪除 Adobe Flash Sol 記錄'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-5393848566072992244</id><published>2009-09-20T16:38:00.001+08:00</published><updated>2009-09-20T16:41:13.946+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dotNET'/><title type='text'>Eagle</title><content type='html'>&lt;a href="http://eagle.to/"&gt;The Eagle Project&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Eagle (Extensible Adaptable Generalized Logic Engine) is an implementation of the Tcl scripting language for the Common Language Runtime (CLR).&lt;br /&gt;&lt;br /&gt;這是個仍然在發展中的案子，把 Tcl 搬到 .NET 的世界了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-5393848566072992244?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/5393848566072992244/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=5393848566072992244' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5393848566072992244'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5393848566072992244'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/09/eagle.html' title='Eagle'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-8159177798867699236</id><published>2009-09-15T16:13:00.007+08:00</published><updated>2009-10-20T21:37:21.449+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='書藉'/><title type='text'>Tcl and the Tk Toolkit Second Edition is out</title><content type='html'>根據 comp.lang.tcl 的&lt;a href="http://groups.google.com/group/comp.lang.tcl/browse_thread/thread/84f3a4d7ca4484e1#"&gt;消息&lt;/a&gt;，有人已經收到來自於 Amazon 的實體書了，所以已經正式開賣並且已經開始供貨，但是不知道台灣目前的進口情況，因為博客來和天瓏目前都是處於沒有進口（或許該說沒有東西可以供使用者訂購）的狀況。&lt;br /&gt;&lt;br /&gt;雖然沒有加入 8.6 的 OO （物件導向）或者是其它的改進有點可惜，但是按照目前 8.6 的發展情況來看，加入的結果將會使這本書的出版更為難產，我想將版本放在 8.5 是個合理的決定。&lt;br /&gt;&lt;br /&gt;目前和 Amazon 的書評綜合看起來，都是比較正面的評價，所以我想第二版仍然維持了清楚並且組織良好的風格，it is a good news.&lt;br /&gt;&lt;br /&gt;Update:&lt;br /&gt; 2009/10/20 天瓏已經開始賣了，我已經拿到書了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-8159177798867699236?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/8159177798867699236/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=8159177798867699236' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8159177798867699236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8159177798867699236'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/09/tcl-and-tk-toolkit-second-edition-is.html' title='Tcl and the Tk Toolkit Second Edition is out'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-1436207837753255433</id><published>2009-09-13T17:30:00.003+08:00</published><updated>2009-09-13T20:45:55.290+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>優雅的關閉程式</title><content type='html'>在 Windows 平台下，&lt;a href="http://www.activestate.com/activetcl/"&gt;ActiveTcl&lt;/a&gt; 預設是使用 wish.exe 來開啟 .tcl 檔案，如果直接執行不需要 tk 的程式，往往會留下一個 wish window。&lt;br /&gt;&lt;br /&gt;解決的方法很簡單，在最後使用 exit 關閉程式就可以了：&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;exit&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;這樣就可以優雅的關閉程式而不會留下一個 wish window --- 即使是用 wish.exe 開啟的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-1436207837753255433?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/1436207837753255433/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=1436207837753255433' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/1436207837753255433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/1436207837753255433'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/09/blog-post.html' title='優雅的關閉程式'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-3694750255930560192</id><published>2009-09-09T15:59:00.007+08:00</published><updated>2009-10-10T20:29:27.253+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='書藉'/><title type='text'>Tcl and the Tk Toolkit (2nd Edition)</title><content type='html'>&lt;a href="http://2.bp.blogspot.com/_S0U_DT6HPX8/SqdiM4bd0SI/AAAAAAAAAJE/J3IhGCwBlmw/s1600-h/51IHDLCPJlL__SS500_.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5379376253362884898" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 320px; CURSOR: hand; HEIGHT: 320px" alt="" src="http://2.bp.blogspot.com/_S0U_DT6HPX8/SqdiM4bd0SI/AAAAAAAAAJE/J3IhGCwBlmw/s320/51IHDLCPJlL__SS500_.jpg" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;&lt;a href="http://www.amazon.com/Tcl-Toolkit-2nd-John-Ousterhout/dp/032133633X/ref=cm_cr_pr_product_top"&gt;Tcl and the Tk Toolkit (2nd Edition)on Amazon&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;John K. Ousterhout’s Definitive Introduction to Tcl/Tk–Now Fully Updated for Tcl/Tk 8.5&lt;/div&gt;&lt;br /&gt;&lt;div&gt;Paperback: 816 pages&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Publisher: Addison-Wesley Professional; 2 edition (&lt;strong&gt;September 12, 2009&lt;/strong&gt;)&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;ISBN-10: 032133633X&lt;br /&gt;ISBN-13: 978-0321336330&lt;br /&gt;&lt;/div&gt;&lt;div&gt;光是作者的名字 (&lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/John_Ousterhout"&gt;John K. Ousterhout&lt;/a&gt;&lt;/strong&gt; and Ken Jones ) 就讓人想要買這本書了啦，但是目前天瓏&lt;a href="http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=032133633X&amp;amp;sid=63999"&gt;提供的日期&lt;/a&gt;是 &lt;del&gt;2009/09/14&lt;/del&gt; 2009/09/29（而且還不確定）。原本在 2005 年就已宣佈有計畫更新為第二版，但是直到現在才又有新的消息。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;在 Tcler's Wiki 上也有&lt;a href="http://wiki.tcl.tk/22519"&gt;相關的訊息&lt;/a&gt;。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-3694750255930560192?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/3694750255930560192/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=3694750255930560192' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/3694750255930560192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/3694750255930560192'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/09/tcl-and-tk-toolkit-2nd-edition.html' title='Tcl and the Tk Toolkit (2nd Edition)'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_S0U_DT6HPX8/SqdiM4bd0SI/AAAAAAAAAJE/J3IhGCwBlmw/s72-c/51IHDLCPJlL__SS500_.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-592208960005863200</id><published>2009-09-05T00:18:00.003+08:00</published><updated>2009-09-05T00:49:02.519+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><category scheme='http://www.blogger.com/atom/ns#' term='套件'/><title type='text'>Download and Uncompress zip file</title><content type='html'>&lt;p&gt;在使用的過程裡，我發覺 vfs 1.4.0 應該是有 bug 的，如果要使用 vfs::zip 來解壓縮，要把版本昇到 1.4.1 才行。&lt;/p&gt;&lt;p&gt;下面是從臺灣證券交易所下載檔案，然後使用 vfs::zip 解壓縮的範例：&lt;/p&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;#!c:/tcl/bin/tclsh86.exe&lt;br /&gt;package require http&lt;br /&gt;package require vfs::zip&lt;br /&gt;&lt;br /&gt;########################################################################&lt;br /&gt;# Now download file from network&lt;br /&gt;########################################################################&lt;br /&gt;&lt;br /&gt;set day [clock format [clock seconds] -format {%d}]&lt;br /&gt;set now [clock seconds]&lt;br /&gt;&lt;br /&gt;if {$day &amp;gt; 7} {&lt;br /&gt; set value [clock format [clock add $now -30 day] -format {%Y%m}]&lt;br /&gt;} else {&lt;br /&gt; set value [clock format [clock add $now -60 day] -format {%Y%m}]&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;set remoteFile "http://www.twse.com.tw/ch/statistics/download/04/001/"&lt;br /&gt;append remoteFile $value&lt;br /&gt;append remoteFile "_C04001.zip"&lt;br /&gt;&lt;br /&gt;puts "======================================================"&lt;br /&gt;puts "URL: $remoteFile"&lt;br /&gt;&lt;br /&gt;set localFile $value&lt;br /&gt;append localFile "_C04001.zip"&lt;br /&gt;&lt;br /&gt;puts "Download File name: $localFile"&lt;br /&gt;puts "======================================================"&lt;br /&gt;&lt;br /&gt;set token [::http::geturl $remoteFile -binary 1]&lt;br /&gt;set data [::http::data $token]&lt;br /&gt;&lt;br /&gt;set channel [open $localFile w+]&lt;br /&gt;fconfigure $channel -encoding binary -translation binary&lt;br /&gt;puts -nonewline $channel $data&lt;br /&gt;close $channel&lt;br /&gt;&lt;br /&gt;::http::cleanup $token&lt;br /&gt;&lt;br /&gt;########################################################################&lt;br /&gt;# Now handle zip file&lt;br /&gt;########################################################################&lt;br /&gt;&lt;br /&gt;set mnt_file [vfs::zip::Mount $localFile $localFile]&lt;br /&gt;file copy -force [glob $localFile/*] ./&lt;br /&gt;vfs::zip::Unmount $mnt_file $localFile&lt;br /&gt;file delete $localFile&lt;/code&gt;&lt;/pre&gt;幫朋友寫的，這樣再做一些適當的設定就可以定時下載最近的企業月報，而季報也可以比照辦理。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-592208960005863200?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/592208960005863200/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=592208960005863200' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/592208960005863200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/592208960005863200'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/09/download-and-uncompress-zip-file.html' title='Download and Uncompress zip file'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-3719038493768300648</id><published>2009-08-02T04:23:00.005+08:00</published><updated>2009-08-02T22:34:16.950+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>在命令列呼叫 OpenOffice.Org Basic 巨集</title><content type='html'>這不只可以用 Tcl/Tk 來做到，只是我最習慣 Tcl/Tk 來做這些事情。&lt;br /&gt;&lt;br /&gt;OpenOffice.Org Basic 寫的程式：&lt;br /&gt;&lt;pre style="BORDER-BOTTOM: #999999 1px dashed; BORDER-LEFT: #999999 1px dashed; PADDING-BOTTOM: 5px; LINE-HEIGHT: 14px; BACKGROUND-COLOR: #eee; PADDING-LEFT: 5px; WIDTH: 100%; PADDING-RIGHT: 5px; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; COLOR: #000000; FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: #999999 1px dashed; BORDER-RIGHT: #999999 1px dashed; PADDING-TOP: 5px"&gt;&lt;code&gt;REM ***** BASIC *****&lt;br /&gt;&lt;br /&gt;Option Explicit&lt;br /&gt;&lt;br /&gt;Sub AutoFindGoodMan(cFile)&lt;br /&gt;Dim Doc As Object&lt;br /&gt;Dim Dummy()&lt;br /&gt;&lt;br /&gt;Dim Sheet As Object&lt;br /&gt;Dim Cell As Object&lt;br /&gt;Dim Cell2 As Object&lt;br /&gt;Dim Cell3 As Object&lt;br /&gt;Dim Cell4 As Object&lt;br /&gt;Dim Count As Integer&lt;br /&gt;&lt;br /&gt;Doc = StarDesktop.loadComponentFromURL(ConvertToUrl(cFile), "_default", 0, Dummy())&lt;br /&gt;&lt;br /&gt;Sheet = Doc.Sheets(0)&lt;br /&gt;&lt;br /&gt;dim document   as object&lt;br /&gt;dim dispatcher as object&lt;br /&gt;rem ---------------------------------------------------------------------&lt;br /&gt;rem get access to the document&lt;br /&gt;document   = ThisComponent.CurrentController.Frame&lt;br /&gt;dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")&lt;br /&gt;&lt;br /&gt;rem ----------------------------------------------------------------------&lt;br /&gt;dim args1(2) as new com.sun.star.beans.PropertyValue&lt;br /&gt;args1(0).Name = "Zoom.Value"&lt;br /&gt;args1(0).Value = 100&lt;br /&gt;args1(1).Name = "Zoom.ValueSet"&lt;br /&gt;args1(1).Value = 28703&lt;br /&gt;args1(2).Name = "Zoom.Type"&lt;br /&gt;args1(2).Value = 0&lt;br /&gt;dispatcher.executeDispatch(document, ".uno:Zoom", "", 0, args1())&lt;br /&gt;&lt;br /&gt;For Count = 66 To 841 Step 1&lt;br /&gt;Cell = Sheet.getCellByPosition(0, Count)&lt;br /&gt;IF Cell.Value &amp;gt; 1000 Then&lt;br /&gt;    Cell.CellBackColor = RGB(0, 0, 255)&lt;br /&gt;    Cell2  = Sheet.getCellByPosition(3, Count)&lt;br /&gt;    Cell3  = Sheet.getCellByPosition(5, Count)&lt;br /&gt;    Cell4  = Sheet.getCellByPosition(7, Count)&lt;br /&gt;&lt;br /&gt;    IF Cell3.Type = com.sun.star.table.CellContentType.EMPTY Then&lt;br /&gt;        IF Cell4.Value = 0.00 Then&lt;br /&gt;            Cell3.CellBackColor = RGB(255, 0, 0)&lt;br /&gt;            Cell4.CellBackColor = RGB(255, 0, 0)&lt;br /&gt;        ENDIF&lt;br /&gt;    ELSE&lt;br /&gt;        IF Cell3.Value &amp;lt; 9 AND Cell4.Value &amp;gt; 5 Then&lt;br /&gt;            IF Cell2.Value &amp;lt;= 15 Then&lt;br /&gt;                Cell2.CellBackColor = RGB(255, 255, 0)&lt;br /&gt;            ELSEIF Cell2.Value &amp;gt; 15 AND Cell2.Value &amp;lt;= 40 THEN&lt;br /&gt;                Cell2.CellBackColor = RGB(0, 255, 0)&lt;br /&gt;            ELSEIF Cell2.Value &amp;gt; 40 THEN&lt;br /&gt;                Cell2.CellBackColor = RGB(0, 255, 255)&lt;br /&gt;            END IF&lt;br /&gt;   &lt;br /&gt;            Cell3.CellBackColor = RGB(0, 255, 0)&lt;br /&gt;            Cell4.CellBackColor = RGB(0, 255, 0)&lt;br /&gt;        ELSEIF Cell3.Value &amp;gt;= 80 Then&lt;br /&gt;            Cell3.CellBackColor = RGB(0, 255, 255)&lt;br /&gt;        End IF&lt;br /&gt;    End IF&lt;br /&gt;End IF&lt;br /&gt;Next Count&lt;br /&gt;&lt;br /&gt;If (Doc.isModified) Then&lt;br /&gt;If (Doc.hasLocation And (Not Doc.isReadOnly)) Then&lt;br /&gt;    Doc.store()&lt;br /&gt;End If&lt;br /&gt;End If&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Doc.close(True)&lt;br /&gt;&lt;br /&gt;End Sub&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;而可以用 Tcl/Tk 執行 soffice.exe，來幫我們自動執行這件事：&lt;br /&gt;&lt;/p&gt;&lt;pre style="BORDER-BOTTOM: #999999 1px dashed; BORDER-LEFT: #999999 1px dashed; PADDING-BOTTOM: 5px; LINE-HEIGHT: 14px; BACKGROUND-COLOR: #eee; PADDING-LEFT: 5px; WIDTH: 100%; PADDING-RIGHT: 5px; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; COLOR: #000000; FONT-SIZE: 12px; OVERFLOW: auto; BORDER-TOP: #999999 1px dashed; BORDER-RIGHT: #999999 1px dashed; PADDING-TOP: 5px"&gt;&lt;code&gt;set DIR [pwd]&lt;br /&gt;set DOCS [glob *.xls]&lt;br /&gt;&lt;br /&gt;foreach file $DOCS {&lt;br /&gt;  set inputFile $DIR&lt;br /&gt;  append inputFile "/" $file&lt;br /&gt;  set exeList [list "C:\\Program Files\\OpenOffice.org 3\\program\\soffice.exe" "macro:///Standard.Module1.AutoFindGoodMan($inputFile)"]&lt;br /&gt;  exec {*}$exeList&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;但是我還沒有摸索出來在執行的時候不要顯示出來 OpenOffice.Org 文件視窗的方法，不論是使用命令列指定，或者在執行時設定的方式，都是沒有效果的（有可能是因為我沒有設定正確吧……）。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-3719038493768300648?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/3719038493768300648/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=3719038493768300648' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/3719038493768300648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/3719038493768300648'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/08/openofficeorg.html' title='在命令列呼叫 OpenOffice.Org Basic 巨集'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-6801353859241145560</id><published>2009-07-30T18:50:00.001+08:00</published><updated>2009-07-30T18:52:11.256+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>執行程式</title><content type='html'>&lt;p&gt;Tcl 使用 exec 來執行外部程式：&lt;/p&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;set var [list rundll32.exe shell32.dll,Control_RunDLL timedate.cpl,@0,2]&lt;br /&gt;exec {*}$var&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;這裡使用 {*} 和 exec 結合的範例。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-6801353859241145560?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/6801353859241145560/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=6801353859241145560' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/6801353859241145560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/6801353859241145560'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/07/blog-post.html' title='執行程式'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-7723664914102525477</id><published>2009-07-17T09:27:00.004+08:00</published><updated>2009-07-17T09:58:40.241+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Syntax'/><title type='text'>math function</title><content type='html'>在 Tcl 8.5 以前，Tcl 的數學運算都是透過 &lt;a href="http://wiki.tcl.tk/583"&gt;expr&lt;/a&gt; 這個 command 做到的，而在 8.5 則引進了 &lt;a title="click to see 16 references to this page" href="http://wiki.tcl.tk/20279"&gt;tcl::mathfunc&lt;/a&gt;，讓使用一些數學運算的 function 上可以更直覺，使用上也更簡單。&lt;br /&gt;&lt;br /&gt;如果不想寫一堆很長的 name space path，可以這樣做：&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt;namespace path {::tcl::mathop ::tcl::mathfunc}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;所以我們就可以這樣做：&lt;br /&gt;&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt;srand [clock seconds]&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;這樣不管是撰寫程式還是讀 code 的時候，看起來都比較具可讀性。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;另外，8.5 同時也 export 出來一些運算子（&lt;a href="http://wiki.tcl.tk/20280"&gt;tcl::mathop&lt;/a&gt;）。&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt;puts [* [sqrt 49] [+ 1 2 3]]&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;也就是，看起來會是類似 lisp 的前序式運算法。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-7723664914102525477?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/7723664914102525477/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=7723664914102525477' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/7723664914102525477'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/7723664914102525477'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/07/math-function.html' title='math function'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-7281288826096386949</id><published>2009-07-16T10:09:00.004+08:00</published><updated>2009-07-16T23:19:03.070+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Syntax'/><title type='text'>Access global variables in proc</title><content type='html'>在 procedure 裡存取全域變數，有二種做法：&lt;br /&gt;&lt;br /&gt;1. 使用 global 命令宣告要存取的全域變數&lt;br /&gt;2. 在 Tcl 支援 name space 之後，可以使用 name space 的表達方式（::）來存取變數&lt;br /&gt;&lt;pre style="BORDER-RIGHT: #999999 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: #999999 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: #999999 1px dashed; WIDTH: 100%; COLOR: #000000; LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: #999999 1px dashed; FONT-FAMILY: Andale Mono, Lucida Console, Monaco, fixed, monospace; BACKGROUND-COLOR: #eee"&gt;&lt;code&gt;set x 0&lt;br /&gt;&lt;br /&gt;proc appendMe {number} {&lt;br /&gt;    global x&lt;br /&gt;    incr x $number&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;proc appendMe2 {number} {&lt;br /&gt;    incr ::x $number&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;appendMe 3&lt;br /&gt;puts $x&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;上面就是這二種方式的說明。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-7281288826096386949?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/7281288826096386949/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=7281288826096386949' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/7281288826096386949'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/7281288826096386949'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/07/access-global-variables-in-proc.html' title='Access global variables in proc'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-5214268459056228237</id><published>2009-07-15T10:18:00.002+08:00</published><updated>2009-07-15T21:13:30.088+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Tcl/Tk 與編碼 (Encoding)</title><content type='html'>關於 Tcl 的編碼，可以分為二部份，一部份是 Tcl/Tk 直譯器本身支援的編碼，一部份是使用者的 Tcl script file 所使用的編碼。&lt;br /&gt;&lt;br /&gt;首先是使用者的 Tcl script file 所使用的編碼，可以用下列的方法來指定：&lt;br /&gt;tclsh.exe -encoding [編碼方式] [檔案]&lt;br /&gt;wish.exe -encoding [編碼方式] [檔案]&lt;br /&gt;&lt;br /&gt;我們可以使用下面的方式來查詢目前 Tcl/Tk直譯器本身所支援的編碼方式：&lt;br /&gt;encoding names&lt;br /&gt;&lt;br /&gt;例如用 Tclkit 來查詢，就可以得到他目前支援的編碼方式：&lt;br /&gt;iso8859-2 iso8859-15 utf-8 ascii cp1252 macRoman koi8-r identity unicode iso8859-1&lt;br /&gt;&lt;br /&gt;所以 Tclkit 不支援 BIG5... 如果需要的話要自己加上去。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-5214268459056228237?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/5214268459056228237/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=5214268459056228237' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5214268459056228237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5214268459056228237'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/07/tcltk-encoding.html' title='Tcl/Tk 與編碼 (Encoding)'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-4179629083016874059</id><published>2009-07-11T16:22:00.000+08:00</published><updated>2009-07-11T16:30:45.086+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>GetHomeDir</title><content type='html'>在 Windows，我們可以透過謮取 registry 和環境變數拿到使用者的 My Documents. 下面是來自於 Tcler' Wiki 的 code，只是我自己有小修改一些，好符合我自己的環境。&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;proc GetHomeDir { } {&lt;br /&gt; global env&lt;br /&gt;&lt;br /&gt; # Check if we're using windows&lt;br /&gt; if { [expr [string compare "$::tcl_platform(platform)" "windows" ] == 0] } {&lt;br /&gt;   package require registry 1.0&lt;br /&gt;&lt;br /&gt;   set env_home [registry get {HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders} {Personal}]&lt;br /&gt;   set userprofile [set env(USERPROFILE)]&lt;br /&gt;   regsub -all {[%]USERPROFILE[%]} $env_home $userprofile env_home&lt;br /&gt; } else {&lt;br /&gt;   set env_home $env(HOME)&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; return $env_home&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;另外，如果要刪除 Opera 在 UserProfile 下的 cookie，可以這樣做：&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;set CookieFile [set env(USERPROFILE)]&lt;br /&gt;append CookieFile {\Application Data\Opera\Opera\profile\cookies4.dat}&lt;br /&gt;&lt;br /&gt;if {[file exists $CookieFile]==1} {&lt;br /&gt;   file delete $CookieFile&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;因為 AVG 會對這裡一直警告（即使我關掉 Cookie），所以要寫一個小程式殺掉檔案，避免他一直警告（不過話說回來，我已經不用 AVG 了）。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-4179629083016874059?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/4179629083016874059/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=4179629083016874059' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/4179629083016874059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/4179629083016874059'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/07/gethomedir.html' title='GetHomeDir'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-2409243491803126745</id><published>2009-06-28T11:03:00.000+08:00</published><updated>2009-06-28T11:16:42.117+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tk'/><title type='text'>GIF photo images written with LZW compression</title><content type='html'>&lt;div&gt;Tk 在 8.6 除了加入 &lt;a href="http://www.libpng.org/pub/png/"&gt;PNG&lt;/a&gt; 格式的支援，同時因為 LZW 演算法專利已經過期，所以 Tk 8.6 也會加入 GIF photo images written with LZW compression 的支援。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;下面是一些資訊：&lt;/div&gt;&lt;div&gt;"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."&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;IBM 也握有 LZW 的專利，但是根據 GNU GIF 的&lt;a href="http://www.gnu.org/philosophy/gif.html"&gt;網頁&lt;/a&gt;，IBM 的專利也將於 2006/10 到期，也就是說，實作的人將不用擔心觸碰到 LZW 專利地雷。&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;雖然我們有了 PNG，但是能夠使用 GIF 也不錯。&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-2409243491803126745?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/2409243491803126745/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=2409243491803126745' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/2409243491803126745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/2409243491803126745'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/06/gif-photo-images-written-with-lzw.html' title='GIF photo images written with LZW compression'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-542331726267827339</id><published>2009-06-27T08:22:00.000+08:00</published><updated>2009-06-27T08:29:20.498+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='相關文章'/><title type='text'>Scripting: Higher Level Programming for the 21st Century</title><content type='html'>這是由 John K. Ousterhout 所寫的&lt;a href="http://home.pacbell.net/ouster/scripting.html"&gt;文章&lt;/a&gt;，而從現在 PHP/Perl/Python/Ruby/Tcl 各種 scripting language 的發展來看，似乎也是如 John K. Ousterhout 所推測的一樣。當然，自由軟體所帶來的效應，可能也是其中的一個原因之一。&lt;br /&gt;&lt;br /&gt;Scripting language 的缺點就是慢，但是開發快速而且除錯方便，但是當硬體的速度愈來愈快的時候，Scripting language 的缺點也就不太算是缺點了，各種 Scripting language 只會愈來愈重要。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-542331726267827339?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/542331726267827339/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=542331726267827339' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/542331726267827339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/542331726267827339'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/06/scripting-higher-level-programming-for.html' title='Scripting: Higher Level Programming for the 21st Century'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-5613144599221213733</id><published>2009-06-25T06:42:00.000+08:00</published><updated>2009-06-25T07:02:30.266+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Syntax'/><title type='text'>Try/Catch/Finally syntax</title><content type='html'>Tcl 原本就有錯誤處理的機制（使用 catch），而在 &lt;a href="http://www.tcl.tk/cgi-bin/tct/tip/329.html"&gt;TIP #329&lt;/a&gt;  （in 8.6 b1）又加入了類似 Try/Catch/Finally 來增強原本的機制。&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;proc read_hex_file {fname} {&lt;br /&gt;   set f [open $fname "r"]&lt;br /&gt;   set data {}&lt;br /&gt;   try  {&lt;br /&gt;      while { [gets $f line] &amp;gt;= 0 } {&lt;br /&gt;        append data [binary format H* $line]&lt;br /&gt;      }&lt;br /&gt;   } trap {POSIX} {} {&lt;br /&gt;      puts "POSIX-type error"&lt;br /&gt;   } on error {em} {&lt;br /&gt;      error "Could not process file '$fname': $em"&lt;br /&gt;   } finally {&lt;br /&gt;      close $f&lt;br /&gt;   }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;也就是說，原本 catch 是執行如果出錯，那就依據取得的 error code，再來判斷怎麼處理；而 try/finally 則是如果發生錯誤，會依據 error code 而把程式的流程流向該處理這個錯誤的 error handler，因此整個 code 如果寫的好會看起來比較清晰。對於錯誤的處理策略看起來比較清晰。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-5613144599221213733?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/5613144599221213733/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=5613144599221213733' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5613144599221213733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/5613144599221213733'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/06/trycatchfinally-syntax.html' title='Try/Catch/Finally syntax'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-6803558895329698113</id><published>2009-06-24T17:10:00.001+08:00</published><updated>2009-06-25T05:28:29.409+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><category scheme='http://www.blogger.com/atom/ns#' term='套件'/><title type='text'>SQLite and PostgreSQL</title><content type='html'>雖然 Tcl 在 8.6 終於加入了 TDBC，但是目前只有支援 &lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt;, MySQL 等少數的資料庫，而沒有支援 &lt;a href="http://www.postgresql.org/"&gt;PostgreSQL&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;PostgreSQL 有提供 Tcl 的介面（只是不是使用 TDBC API，而是 specify for PostgreSQL 的），而且需要自己去網站下載相關的檔案。&lt;br /&gt;&lt;br /&gt;Google Student Summer 計畫裡，關於 Tcl 的部份，有看到關於 TDBC-PostgreSQL 的部份，只是不知道目前的進度怎麼樣了。&lt;br /&gt;&lt;br /&gt;對我而言，SQLite 是單機使用的最佳選擇，而 PostgreSQL 雖然在 Open Source 界使用聲勢上弱於 MySQL，但是我還是最喜歡使用他（好吧，雖然現在因為沒有在寫關於網路和 WEB 的應用，所以沒有在用他了）。 而在甲骨文併購昇陽之後，MySQL 的前途變成了一件不明確的事情（雖然甲骨文不太可能就這樣壞掉自己的聲譽，所以囉），因此版權和 source code 所有權明確的 PostgreSQL 是一個好選擇，特別是當 PostgreSQL 的可靠度其實很可怕的時候（台灣的中鋼就是使用 PostgreSQL 哦）。&lt;br /&gt;&lt;br /&gt;However，如果 TDBC-PostgreSQL 出來了，我會稍微測試一下相關的東西，看看這個 TDBC-PostgreSQL driver 的情況，如果有東西給我修改，對我而言比從零開始好，所以我已經放棄了一開始的想法，先從熟悉 TDBC 的方向著手。&lt;br /&gt;&lt;br /&gt;另外，在 TDBC 之後，[Incr Tcl] 4.0（這個版本使用 TclOO 全部改寫）已經進入 Tcl core code，將會以 package 的方式存在，在 8.6 beta 2 就會進去了，所以 8.6 beta 2 出來的時候，我也會看看這部份的情況。&lt;br /&gt;&lt;br /&gt;看起來 Tcl/Tk 8.6 將會是一個巨大的改版，不管是物件導向套件的引入（TclOO/iTcl），或者是資料庫 API 的統一（TDBC），甚至是引入 zlib 與 png 的支援，都將深刻的改變這個語言，同時也讓這個語言更好用更強壯。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-6803558895329698113?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/6803558895329698113/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=6803558895329698113' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/6803558895329698113'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/6803558895329698113'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/06/sqlite-and-postgresql.html' title='SQLite and PostgreSQL'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-9212166637718058126</id><published>2009-06-24T17:09:00.001+08:00</published><updated>2009-06-24T17:09:55.919+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='相關文章'/><title type='text'>A Slightly Skeptical View on Scripting Languages</title><content type='html'>&lt;p&gt;&lt;a href="http://www.softpanorama.org/Articles/a_slightly_skeptical_view_on_scripting_languages.shtml"&gt;A Slightly Skeptical View on Scripting Languages&lt;/a&gt;&lt;/p&gt;&lt;p&gt;一篇對於 Scripting Language 的文章。&lt;/p&gt;&lt;p&gt;比較語言的差異與優缺點是浪費時間，因為每個語言都有其優缺點，挑順手的就好了（除非是因為 project 還是 Boss 要求）。&lt;/p&gt;&lt;p&gt;不過就算是現在，我還是覺得 Tcl 很棒（雖然用的人沒有很多），因為 Tcl 的語言規則很簡單但是卻又變化無窮，&lt;a href="http://home.pacbell.net/ouster/"&gt;John Ousterhout&lt;/a&gt; 真的好強啊~~~&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-9212166637718058126?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/9212166637718058126/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=9212166637718058126' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/9212166637718058126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/9212166637718058126'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/06/slightly-skeptical-view-on-scripting.html' title='A Slightly Skeptical View on Scripting Languages'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-3322773468075358145</id><published>2009-06-24T17:08:00.001+08:00</published><updated>2009-06-24T17:08:27.739+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='套件'/><title type='text'>Tkhtml v3</title><content type='html'>&lt;a href="http://tkhtml.tcl.tk/"&gt;TkHTML&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tkhtml 是個通過 ACID2，for Tk 可以用來顯示 HTML/CSS 內容的 widget。&lt;br /&gt;&lt;br /&gt;下面是在 Tcler's Wiki 上示範使用 Tkhtml 做出一個 Label widget 的範例：&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package require Tkhtml 3.0&lt;br /&gt;&lt;br /&gt;# Create and populate an html widget.&lt;br /&gt;html .label -shrink 1&lt;br /&gt;.label parse -final {&lt;br /&gt;   &amp;lt;b&amp;gt;Hello &amp;lt;i&amp;gt;world&amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt; example&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# Pack the new html widget&lt;br /&gt;pack .label&lt;br /&gt;&lt;br /&gt;bind .label &amp;lt;KeyPress-q&amp;gt; exit&lt;br /&gt;focus .label&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-3322773468075358145?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/3322773468075358145/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=3322773468075358145' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/3322773468075358145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/3322773468075358145'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/06/tkhtml-v3.html' title='Tkhtml v3'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-8759087765977178208</id><published>2009-06-24T17:07:00.001+08:00</published><updated>2009-06-24T17:07:32.745+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>Thread and Tcl</title><content type='html'>&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;package require Thread&lt;br /&gt;catch {console show}&lt;br /&gt;&lt;br /&gt;set ::gThread [thread::create {thread::wait} ]&lt;br /&gt;&lt;br /&gt;proc printTime { } {&lt;br /&gt; thread::send -async $::gThread { puts stdout [clock format [clock seconds]] }&lt;br /&gt; after 1000 printTime&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;printTime&lt;br /&gt;puts "started test..."&lt;br /&gt;&lt;br /&gt;#only needed for tclsh, to keep the interpreter alive and keep the event loop running&lt;br /&gt;vwait forever&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;在經過一段時間的學習以後，我才慢慢的看懂了 Tcl 的 Thread 擴充套件應該怎麼用才對，相關的資訊可以看 &lt;a href="http://www.tcl.tk/doc/howto/thread_model.html"&gt;Tcl Threading Model&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;如果要檢查 tclsh 是不是 build 成支援 thread，則可以用&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;expr {[info exists ::tcl_platform(threaded)] &amp;amp;&amp;amp; $::tcl_platform(threaded)}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;來做到。當值為 1 時，表示有支援。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-8759087765977178208?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/8759087765977178208/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=8759087765977178208' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8759087765977178208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8759087765977178208'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/06/thread-and-tcl.html' title='Thread and Tcl'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-8574941574046258662</id><published>2009-06-24T17:05:00.000+08:00</published><updated>2009-06-24T17:06:07.259+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Syntax'/><title type='text'>Tcl/TK 8.5 new syntax: {*} 與 Eval</title><content type='html'>&lt;p&gt;Tcl/Tk 8.5 引進了新的語法  {*}，可以用來動態的建立命令執行，可以讓程式看起來更為簡單（使用 eval 會看起來比較複雜）。&lt;/p&gt;我們可以用 Eval 這個指令將參數串接成一個字串後，將字串視為一個 Tcl Script 丟給解譯器去執行。下面是使用 Eval 版：&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;eval button .b $stdargs -text \$mytext -bd $border&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;{*} 可以將可以將串列的各個值分開為不同的參數，下面是改寫過後的版本：&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;button .b {*}$stdargs -text $mytext -bd $border&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-8574941574046258662?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/8574941574046258662/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=8574941574046258662' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8574941574046258662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/8574941574046258662'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/06/tcltk-85-new-syntax-eval.html' title='Tcl/TK 8.5 new syntax: {*} 與 Eval'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-4939060965571624774</id><published>2009-06-24T17:04:00.001+08:00</published><updated>2009-06-24T17:04:58.988+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Example'/><title type='text'>列出目前的磁碟機</title><content type='html'>我們可以使用 file 這個 command 來做到這件事，所拿到的是目前磁碟機的 list，下面是範例程式：&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;set disks [file volumes]&lt;br /&gt;&lt;br /&gt;puts "Disks:"&lt;br /&gt;foreach local $disks {&lt;br /&gt;puts " $local --- [file system $local]"&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;在範例中，我們同時也使用了 file system 來取得檔案系統的資料（是 FAT 或者是 NTFS 等資料）。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-4939060965571624774?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/4939060965571624774/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=4939060965571624774' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/4939060965571624774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/4939060965571624774'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/06/blog-post.html' title='列出目前的磁碟機'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1350456806348278691.post-4750719319419823268</id><published>2009-06-24T17:02:00.000+08:00</published><updated>2009-06-24T17:03:58.100+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='API'/><title type='text'>Tcl/Tk 與 Thread</title><content type='html'>不知道為什麼，我對於 Thread 總是心存恐懼，雖然我已經懂得避掉一些不好的情況，但是遇上 Thread 總是怕怕的，可能是因為 Thread 非循序的特性讓我覺得無法自在的使用吧？&lt;br /&gt;&lt;br /&gt;Tcl/Tk 在自己的 C API 已經有支援 Thread 的 API（編譯的時候要 enable），並且從 8.1 開始就已經是 thread safe 的軟體，而 Thread 這個套件則是讓我們可以透過 Tcl scripting 的方式來操作。&lt;br /&gt;&lt;br /&gt;下面是 Tcl C API 關於 Thread 的部份：&lt;br /&gt;Tcl_ConditionNotify, Tcl_ConditionWait, Tcl_ConditionFinalize, Tcl_GetThreadData, Tcl_MutexLock, Tcl_MutexUnlock, Tcl_MutexFinalize, Tcl_CreateThread, Tcl_JoinThread&lt;br /&gt;&lt;br /&gt;在 Linux/FreeBSD/UNIX 世界裡，通常是遵循 POSIX 標準，所以是使用 PThread，而 Windows 平台則有自己的一套 API，而 Tcl/Tk 已經幫我們建立了一個中介層，所以不用管底層的差異。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1350456806348278691-4750719319419823268?l=tcl-eval.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tcl-eval.blogspot.com/feeds/4750719319419823268/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1350456806348278691&amp;postID=4750719319419823268' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/4750719319419823268'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1350456806348278691/posts/default/4750719319419823268'/><link rel='alternate' type='text/html' href='http://tcl-eval.blogspot.com/2009/06/tcltk-thread.html' title='Tcl/Tk 與 Thread'/><author><name>Xiong-Hao</name><uri>http://www.blogger.com/profile/18017351083366137174</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://2.bp.blogspot.com/_S0U_DT6HPX8/SyxM-yNgFuI/AAAAAAAAAMY/kydmFsvPs4U/S220/bear_on_board.jpg'/></author><thr:total>0</thr:total></entry></feed>
