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-30

tclmonetdb v0.9.8

Homepage

tclmonetdb

About

MonetDB is an open source column-oriented database management system developed at the Centrum Wiskunde & Informatica (CWI) in the Netherlands.

MonetDB excessively uses main memory for processing, but does not require that all data fit in the available physical memory. To handle a dataset that exceeds the available physical memory, MonetDB does not (only) rely on the available swap space, but (also) uses memory-mapped files to exploit disk storage beyond the swap space as virtual memory.

tclmonetdb is a Tcl extension by using MAPI library to connect MonetDB.

一些說明

  1. Add more string to monetdbSuffixes, for Mar2018 version

這是一個 for MonetDB Mar2018 更新的版本。

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 是比較推薦的寫法,所以我搞不懂為什麼會加這個檢查)