2018-06-22

tcl-brotli

tcl-brotli
brotli (@ Tcler's Wiki)


Tcler's Wiki 上已經有人使用 Critcl 寫好了壓縮與解壓縮的 code。我只是拿這份 code 來使用。

不過要注意的是 libbrotlidec1/libbrotlidec1/libbrotlicommon1 不存在於 openSUSE LEAP 42.3 軟體庫中,openSUSE Leap 15.0 才開始有收入軟體庫中。

2018-06-21

Google Sites tclmonetdb is gone

簡單的說,就是 tclmonetdb  進行 Google 新的協作平台轉換以後版面直接炸掉,在試著調整了一下以後,我發現調整好是個有點麻煩的任務,我本來想說放棄新的保留舊的,但是 Google 顯然沒考慮有人會想這麼做,所以變成一個 zombie 的狀態。

經過思考,我直接刪除新的,然後在 tclmonetdb 舊的 Google Sites 網頁 留下訊息,這個站已經移往 Github 了,將在 2018/06/22 刪除。

所以事情就是這樣了,Google Sites tclmonetdb is gone. 如果 Google 服務繼續這樣,那他們會有麻煩,問題不在技術高低,問題在於使用的過程。

所以 Source code 你可以在 Github 找到:
tclmonetdb

如果是 openSUSE,你可以找到 OBS 上的檔案:
tclmonetdb @ OBS

至於 Windows 平台,其實我今天本來是要放新的檔案,但是因為炸掉了所以也直接被我刪除,就…… 跳過這件事吧。


更新:
我也刪除了這個部落格關於 tclmonetdb 文章(因為都會指向錯誤的連結)。

2018-06-13

ttk::setTheme

ttk::setTheme

This function takes a theme name as an argument. It looks to see if the theme has been loaded, and if not, requires the package, and calls ttk to use the theme. While the code actually also sets a variable, that variable is local to the function and thus isn't available.

可以使用這個函式來設定 Ttk 要使用的 theme。


關於相關的 theme 列表,可以查看 List of ttk Themes。Ttk 已經有內建一些 theme 可以使用。

2018-06-07

try and finally

在 comp.lang.tcl 看到這個寫法,所以我寫了一個練習用的程式來學習這件事:
try 是 Tcl 8.6 內建命令,可以在 finally 釋放所使用的資源。

#!/usr/bin/env tclsh
package require http
package require tls

http::register https 443 [list ::tls::socket -ssl3 0 -ssl2 0 -tls1 1]

set tok {}
set url {https://duckduckgo.com/}

try {
    set tok [http::geturl $url -method GET -timeout 3000]
    puts "Status: [::http::ncode $tok]"
    puts "Status Text: [http::status $tok]"
    puts "Headers: [http::meta $tok]"
} on error {em} {
    puts "Error: $em"
} finally {
    # cleanup here
    if {[info exists tok]==1} {
        http::cleanup $tok
    }
}

(更新:拔掉網路線以後測試,我想需要檢查 tok 是否存在)

相關連結:
try ... finally ... (@ Tclers Wiki!)
TIP 329: Try/Catch/Finally syntax

tklib spec

tklib-spec (20180605)


因為 tablelist package 的關係,所以我也更新了 tklib 的 RPM spec。執行 build.tcl 就會 checkout 在 Github 的 mirror (@ 20180605) 並且進行處理,然後使用 rpmbuild 製造出 RPM 檔案。

這樣 tklib 所包含的 tablelist package 應該就是最近 release 的。

2018-06-06

tablelist 6.2

tablelist @ Tclers Wiki!
tablelist-spec


tablelist is a multi-column listbox and treeview widget for Tk.

Tklib 已經有納入這個套件,不過這個套件本身仍然在繼續修正問題與增加功能,然後(應該有)同步到 Tklib。

因為 tablelist 和 Tklib 的進版速度是不同的,所以 tablelist 我也寫了 RPM spec(嗯…… 其實是我一開始沒發覺他已經在 Tklib 裡了),這樣如果要使用較新的版本或者是需要單獨安裝的使用可以使用。

2018-06-03

TDBC-ODBC: Get Data Sources list

TDBC-ODBC 有提供取得目前 data sources 名單的函式 ::tdbc::odbc::datasources。下面的 code 就是取得目前的名單以後,將資料增加到 tablelist 的片段。
# Get data sources list and list
tablelist::tablelist .t -columns {0 "DSN" 0 "Driver"} -stretch all \
    -background white -font {Helvetica -14}
pack .t -fill both -expand 1 -side top
set sources [::tdbc::odbc::datasources]
foreach {dsn driver} $sources {
   .t insert end [list $dsn $driver]
}

這樣就可以取得目前的 ODBC data sources。


其它部份:
unixODBC 可以在 /etc/unixODBC 目錄中設定 odbc.ini 與 odbcinst.ini,或者是在家目錄下設定 .odbc.ini。

::tdbc::odbc::datasources 如果沒有特別設定,會取得 system 和 user 的名單。TDBC-ODBC 可以使用選項 -system 或者是 -user 來取得個別的名單。

2018-05-29

tcl-opencc: Tcl bindings for OpenCC (libopencc)

Open Chinese Convert (OpenCC, 開放中文轉換) is an opensource project for conversion between Traditional Chinese and Simplified Chinese, supporting character-level conversion, phrase-level conversion, variant conversion and regional idioms among Mainland China, Taiwan and Hong kong.

OpenCC 是一個優秀的開源專案,以 C++ 開發,支援 Linux、Mac OS X、Windows、iOS、Android 等平台,同時有 Node.js bindings,可以用來做中文繁簡轉換的工作。OpenCC 已經提供了一個命令列工具,可以用來指定輸入檔案、輸出檔案與指定設定檔,然後就可以利用這個命令列工具來做中文繁簡轉換。

一個更好的地方是,OpenCC 將核心函式庫獨立出來,所以我們可以使用 OpenCC 提供的函式庫來開發一些工具,或者是與自己的程式結合產生更多的功能。

所以 tcl-opencc 就是這樣寫出來的,這樣子如果我需要在 Tcl 進行繁簡轉換的工作,就可以使用 OpenCC 的函式庫,而不用呼叫外部的執行檔。

2018-05-28

openSUSE Leap 15.0 and OpenAL Soft

升級到 openSUSE Leap 15.0 以後,使用 tclopenal 播放音樂,都會跑出來下面的錯誤訊息:

Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started



一開始我沒有搞清楚狀況,所以以為是沒有安裝 Jack Audio Server,但是後來我又想,Linux 一般的預設應該是 ALSA/PulseAudio,所以不應該是沒有安裝 Jack Audio Server 的問題。最後才想到,可能是 OpenAL Soft 的設定問題。

OpenAL Soft 是有支援 Jack 的,所以可能是我之前使用的版本不用設定,或者是之前的版本已經有設定好。但是不管如何,這個錯誤訊息在 openSUSE Leap 15.0 跑出來,所以我需要消除掉這個錯誤訊息。

接下來我發現 /etc/openal 目錄下沒有 alsoft.conf 這個檔案。這給了我提示,所以在搜尋以後,找到答案,我需要建立 alsoft.conf 檔案,並且設定如下:
[general]
drivers = -jack,


經過測試,這樣確實可以消除無法連接到 Jack 的錯誤訊息。

2018-05-24

tcl-cairo: Tcl bindings for Cairo library

tcl-cairo


使用 SWIG。資訊來自於 tclcairo。我只是透過範例來學習 SWIG 該如何使用,而剛好 tclcairo 網頁有範例可以用來測試,所以就嘗試看看。

Tcl and SWIG as a C/C++ Development Tool

Tcl and SWIG as a C/C++ Development Tool
SWIG and Tcl (3.0 doc)
Swig (Tcler's Wiki)


接下來我會花一點時間使用看看 SWIG,然後看能不能成功的將我需要的 C library 部份轉成 Tcl interface。因為不是很急迫,所以我只是開始收集資料而已。

2018-05-20

GNOCL: Tcl/GTk Bindings

tcl-gnocl-spec


GNOCL 可以讓你在 Tcl 使用 Gtk+ 2 library。這個 spec 目前使用 2018/05/10 的 Gnocl-Nightly-Build。

因為版本更替的關係,所以一開始的時候我以為 Label 的 markup 功能是失效的,後來才發現要使用 -useMarkup 來開啟功能。

再來是有個地方造成了一些困擾,就是如果直接按 x 想要離開,會發生無法離開的狀況,這需要使用 -onDestroy 並且指定 exit 才行。

所以下面就是一個修改上面二點以後的範例:
#!/usr/bin/tclsh

package require Gnocl
# create submenu for menu "File" with standard items "New" and 
# "Quit" (text, icon and accelerator). 'N', 'Q' respectively, 
# are underlined and are used as mnemonics.
set menu [gnocl::menu]
$menu add [gnocl::menuItem -text "%#New" -tooltip "Make new" \
      -onClicked {puts "That's new"}]
$menu add [gnocl::menuSeparator]
$menu add [gnocl::menuItem -text "%#Quit" -onClicked exit \
      -tooltip "Quit program"]

# create menu "File", 'F' is underlined and used as mnemonic
set file [gnocl::menuItem -text "%__File" -submenu $menu]

# create menu "Help" with item "About" 
set menu [gnocl::menu]
$menu add [gnocl::menuItem -text "%__About" \
      -tooltip "Show about dialog" \
      -onClicked {puts "Mini example (c) 2001 - 2003 P.G. Baum"}]
set help [gnocl::menuItem -text "%__Help" -submenu $menu]

# create toolbar with standard items "Quit" and "New"
set toolBar [gnocl::toolBar -style both]
$toolBar add item -text "%#Quit" -tooltip "Tooltip Quit" \
      -onClicked exit
$toolBar add space
$toolBar add item -text "%#New" -tooltip "Tooltip new" \
      -onClicked {puts "That's new"}

# create GTK+ application with menu, toolBar, statusbar 
# and a label as main widget
set box [gnocl::box -orientation vertical -borderWidth 0 -spacing 0]
set win [gnocl::window -child $box -title "Test Application" -onDestroy { exit } ]
$box add [gnocl::menuBar -children [list $file $help]]
$box add $toolBar 
$box add [gnocl::label -useMarkup 1 -text \
      {%<<span foreground="blue" size="large">Hello</span>\
      <span foreground="red" size="large">World</span>}] -expand 1
$box add [gnocl::statusBar] 

# enter GTK+ main loop
gnocl::mainLoop

2018-05-12

XQilla library 2.3.4: compatibility issue

我發現 XQilla 2.3.4 這個版本需要 Xerces-C++ 3.2.0 以上的版本。然後當我處理完相依性問題編譯成功以後,我發現 XQilla .so 的副檔名有改變(從 .so.3 變成 .so.2)。

結果重新編譯 tclxqilla 以後,會出現找不到 .so.3 的問題。我感覺 XQilla library 在 2.3.4 有相容性問題沒有處理好,所以在測試過以後,我決定跳過這個版本。

這也讓我的 openSUSE build service 上面的相關項目發生問題,因為我要重新編譯的關係,所以刪除項目以後重建一次,版本號沒有改變,但是 md5 變了,如果使用 zypper 安裝會出現警告和問題。

更新:
我稍微修改了 openSUSE build service 上面的 tclxqilla RPM spec,讓 build version 往上增加,這樣就不會同版本比對而可以消除使用 zypper 安裝會出現警告和問題。

2018-05-09

Tcl: identity function

identity function: The identity function accepts one value and simply returns that value.

Tcl 8.6 可以使用下列的方式:
string cat $var

或者是比較短的寫法:
lindex $var


很有趣的事情。

2018-04-30

NaviServer and Markdown

naviserver-markdown


還是記錄一下這件事。和之前寫的東西類似,也就是 Markdown 檔案輸出為 HTML 格式。在研究 NaviServer 目前的 code 以後,我發現在 NaviServer tcl 目錄下加上 markdown.tcl,就可以用來處理 /*.md。

下面是 markdown.tcl 檔案的內容:
#
# markdown.tcl --
#
#   Add tclllib markdown support to NaviServer
#

#
# Register the ns_markdownfie handler for .md files
#

package require Markdown

ns_register_proc GET  /*.md ns_markdownfie

#
# ns_markdownfie --
#
#   Callback for Makrdown file.
#

proc ns_markdownfie {args} {

    set path [ns_url2file [ns_conn url]]
    if {![ns_filestat $path stat]} {
        ns_returnnotfound
        return
    }

    set infile [open $path]
    set md [read $infile]
    close $infile
    set data [::Markdown::convert $md]

    ns_headers 200 "text/html;charset=utf-8"
    ns_write $data
}

# EOF

重開 NaviServer 以後測試,我發現這個寫法是可行的。

Tclunqlite v0.3.4

檔案放置網頁


Tclunqlite

About

This is the UnQLite extension for Tcl using the Tcl Extension Architecture (TEA).

UnQLite is a in-process software library which implements a self-contained, serverless, zero-configuration, transactional NoSQL (Key/Value store and Document-store) database engine. This extension provides an easy to use interface for accessing UnQLite database files from Tcl.

Main Change

  1. Update UnQLite to 1.1.9

說明


這是一個小更新版本,整合 UnQLite 的版本更新。

2018-04-27

Apache Rivet and mod_actions

mod_actions


雖然 mod_actions 的文件是寫 CGI script,但是你可以使用 Apache Rivet, PHP 或者是類似的工具來撰寫。

下面是測試用的程式,用來將 markdown 檔案 (*.md) 轉換為 HTML 格式以後輸出:
package require Markdown

::rivet::load_env

if {[info exists ::request::env(PATH_TRANSLATED)]==0} {
    ::rivet::headers numeric 400
    return
}

if {[file exists $::request::env(PATH_TRANSLATED)]==0} {
    ::rivet::headers numeric 404
    return
}

set in [open $::request::env(PATH_TRANSLATED)]
set md [read $in]
close $in
set data [::Markdown::convert $md]

::rivet::headers type "text/html;charset=utf-8"
puts $data

再來加上設定(我加在 VirtualHost configure file):
Action markdown /mdhandler.tcl
AddHandler markdown .md

最後重開 Apache HTTP server 然後進行測試。我把程式放在 Github 上。

2018-04-15

tcl-curses: A "minimalist" tcl package for interfacing to curses

tcl-curses


大部份的 code 來自 Minimalist Curses。我只是加上 TEA 的檔案,這樣比較好編譯(對我而言),然後加上我自己需要的部份。

只有在 openSUSE LEAP 42.3 使用 ncurses 測試過。

2018-04-12

tcl-augeas

tcl-augeas


Augeas is a free software configuration-management library, written in the C programming language. Augeas is a tool for accessing and modifying data stored in configuration files of various formats.


可以用來設定檔案的管理,這樣可以有一個更好的方式來進行設定。在 Tcler's Wiki 條目上有一個 Tk 示範程式,列出來目前的設定。如果要做一些軟體設定,就不用自己寫一個分析設定檔案的程式, 而是透過 Augeas 來設定(如果 Augeas 有支援)。

很有趣的工具。我在 Ubuntu 14.04 編譯成功,如果我在 openSUSE LEAP 42.3 也成功,那我嘗試寫看看 tcl-augeas 的 RPM spec,如果成功我再嘗試放到 openSUSE build service 上。

2018-04-11

tclopusfile: Tcl bindings for Opusfile library

tclopusfile

Opus is a lossy audio coding format developed by the Xiph.Org Foundation and standardized by the Internet Engineering Task Force, designed to efficiently code speech and general audio in a single format, while remaining low-latency enough for real-time interactive communication and low-complexity enough for low-end embedded processors.


目前我的實作只有實作開啟檔案的部份,read 的部份使用 int16,float 的部份也省略(也就是我自己需要的部份,讀取 .opus 檔案然後播放音樂)。

目前只有幾個 sample 可以測試,不過聽起來是正常的,所以我把目前的實作放上去 github 了。

中間卡住的地方是 op_read,似乎跟 libopusfile 的實作有關,即使我加大我的 buffer,拿回來的 sample/channel 都是 960,一開始我以為他會計算 buffer 傳回來最大值,後來才發現…… 不是這樣。

2018-04-09

OpenCL and Tcl

維基百科的介紹

OpenCL(Open Computing Language,開放計算語言)是一個為異構平台編寫程式的框架,此異構平台可由 CPU、GPU、DSP、FPGA 或其他類型的處理器與硬體加速器所組成。OpenCL 由一門用於編寫 kernels(在 OpenCL 裝置上執行的函式)的語言(基於C99)和一組用於定義並控制平台的API組成。OpenCL 提供了基於任務分割和資料分割的平行計算機制。


OpenCL 一開始由蘋果所開發,並且擁有商標權。目前業界類似的是 NVIDIA 的 CUDA,而且 CUDA 目前看起來較為流行。OpenCL 交給 Khronos Group 之後,採用的主力是 AMD(AMD 曾經大力主推了一 陣子,不過大家也知道 AMD 前幾年狀況有點不好,所以……)

自由軟體的實作則是 pocl (Portable Computing Language),使用者可以在一般的 CPU 上使用 OpenCL API。再來是 pocl 最新的版本已經開始嘗試加入 NVIDIA GPU devices 的支援。

我看到 pocl 的時候,才想到確實 OpenCL 並沒有一定要在 GPU 上才行(只是大多數都是使用在 GPU 或者是 FPGA 上)。我已經稍微測試一下 pocl,發現 OpenCL 2.0 是可用的。

Tcl 有關的套件則是 TclOpenCL,嘗試 VecTcl 與 OpenCL 的整合。

2018-03-19

Get Linux Distribution Name (Tcl exec 版)

在最後嘗試 Bash 的版本。在嘗試以後,寫好了 Bash 版,使用 cat, grep 和 sed 取得結果。
#!/bin/bash

if [ -f '/etc/os-release' ]; then
    cat '/etc/os-release' | grep -w "^NAME" | sed -e 's/NAME=//g'
fi


於是我就想,那我可以使用同樣的方式在 Tcl  嗎?答案是可以。
#!/usr/bin/env tclsh
#
# Execute external program to get result
#

package require Tcl 8.6

set myfunction {{} {
    return [exec cat /etc/os-release | grep -w "^NAME" | sed -e "s/NAME=//g"]
}}

if {[file exists "/etc/os-release"]==1} {
    puts [apply $myfunction]
}

為了增加變化,所以我使用了匿名函式的寫法。

2018-03-15

Tcl double quotes and string map

這只是 string map 的測試。

set doublequotes {"It is double quotes"}
string map [list {"} {\"}] $doublequotes
string map [list {\"} {"}] $doublequotes

進行雙引號的改寫,從 " 改寫為 \",以及改回來,從 \" 改成 "。

2018-03-13

Use uname to get info

在 Unix-like 的系統可以使用 uname 來取得一些系統資料。下面是使用 uname -s 來取得目前的 OS 資訊。

proc getKernelName {} {
    set mychannel [open "|/usr/bin/uname -s"]
    set name [chan gets $mychannel]
    chan close $mychannel

    return $name
}

如果在 Linux 上,會得到的回傳值是 Linux。

我把其它的部份也寫成函式,結果就是下面的 tcl module:
uname-tcl

Get Linux Distribution Name

使用 /etc/os-release 來取得 Linux Distribution 的相關資訊。應該可以適用於: CentOS, RedHat, Fedora, openSUSE, SUSE, Debian/Ubuntu, ArchLinux

proc getDistributionName {} {
    set OSName ""

    if {[file exists "/etc/os-release"]==1} {
        set release [open "/etc/os-release" r]
        while {1} {
            if {[chan gets $release line] > 0} {
                set info [split $line "="]
                if {[string compare [lindex $info 0] "NAME"]==0} {
                    set OSName [lindex $info 1]
                    break;
                }
            } else {
                if {[chan eof $release]} {
                    break;
                } else {
                    puts "Something is wrong."
                    break;
                }
            }
        }

        chan close $release
    } else {
        return -code error "/etc/os-release not exist!!!" 
    }
    
    return $OSName
}


參考資料:
os-release — Operating system identification

2018-03-12

Tcllib and Tklib

開始準備 openSUSE Leap 15.0,雖然我會等一下才升級,但是放在 openSUSE build service 的部份可以開始準備。

Tcllib 和 Tklib 遇到同一個問題,就是 openSUSE build service 會將下面的寫法視為錯誤:
#!/usr/bin/env tclsh


所以我只好用 sed 改寫 examples 下的範例,改成 #!/usr/bin/tclsh。這似乎是 openSUSE Leap 15.0 才出現的檢查。

(* 有疑問的地方在於,其實 #!/usr/bin/env tclsh 是比較推薦的寫法,所以我搞不懂為什麼會加這個檢查)

2018-03-06

Critcl and TCLLIBPATH

critcl-spec


在最近使用的過程中,我意外的發現我之前並沒有全部搞定。在最後編譯 md5c 的時候沒有成功,只是 openSUSE build service 還是成功的建立 RPM,所以可以使用部份的功能。

經過研究 critcl 的安裝過程,在 RPM spec 加入下列的修正:
+export TCLLIBPATH=" %{buildroot}/usr/lib64/tcl/critcl-app3.1.17 %{buildroot}/usr/lib64/tcl/critcl3.1.17 \
+%{buildroot}/usr/lib64/tcl/dict841 %{buildroot}/usr/lib64/tcl/lassign841.0.1 \
+%{buildroot}/usr/lib64/tcl/lmap841"


在安裝過程中,Critcl 會複製本身的套件到 Tcl library 目錄下,所以最後的步驟編譯 md5c 的時候,所有需要的套件都可以被 Tcl 找到。

而製造 RPM 的過程中,套件會被複製到 buildroot 目錄下,所以在這個時候 Tcl 會找不到需要的套件。因此只要讓 Tcl 可以找到套件,就可以完成編譯 md5c 的步驟。

在嘗試以後,既然我知道這些套件的安裝地點,就表示我可以使用設定 TCLLIBPATH 的方式解決,所以在安裝以前先設定環境變數,然後再執行安裝程式,這樣 Tcl 就會找到需要的套件完成編譯。

Tclqrencode v0.9

連結網址:
Tclqrencode


更新 libqrencode 的 code base,花了幾個版本整合,所以版本從 v0.7 開始一路修正 merge 所造成的問題,目前版本是 v0.9(希望我一切都搞定了)。

這個版本加入 XPM 的支援。然後我放一個 BSD 2-Clause License 的檔案在 source code package。

2018-03-05

Get Linux kernel version

練習程式,讀取 /proc/version 並且輸出資料。/proc/version 記錄著 Linux kernel 的版本資訊。

#!/usr/bin/env tclsh

set version [open "/proc/version" r]
while {1} {
    if {[chan gets $version line] > 0} {
        puts $line
    } else {
        if {[chan eof $version]} {
            break;
        } else {
            puts "Something is wrong."
            break;
        }
    }
}

chan close $version

procfs

The proc filesystem (procfs) is a special filesystem in Unix-like operating systems that presents information about processes and other system information in a hierarchical file-like structure, providing a more convenient and standardized method for dynamically accessing process data held in the kernel than traditional tracing methods or direct access to kernel memory.

List current processes (Linux)

練習程式,讀取 /proc 下的目錄,如果存在 /proc/*/cmdline,就輸出資料。

#!/usr/bin/env tclsh

set dirs [glob -dir /proc * -type d *]
foreach dir $dirs {
    if {[file exists $dir/cmdline]} {
        set psinfo [open $dir/cmdline r]
        while {1} {
            if {[chan gets $psinfo line] > 0} {
                puts "$dir ---> $line"
            } else {
                if {[chan eof $psinfo]} {
                    break;
                } else {
                    puts "Something is wrong."
                    break;
                }
            }
        }

        chan close $psinfo
    }
}


而 /proc/PID/status 就是這個 process 目前的資訊,所以我們也可以查詢 /proc/self/status 取得自己的資料:
#!/usr/bin/env tclsh

set status [open "/proc/self/status" r]
while {1} {
    if {[chan gets $status line] > 0} {
        puts $line
    } else {
        if {[chan eof $status]} {
            break;
        } else {
            puts "Something is wrong."
            break;
        }
    }
}

chan close $status

2018-03-03

tcl-promise

tcl-promise-spec

tcl-promise implements the promise abstraction for asynchronous programming.

Promises are concurrency primitives that let you write asynchronous code in a sequential style. This Tcl based implementation is mostly modeled on the Javascript/ECMAScript standard.

* 而且 tcl-promise 在 1.0.3 還實作了 async/await。
* 因為 SourceForge 剛好出現問題,所以我複製了一份到 GitHub 上


我在嘗試使用 openSUSE zypper 作為 Tcl 套件管理的時候,就發現 Tcl module file (*.tm) 不是很好處理。這是因為如果放到 /usr/lib64/tcl,openSUSE build service 會檢查是否有包含 native 檔案,如果完全沒有會編譯失敗(至少我試的時候是這樣)。但是如果放到 /usr/share/tcl,則會需要建立一個 pkgIndex.tcl 才行。

所以大多數的 Tcl module file (*.tm) 我都用複製的(而不用 zypper 管理),只有少數要放上去 openSUSE build service 做編譯測試的套件我會做特別處理。tcl-promise 這個套件也使用了 work-around 的方式,在 /usr/share/tcl 目錄下建立套件目錄,並且建立 pkgIndex.tcl 檔案。


2018/03/07 更新
因為 SourceForge 恢復正常,所以刪除了複製的部份,build script 改用 wget 取得檔案的方式。

2018-03-02

Tcl3D

tcl3d-spec


Tcl3D offers the 3D functionality of OpenGL and other 3D libraries at the Tcl scripting level.


因為 BAWT-Tcl 包含了 Tcl3D 套件,所以我有試著 build 看看。Tcl3D 在 SourceForge 上放的檔案是 0.5 版和 0.6 版,但是在 BAWT 網站上放的是 0.9.1 版,所以最後拿 BAWT 提供的版本來使用。

在寫 RPM spec 的時候加了二個 patch,CMakeLists.patch 用來設定我們要安裝的目錄,CMakeModules.patch 則是用來複製各個子目錄下的 pkgIndex.tcl,在 Windows 平台上使用 Visual C++ 編譯是有 Release/Debug 的分別,我不太確定 Linux 平台上有沒有,但是因為沒有正確複製,所以我加了一小段修改讓 pkgIndex.tcl 可以正確複製。

2018-03-01

tcllibc

我之前有聽過,只是沒有實際安裝過,不過經過閱讀 Tcler's wiki 的資料,知道怎麼編譯了。先置條件是需要 Critcl 有安裝才行。

可以使用下列的指令:
./sak.tcl critcl

或者是使用 configure/make 的組合:
./configure
make critcl


The packages using Tcllibc are:
  • base32
  • crc32
  • ip
  • md4
  • md5
  • md5crypt
  • rc4
  • ripemd128
  • ripemd160
  • sha1
  • struct::graph
  • struct::sets
  • struct::tree
  • sum
  • uuencode
  • uuid
  • yencode
這就是目前關於 Tcllibc 的簡單資料。


更新:
使用者不用特別指定使用,而是如果有使用的套件在有安裝的時候,就會使用 C 的版本,沒有的時候使用 pure Tcl 版本。

為了驗證,所以我寫了 openSUSE RPM spec,這樣就比較好裝:
tcllibc-spec

2018-02-24

tcl-archive: A Tcl wrapper for LibArchive

tcl-archive


LibArchive project develops a portable, efficient C library that can read and write streaming archives in a variety of formats.

目前 tag 為 v0.1 版。這是在 Tcl 實作使用 libarchive 的 command,用來壓縮和解壓縮一些常見的壓縮檔案格式(主要是解壓縮)。

我只有寫簡單的 tcltest cases 和簡單的解壓縮測試,看起來沒問題,所以就先 tag 一個版本號。

2018-02-22

Extended Tcl (TclX)

Extended Tcl (TclX)


這是 flightaware 修改的版本(for Tcl 8.6),更新了 build system,並且移除了 TkX extension。我在 ./configure 完以後順利編譯,但是使用的時候有點問題,會有 symbol 找不到。經過檢查以後,發現是 configure 需要正確加入新的檔案才行(如果一開始就先執行 autoconf 則不會有此問題)。我看了一下說明以後,發現沒有指定使用 autoconf,送出一個修正的 pull request,flightaware 也接受了這個小修正。

那麼為什麼我會需要 TclX 呢?因為我最近在試著簡化我自己的 Golang 環境(* 雖然我很少寫 Go,但是我需要測試某些東西的時候可能會需要,所以放一份),如果使用 openSUSE build service 提供的新版本,會一次安裝預料之外的版本數目,但是如果是使用穩定版本則沒有這個問題,只是要嘗試新版本就比較不方便(有可能是因為要使用 Go 來編譯 Go 本身所造成的影響)。

後來我想到,我可以寫一個 script 從官網下載以後解壓縮到指定目錄,如果檢查 .profile 不存在或者是沒有相關的環境變數,就建立檔案或者是寫入相關的環境變數,最後設定 .profile 的 owner 和 group。為了使用 chown,所以需要 TclX 才行。

2018-02-17

tcllib 1.19

在剛才我在看資料的時候,發現 tcllib 1.19 已經釋出了。


Overview ======== 7 new packages in 6 modules 52 changed packages in 35 modules 15 internally changed packages in 10 modules 359 unchanged packages in 105 modules 443 packages, total in 130 modules, total

2018-02-10

tdbchikaricp

tdbchikaricp: Tcl DataBase Connectivity Driver for HikariCP library


HikariCP is a solid high-performance JDBC connection pool.

不過這裡比較像使用 HikariCP 提供的連線方式之一(讀取設定檔案)來連線,並沒有使用 JDBC connection pool 的能力。大多數的 code 來自 TDBCJDBC,因為連上資料庫以後的行為就跟 JDBC 很類似了。


2018/02/12 更新
後來我才想到,其實可以在外面生成 HikariDataSource 物件再傳進來,所以有做一點小更新。

2018/02/12 更新
然後我又想到,既然 tdbchikaricp 實作在外面生成 HikariDataSource 物件再傳進來的功能,如果我小改寫以後,也許只要有支援 DataSource interface 的 library 就可以套用這個方式。晚上我會使用 Alibaba Druid 來測試,然後在 Github README.md 上寫如何使用的說明。

2018-02-04

TickleSharp

TickleSharp


這是我嘗試使用 .NET core 2.0 和 Tcl/TK 8.6 去編譯 TickleSharp v0.1 的結果。這是 C#  使用 P/Invoke 呼叫 Tcl/Tk functions 的套件,我發現…… 使用 .NET core 2.0 和 Tcl/TK 8.6 去編譯以後還是可以用。

只有在 openSUSE LEAP 42.3 上測試。

2018-01-31

Dockerfile for openSUSE, Tcl and Java

docker-tcl-java


本來是使用 -v 來對應 Docket Host 的目錄與 Docket image 裡的目錄,但是後來我發覺如果我只是要測試 tclBlend 在 Open JDK 9 的環境能不能編譯,我應該要做的是安裝 git 然後在這個環境下使用 git clone 取得 source code,再來測試是否可以編譯。

這樣就解決了我自己的困擾。因為一些使用的軟體還沒有遷移到 Java 9,所以我的主要使用環境還是 Open JDK 8。如果我需要測試 Open JDK 9 的部份,就可以使用 Docker 建立一個基本環境然後進行測試(而不會干擾到我自己的使用環境)。

Dockerfile for openSUSE, Tcl and Naviserver

docker-tcl-naviserver


How To Running Systemd on openSUSE Docker Container 的教學,照著建立以後,確認可以讓 systemd 執行。下一步就是嘗試加入 service,因為我之前嘗試建立並且拿到 openSUSE build service 編譯的 NaviServer RPM 有關於 systemd service 的部分,所以就使用 NaviServer 來測試了。

這還給我另外一個啟示,如果我可以在 docker image 和 docker host 之間同步或者是共用資料,就表示我可以將使用環境與開發環境作一定程度的分離。之前知道可以這樣弄,但是沒有嘗試過,也許該測試一下。

2018-01-23

Tclunqlite v0.3.3

檔案放置網頁

Tclunqlite

About

This is the UnQLite extension for Tcl using the Tcl Extension Architecture (TEA).

UnQLite is a in-process software library which implements a self-contained, serverless, zero-configuration, transactional NoSQL (Key/Value store and Document-store) database engine. This extension provides an easy to use interface for accessing UnQLite database files from Tcl.

Main Change

  1. Update UnQLite version to 1.1.8

說明


這是一個小更新版本,更新 UnQLite 的版本。

2018-01-22

遷移與保存

SourceForge 很直接的將 CVS web 關掉,需要該計畫的管理者將 CVS 轉為 GIT 才行。

所以目前我建立的 RPM spec/build script 中,至少有三個會出現問題(因為只是快速檢查,所以我不確定是否有我沒檢查到的)。

三個的狀況都不相同。TclSOAP 1.6.7 使用 TclXML,而 CVS 的發展版本才是使用 tDom 的版本。如果 openSUSE  build service 我在上面有檔案,我會先暫時放檔案上去 github。

tktable 是比較新的版本 2.11 有可能會遺失,如果 openSUSE  build service 我在上面有檔案,我會先暫時放檔案上去 github。

TclVFS 已經遷移到 core.tcl.tk,所以需要使用 Fossil 來取得新版本並且更新內容。(無法順利 clone,要嘗試下載檔案以後處理的方式)

另外,tcl-dbus 也已經遷移(而且還刪除了所有的檔案),我暫時先把舊的檔案放到 github 上,有時間再處理。 (重建一次,嘗試下載檔案以後處理的方式)

ffidl

ffidl: Ffidl allows you to define Tcl/Tk extensions with pure Tcl wrappers calling any shared library installed on your system, including the Tcl and Tk core libraries.


ffidl-spec

openSUSE 上的是舊的,所以我把目前比較有更新的 ffidl 寫成一個 RPM spec,試著製作  RPM 以後安裝。ffidl.patch 參考 openSUSE 之前 spec 的寫法,讓 ffidl 在編譯的時候使用系統的 libffi,而不是自己編譯的。

我有放上去 openSUSE build service 上我自己的 projects,有順利編譯。

JSMin-Tcl

JSMin-Tcl


使用 Tcl 寫的 JavaScript minifier,我發現的時候覺得很有趣(一方面也是有點意外),FlightAware 居然用 Tcl 實作了一個自己版本的 JSMin。

2018-01-18

Apache Rivet 3.0 released

Apache Rivet 3.0 released

Nonetheless Rivet 3.0 ships with a major rewriting of mod_rivet, whose code has been redesigned into a modular architecture with the purpose to preserve the basic features of the 2.x series of modules but also to provide support for both non threaded Apache MPMs (Multi Process Module), such as mod_mpm_prefork, and threaded MPMs such as mod_mpm_worker, mod_mpm_event and mod_mpm_winnt. As a consequence mod_rivet now also can run with the Apache Web Server on the MS-Windows family of operative systems.

Threaded MPM integration was achieved by making mod_rivet multi-threaded and modular itself, introducing the MPM-module bridge concept. We developed a set of loadable modules which are supposed not only to overcome the issues related to threading but also the best possible MPM mod_rivet integration. As a side effect of this modular design mod_rivet is not only able to integrate with its environment but also to work as a framework for writing more MPM bridges designed along different multi-threading schemes and workload management models.

mod_rivet is built using the traditional autotools based toolchain but with version 3.0 we also are supporting a CMake based script that can be used on any OS where CMake is available. The CMake tool is necessary in order to build mod_rivet on MS-Windows



快速解釋一下狀況。如果只支援傳統的 perfork mode,那麼就無法與 HTTP/2 module 共用(因為 HTTP/2 module 與 perfork mode 並不相容)。

也就是如果要使用 Apache Httpd server + mod_http2 + Apache Rivet,Apache Rivet 必須支援其它的模式。這是個很重要的進展。


更新:
apache2-mod_rivet-spec

我在 local 端建立 RPM 的時候會在最後的 check test 階段失敗,所以 test 整段都被我拿掉了。經測試,在一個 Aapache Http Server + SSL + mod_http2 (使用 MPM_event)的環境下加入 Apache Rivet 3.0.0 跟之前的行為不同,是可以運作的,所以目前可以確定,使用 Apache mod_http2 與 Apache Rivet 搭配是可行的。

tclBlend, javah and JDK8

我在追蹤 Java 接下來的變化時,才發現 JDK 10 預計將會移除 javah

所以我對自己備份的 tclBlend 做了一些更動,主要是使用 javac -h 來產生 header file,然後移除掉 javah 的部份。不過這也表示,接下來的版本需要使用 JDK8 或者是更高的版本才行。

另外就是我在嘗試的過程中發現 file.toURL() 已經在 JDK6 被標記 deprecation,所以我也對這部份進行了小修改。

2018-01-10

yajl-tcl

yajl-tcl: Tcl bindings for Yet Another JSON Library


Ubuntu 我很快的就安裝成功了,openSUSE 則遇到一點問題。目前 openSUSE Leap 42.3 的 libyajl-devel 沒有包含 pkgconfig 的部份,需要使用有包進去的版本

寫好的 openSUSE RPM spec:
yajl-tcl-spec


會需要編譯是因為最新釋出的 TclWS (2.5.0) 有加這句話:yajl-tcl from flightaware github (only for rest-flavour requests)

所以更新完 tclws-spec 以後,我也建了一份 yajl-tcl spec(卡在 pkgconfig 的問題一段時間),只是如果有人需要的話,就可以直接建 RPM 然後使用。

2018-01-05

DiffUtilTcl

DiffUtilTcl: A Tcl extension for diff utility functions, like Longest Common Substring


Magicsplat Tcl/Tk for WindowsBAWT 都新增加了這個套件,所以我也寫了一個 openSUSE RPM spec,這樣可以建立 RPM 來測試。

連結:
tcl-DiffUtilTcl-spec

2018-01-04

tcl-cmark

tcl-cmark: Tcl bindings to the cmark-gfm GitHub Flavoured CommonMark/Markdown library


會引起我的再次注意是因為 Magicsplat Tcl/Tk for Windows 在新版中加入了這個套件。

這個套件需要先安裝 libcmark-gfm 才行。經過搜尋,openSUSE LEAP 42.3 看起來有 cmark 套件,我會研究一下是不是可以先安裝 cmark 套件以後編譯成功。如果可以,我會試著建立一個 tcl-cmark 的 openSUSE RPM spec。

更新:
看起來不行,檢查以後,TCLCMARK_LOCATE_CMARK 會檢查是否有安裝 libcmark-gfm,而二者的 library 名稱不同。所以如果要使用 tcl-cmark,需要先有 libcmark-gfm RPM spec 才行。

更新:
cmark-gfm 使用 release 的 0.28.0 會有 header 問題,需要 git clone 使用較新的 code 才行。