2010年4月2日金曜日

Tcl ビットマスク処理する

hex2binで16進数を4桁の2進数へ変換する

proc ANDMask args {
    set data [hex2bin [lindex $args 0]]
    set mask [hex2bin [lindex $args 1]]
    set maskLength [string length $mask]

    set dataList [splitRange $data $maskLength]
    set result ""
   
    foreach buffer $dataList {
        for {set index 0} {$index < $maskLength} {incr index} {
            set dataBit [string range $buffer $index $index]
            set maskBit [string range $mask $index $index]

            #マスク対象のデータがなくなったら終了
            if {[string length $dataBit] != 0} {
                append result [expr $dataBit && $maskBit]
            } else {break}
            #puts "DEBUG dataBit:$dataBit maskBit:$maskBit result:[string range $result end end]"
        }
    }

    return [bin2hex $result]
}

proc ORMask args {
    set data [hex2bin [lindex $args 0]]
    set mask [hex2bin [lindex $args 1]]
    set maskLength [string length $mask]

    set dataList [splitRange $data $maskLength]
    set result ""
   
    foreach buffer $dataList {
        for {set index 0} {$index < $maskLength} {incr index} {
            set dataBit [string range $buffer $index $index]
            set maskBit [string range $mask $index $index]

            #マスク対象のデータがなくなったら終了
            if {[string length $dataBit] != 0} {
                append result [expr $dataBit || $maskBit]
            } else {break}
            #puts "DEBUG dataBit:$dataBit maskBit:$maskBit result:[string range $result end end]"
        }
    }

    return [bin2hex $result]
}

2010年3月29日月曜日

VBA 選択したセルに1から順に番号を入れる

Sub 選択したセルに1から順に番号を入れる()
    Count = 1
    For Each buf In Selection.Cells
        buf.Value = Count
        Count = Count + 1
    Next
End Sub

tcl 文字列を指定した長さでリストで返す

proc splitRange args {
    set userString [lindex $args 0]
    set range      [lindex $args 1]
    set bufferList {}
   
    if {[llength $args] != 2} {
        puts "wrong # args: should be \"splitRange string range\""; return
    }
    if {$range <= 0} {
        puts "wrong # arg : range should be over 0"
        return}
   
    for {set idx 0} {$idx < [string length $userString]} {set idx [expr $idx + $range]} {
        set lastIdx [expr $idx + $range -1]
        lappend bufferList [string range $userString $idx $lastIdx]
    }
    return $bufferList
}

2010年3月21日日曜日

TclでTeratermを使うためのパッケージ ver0.1

フォルダ名「teraterm」をlibに置き、そのフォルダにいか2つのをおく。

pkgIndex.tcl
package ifneeded teraterm 0.1 [list source [file join $dir teraterm.tcl]]

teraterm.tcl
package require Tcl
package require Tk
package provide teraterm 0.1

namespace eval ::teraterm {
    variable ttmacro "C:/Program Files/teraterm/ttpmacro.exe"

    namespace export ttstart selectMacro
   
}

proc teraterm::ttstart {macro args} {
    variable ttmacro
   
    set cmd ""
    #exec以下の要素を \" で囲むと解釈できる
    #
    append cmd "\"" $ttmacro "\"" " "
    append cmd "\"" $macro "\"" " "
   
    foreach i $args {
        append cmd "\"" $i "\"" " "
        }
    set param [string range $cmd 0 end-1]

    return [catch {eval exec $cmd}]
   
}

proc teraterm::selectMacro {} {
    set fileTypeList {
        {{Teraterm macro} {.ttl}}
    }
   
    set filePath [tk_getOpenFile -filetypes $fileTypeList]
    if {$filePath eq ""} {set filePath ""}
   
    return $filePath
}

2010年3月20日土曜日

eclipse で tcl

preadesからJREなしのeclipse3.4(プラットフォームだけ)をダウンロード。
EMF(Coreのみ)をダウンロード
DLTKのコアとTclをダウンロード

eclipseをいれたら、
dropinsフォルダに下にeclipseという名前のフォルダを作って、
EMFのfeaturesとpluginsを格納する。
同じeclipseフォルダにDLTKコアとTclのfeaturesとpluginsを入れておく。
eclipse を cleanオプション指定して起動する。

Tclを実行するにはインタプリタが必要。
ActiveStateからActiveTclをダウンロードしてインストールしておく。
また、デバッグ用ツールもActiveStateにあるのでこれもダウンロードしてインストールしておく。
(デバッグ用ツールのダウンロードページはeclipseでTclデバッグ設定する箇所にリンクがあるのでそこから行ける)

以上のことがうまく行けば、eclipseでTclが使えます。
ブレークポイント指定すれば止めることができるし、変数の中身も見える。
(デバッグパースペクティブ)

ややこしいのはEMFやDLTKをeclipseに追加するところ。
解凍したものをただ既存のfeatures,pluginsフォルダにコピーしても
うまく認識できなかった。(わたしがやった場合で)
今回はアーカイブされてたものを展開してeclipse以下にコピーするやり方をしました。
ソフトウェア更新でオンラインでやらなかったのは、プロキシによって通らないケースを前提にしていたからです。

TkもSWTみたいにできるようになったらいいな。

2010年2月17日水曜日

前使ってたブログ

これ
http://blogs.yahoo.co.jp/kei_tnk4649

ASEでPython ファイルを開いてみた

以下のスクリプトを実行した。


f = open('log.txt', 'a')
try:
    f.wirte('hello, world.\n')
except Exception, e:
    f.write(str(e) + ' : Error \r\n')
finally:
    f.close()

そしたらエラーが発生した。
IOError: [Errno 30] Read-only file system: 'log.txt'
というメッセージが出力された。

ファイルに残せないなんてorz

始めました

Bloggerに引っ越してきました。
前はYahoo!ブログにいました(幽霊部員でした)

Androidを持ってからというもの、
Googleさんにお世話になりっぱなしな私です。
(リーダー、GMail、カレンダーは特に)

ここにはしばらくはAndroid Scripting Environment(ASE)をPythonで使った時の
メモとかサンプルスクリプトとかを書いていくつもりです。
あとAndroidについても。
たまにTclとかTeratermマクロとかについても書くかも。

以上です。宜しくお願い致します。