2017-06-28

Tcl/Tk and ActiveMQ

ActiveMQ: Cross Language Clients and Protocols


網頁下面有使用的範例,其中 Tcl/Tk 的部份有二個,一個是支援 STOMP 協定的 tstomp 套件,一個則是利用 Tcl/Java 來呼叫 Java API。因為有簡單的使用範例,所以我想有需要的時候可以用來參考。


* 另外,ActiveMQ 有支援 MQTT,所以 Tcl MQTT client 可以用來測試是否可以執行,或者是使用我包裝 Paho MQTT C Client 的 Tcl extension tcl.mqttc

2017-06-17

執行程式並且取得標準輸出的結果

set var [list ls -l]
catch {exec {*}$var} result

set lines [split $result "\n"]
foreach line $lines {
    if {[string index $line 0] == "d"} {
        puts $line
    }
}

只是用來練習的程式。使用 exec 來執行程式 (ls -l),取得結果以後再來處理。

2017-06-14

Using Nashorn from Java code (TclBlend version)

package require java

java::import javax.script.ScriptEngine
java::import javax.script.ScriptEngineManager
java::import javax.script.ScriptException

set manager [java::new ScriptEngineManager]
set nashorn [$manager getEngineByName "nashorn"]
set value [$nashorn eval "10 + 20"]
puts "Result: [$value toString]"

Nashorn 是使用 Java 寫的 JavaScript runtime,for Java 8 使用。目前支援的規範是 ECMAScript 5.1。

這裡透過 Nashorn 來執行 JavaScript code。我只是使用 TclBlend 執行 sample code 測試看看。

2017-06-13

apply

set twice {{f v} {apply $f [apply $f $v]}}
set f {{v} {return [expr $v + 5]}}

puts [apply $twice $f 10]

這只是在說明,你可以將匿名函數的內容設給一個變數,然後使用 apply 來呼叫。

2017-06-05

tclhttpd-markdown

tclhttpd-markdown


Tcllib 在 1.18 中 提供了 Markdown 套件,可以將 Markdown 格式轉換為 HTML 的工具。為了檢視這個套件目前的情況,所以作了一個簡略的 TclHttpd 支援。如果是 *.md 檔案,就使用 Tcllib Markdown 套件進行轉換,然後傳回 UTF-8 編碼的 HTML。

我想使用其它的 Markdown 轉換工具應該也是可以,只要修改轉換的部份和提供正確的 package require 就可以才對。

2017-06-04

Apache Tomcat, CGI and Tcl

最近使用 Apache Tomcat 在測試一些東西,所以同時也測試一下如何設定 CGI 以執行 Tcl CGI scrpits 的設定。

預設中 CGI 是 disable 的。在 Apache Tomcat 下使用 Tcl 來撰寫 CGI 程式,需要設定 conf/web.xml 與 conf/context.xml。 可以參考 Apache Tomcat 的文件

首先要設定 web.xml,開啟 CGIServlet 的支援,並且設定執行的程式。 如果是修改 conf/web.xml,那效果是全域性的。如果修改 WEB-INF/web.xml,就只侷限在你的 web application。
    <servlet>
        <servlet-name>cgi</servlet-name>
        <servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
        <init-param>
          <param-name>cgiPathPrefix</param-name>
          <param-value>WEB-INF/cgi</param-value>
        </init-param>
        <init-param>
          <param-name>executable</param-name>
          <param-value>/usr/bin/tclsh</param-value>
        </init-param>        
        <load-on-startup>5</load-on-startup>
    </servlet>

與 URL mapping:
    <servlet-mapping>
        <servlet-name>cgi</servlet-name>
        <url-pattern>/cgi-bin/*</url-pattern>
    </servlet-mapping>

再來是 context.xml,設定 Context 的 privileged 屬性為 true(但是要注意,這樣的更改是全域設定):
<Context privileged="true">

在 webapps/ROOT/WEB-INF 目錄中建立一個新的目錄 cgi。 接下來將我們的 Tcl CGI script 放在 cgi 目錄就可以了。舉例來說,如果是 hello.tcl,網址就是:
http://localhost:8080/cgi-bin/hello.tcl

如果不要在根目錄,舉例來說,可以在 webapps 下建立一個目錄 myapp,myapp 目錄下再建立一個目錄 WEB-INF, 然後 WEB-INF 目錄下再建立目錄 cgi。

接下來將我們的 Tcl CGI script 放在 cgi 目錄,如果正確設定就可以執行。舉例來說,如果是 hello.tcl,網址就是:
http://localhost:8080/myapp/cgi-bin/hello.tcl