Xming for tcl

很早以前, 我請部門內一位超級優秀的同事 Sam 寫了一個 tcl 的程式, 幫助我們 config audio 輸出時的各種開關, 包括 codec 的總類, memory 的大小, Wall 還是放水等等. 這個工具用了好多年, 在 cygwin 底下運作都沒問題, 不過上了 Linux 之後, 遠端操作 tcl 就不能正常輸出畫面了. 由於 MakeConfig 也不需要常常改, 所以這個問題就被忽略了.

這幾天為了在新的 compiler server 上建立環境, 重新把這個問題檢查了一下. 原來只要支援 Xwindow 就可以讓畫面顯示出來.

不管是遇到

Application initialization failed: no display name and no DISPLAY environment variable
Error in startup script: no display name and no SDISPLAY environment variable

Application initialization failed: couldn’t connect to display “localhost:X.0″

Can’t open display

不認識 wm title….等等, 都可以用 Xwindow 解決.

基本上 Linux 系統都會支援 X window, 讓使用者可以透過 X server 使用鍵盤、滑鼠、和顯示設備. 但是對於遠端系統, 就需要 X forwarding (轉發). 因此. 我們首先就是要確定 server 開了 X11 forwarding.

在 /etc/ssh/shhd_config 裡面要有這行:

X11Forwarding yes

我們可以用 grep X11Forwarding /etc/ssh/sshd_config 來檢查此設定. 不過需要有 root 權限才能修改.

至於遠端、自己這一方 (local terminal), 我是用 putty, 因為 putty 本身也支援 X11 forwarding, 只要把這個選項打開, 上述的問題就會從 no display name 進化成 couldn’t connect. 呃, 問題還沒解決對吧!那就是該 Xming 登場的時候了.

從 X server forward 過來的畫面 (UI), 在 Windows 系統下要畫出來, 就是靠 Xming. 它可以在這裡下載:

http://sourceforge.net/projects/xming/

其實, Cygwin 本身就可以支援 X server, 可以參考這個 link.

Cygwin/X Frequently Asked Questions

至於 Xming 的用法,  討論的人很多. 請參考下面鏈結.

Xming + PuTTY 在Windows下远程Linux主机

Xming 簡易使用說明

使用 xming 從windows 系統登入 Linux 系統 

TCL 小筆記

昨天發現有隻 TCL 程式不 work 了, 可能是我們 Cygwin 版本不同, Isometry 改在他那邊可能是好的, 不過我這邊就掛了.為了解決這個問題, 只好 debug 一下為何它會有不同的表現.

關於 TCL 的說明, 這個網站真是做到仁至義盡了. http://tmml.sourceforge.net/doc/tcl/

如果大家隨便寫一個 script 檔, TCL 怎麼知道是該它處理呢? 如果您有灌 tclsh 就 OK 了. 此時只要在這個 script 前面加上一行

#!/usr/local/bin/tclsh

就可以了.

TCL 自己會去執行這個 script, 而不是交給 bash 之類的.

更好的寫法是

#!/bin/sh

# the next line restarts using tclsh \

exec tclsh “$0″ “$@"

這樣就不會出現 command not found 這樣的錯誤了. 因為不做一點 “暗記" 的話 TCL 是不會去處理每一個 script 的.

上述技巧見於 http://tmml.sourceforge.net/doc/tcl/tclsh.html

如果再 TCL 中建立了一個檔案, 又想要再 generate 一次, 將會遇到 archive = 1 的問題. 在 Windows 下有一個好用的 freeware 叫做 unlock, 用它可打掉這種檔案被程式 lock 的狀態. 我的兩台電腦都有裝.

不過在 TCL 之下, 如果不先把 file attributes 的 archive 設成 0, 就算用 file delete -force 都殺不掉它喔!

  

TCL 小心得

今天為了改一個 TCL 檔, 用了很多新的東西. 因為從來沒有從 TCL 的基本學起, 所以還是摸索了一下. 簡單整理今天遇到的困擾:

1. 最常出現的 bug:  把 if { …. } 寫成 if ( …. ), 常常一眼看不出來.

2. 對 list 的觀念不清. Parsing 到有花括號 { 的檔案, 用 lsearch, lreplace 都會出問題. 首先將 list 做 split

      set newlist [split $line]  

   這樣 line 裡面的 tab, {, 都會變成 list, 這個時候 newlist 就可以被 lsearch, lreplace 了

3. 但是從 split 過的 newlist 裡面找到的位置, 並不代表它在 line 裡面的位置. 不做 split 好像又不能 parse 有花括號的檔案. 所以我用了一個蠢方法. 第一道先 lsearch $newlist, 等到確定有我要的字串, 再改用 lsearch $line.

4. 十進位數字轉十六進位數字

   set hexspace [format %x $space]  

   但 TCL 並不會自動幫我們加 0x~ 以資區別. 所以我還是手動把它加上去.

   set space “0x"
   append space $hexspace

5. lrange 格式

   lrange $line 1 3  表示把第一個到第三個 element 都做成一個 list

   lreplace 類似 lrange 但多出一到多個 element, 取到代第一個到第三個

   若 lreplace first last …. 的 first < last 它就變成 insert 功\能

6. /t 表示 tab,  但 puts $File “tabc" 並不會印出 tab, puts $File t"abc" 才會

7. 該用 append 不要混淆成 lappend, 兩者不同

  append “a" “b" —> “ab"

  lappend “a" “b" —> “a {b}"

8 需要數學計算時用 expr, 如; set a [expr c * b], 這表示 a = c * b

大概就是這樣了. 有用的網址如下:

http://tmml.sourceforge.net/doc/tcl/

http://tmml.sourceforge.net/doc/tcl/keyword-index.html#KW-index 

http://www.dev.idv.tw:8080/mediawiki/index.php/Tcl%E7%9A%84%E8%AE%8A%E6%95%B8%E4%BB%8B%E7%B4%B9 TCL 的變數介紹

反正書到用時方恨少, 只要程式寫得出來就不想買書了,寫不出來的時候就會想 “下班先去買書"….