2017-04-29

package vcompare

可以看 Wiki 的解釋

Compares the two version numbers given by version1 and version2. Returns -1 if version1 is an earlier version than version2, 0 if they are equal, and 1 if version1 is later than version2.


實際上的用法可以看 tcllib 中 zipfile::decode module。

if {[package vcompare $tcl_patchLevel "8.6"] < 0} {
  # Only needed pre-8.6
  package require Trf                       ; # Wrapper to zlib
  package require zlibtcl                   ; # Zlib usage. No commands, access through Trf
  set ::zipfile::decode::native_zip_functs 0
} else {
  set ::zipfile::decode::native_zip_functs 1
}

也就是如果 >= 8.6,使用內建的 zlib,如果小於就使用 Trf 與 zlibtcl。

接下來我檢查了一下 zipfile::decode module,發現 zipfile::decode module 並沒有修改完全,::zipfile::decode::GetFile 中沒有使用 native_zip_functs 來選擇要使用的 command。下面是修正的 patch。

     deflate {
         go     $fd(fileloc)
         nbytes $fd(csize)
-        return [zip -mode decompress -nowrap 1 -- [getval]]
+        if {$::zipfile::decode::native_zip_functs} {
+          return [zlib inflate [getval]]
+        } else {
+          return [zip -mode decompress -nowrap 1 -- [getval]]
+        }
     }
     default {
         Error "Unable to handle file \"$src\" compressed with method \"$fd(cm)\"" \



我已經在 Tcl Library Source Repository 開了一個 Ticket 來記錄這件事。

2017-04-14

tclmpi v1.0

目前在 Ubuntu 14.04 上測試過。

Ubuntu 14.04 需要安裝 openmpi,指令如下:
sudo apt-get install openmpi-bin libopenmpi-dev


然後從 https://github.com/akohlmey/tclmpi 或者是 http://sites.google.com/site/akohlmey/software/tclmpi 下載 v1.0 source code。

接下來需要修改 Makefile,讓 tcl.h 可以被正確找到。
TCLINCLUDE=-I/usr/include/tcl

修改完 Makefile 以後,執行 make,然後在 /usr/lib 建立 tclmpi1.0 目錄,將 pkgIndex.tcl, tclmpi.tcl 與 _tclmpi.so 三個檔案複製到 /usr/lib/tclmpi1.0,這樣就完成安裝。

再來使用 examples 下的 hello.tcl 來測試,如果有正確輸出,就表示安裝正確。

package require tclmpi 1.0

# initialize TclMPI
::tclmpi::init

set comm tclmpi::comm_world
set size [::tclmpi::comm_size $comm]
set rank [::tclmpi::comm_rank $comm]

puts "hello world, this is rank $rank of $size"

# close out TclMPI
::tclmpi::finalize
exit 0

2017-04-09

TclTLS-rpm-spec

TclTLS-rpm-spec
TclTLS website


參考 openSUSE 網站上的 RPM spec 以後,做一些小修改造出 1.7.11 的 RPM  檔案。看起來是可以使用,但是只有小量的測試而已,我不知道會不會有什麼問題。

然後寫一個 build.tcl 來加速整個流程。

2017-03-03

zookeepertcl

zookeepertcl

Flightaware 最近在 github 增加了 zookeepertcl,Tcl interface to Apache ZooKeeper distributed coordination system。


如果要寫一個 CP 分散式系統,就我聽過的,在一致性上目前有三個方法可以使用,實作正確的 Raft Consensus Algorithm,實作正確的 Paxos Algorithm 以及使用 Apache Zookeeper。

雖然 Apache Zookeeper 是用 Java 寫的,但是其一致性算法已經經過證明而且十分可靠,所以我想有個 Tcl interface 還是不錯的。


更新:
如果你對 Apache ZooKeeper 的測試報告有興趣,可以閱讀 Jepsen: Zookeeper

2017-02-22

tclreadline and .tclshrc

tclreadline

flightaware clone 了一份 tclreadline 的 source code。如果在 Ubuntu 14.04 下編譯,aux 目錄下會缺少東西,需要使用 libtoolize & aclocal & autoconf & automake --add-missing 來更新。

下面只是嘗試設定 tclsh 提示。

if {$tcl_interactive} {
    package require tclreadline 

    proc ::tclreadline::prompt1 {} {
        global env
        if {[catch {set pwd [pwd]} tmp]} {
            set pwd "unable to get pwd"
        }

        if [info exists env(HOME)] {
            regsub $env(HOME) $pwd "~" pwd
        }


        if [info exists env(USER)] {
            set user $env(USER)
        } else {
            set user tclsh
        }

        return "$user@[lindex [split [info hostname] "."] 0]:$pwd% "
    }

    ::tclreadline::Loop
}



更新:
同時也在 openSUSE 上測試 tclreadline,為了可以快速安裝和移除,參考了其它人的做法以後,使用 RPM spec 和 build script 來造 RPM 檔案

2017-02-08

ActiveTcl 8.6.6 Released

ActiveTcl 8.6.6 (Linux) Released
ActiveTcl 8.6.6 Released


一開始放的是 Linux 平台,最近一天放的則是 Windows x86_64 的安裝檔案。看起來跟之前的目錄組織方法不太一樣,而且 Windows 平台經過安裝測試,找不到 Teacup 相關的檔案。

我不太確定這些改變是暫時的還是永久的。

2017-01-20

BaseXClient-Tcl

Source code:
BaseXClient-Tcl


Tcl client for BaseX database.

BaseX 是一個 XML 資料庫,我只是用來做某些簡單的測試。大部份的功能跟官方的 client 都有點像,不過還是有做一些簡化假設,但是整體上功能應該是差不多的(應該啦)。

2017-01-10

print tcl_platform info

使用 parray 列出來 tcl_platform 的資料:

parray tcl_platform

tcl_platform is an associative array whose elements contain information about the platform on which the application is running, such as the name of the operating system, its current release number, and the machine's instruction set.

2017-01-05

tkvlc: A demo to embed libVLC to Tk toolkit widget

Source code:
tkvlc


使用 OpenGL with C and Tcl/Tk 的方法,將 libVLC 內嵌在 Tk frame widget 內播放影片的方法。

我只有在 openSUSE 上測試。用來驗證這個方法的可行性。


更新:
有些說明沒有寫好,我重新推一個上去 Github。

更新:
會在 Windows build fail,更新 source code。

2017/01/09 更新:
使用 libvlc_media_get_duration 讀取影片的長度。如果在 libvlc_media_player_set_media 之後沒有播放前就讀取,讀到的長度會是 0。

解決的方法有二個,一個是 play 以後 stop,再讀取就會是正確值(就是要先做一小段播放的動作)。一個是 set_media 之後呼叫 libvlc_media_parse,在分析以後 meta info 就會被填寫為正確值,那之後取得的資料就會是正確的。

2017/01/09 更新:
增加更多的 command,並且更新 command 的組織方式。
將版本更新為 v0.3。

2017-01-04

OpenGL with C and Tcl/Tk

OpenGL with C and Tcl/Tk


很有趣的是,這篇文章其實指出了一個很有用的用法,就是拿到 HWND/XWindow ID 以後,我們就可以內嵌一些內容到一個 Tk 的 frame 內。

關鍵是 It involves making a frame widget in Tcl, and then passing its HWND to C to initialize the OpenGL rendering context.


而我猜不只是 OpenGL,具有類似方法的函式庫也可以這樣使用。

因為沒有真的實作過,所以還不確定這個技巧的可用性有多高,但是我直覺認為,這個方法可以結合不少外部函式庫來使用。