1 名前:デフォルトの名無しさん mailto:sage [2007/05/01(火) 14:52:44 ] 【英語サイト】 プロジェクト本拠地 tcl.sourceforge.net/ 最新版ソースコード ftp://ftp.tcl.tk/pub/tcl/nightly-cvs/ The Tcler's Wiki wiki.tcl.tk/ The comp.lang.tcl Newsgroup groups.google.com/group/comp.lang.tcl/ ActiveTcl www.activestate.com/products/activetcl/ 【日本語サイト】 もっとTcl/Tk www.interq.or.jp/japan/s-imai/tcltk/ Tcl/Tk Scripting Laboratory www.geocities.jp/urano343/tcltk.html Tcl/Tk Primer mibai.tec.u-ryukyu.ac.jp/~oshiro/Doc/tcltk_primer/ Tcl 8.4.1 Manual Command Reference www.freesoftnet.co.jp/tclkits/doc/TclCmdRef/tcl_contents_jp.htm CategoryTclTk - mynote reddog.s35.xrea.com/wiki/CategoryTclTk.html 【前スレ】 ●●●●TCL/TKなら俺に聞け●●●● pc11.2ch.net/test/read.cgi/tech/1033628416/
807 名前:デフォルトの名無しさん [2011/11/27(日) 12:50:30.83 ] ゲームでキャラを移動させるような場合、bindを用いてカーソルキーで操作すると キーボードのオートリピート機能のせいで、動き始めた直後に一瞬動きが止まります。 スムーズに動くようにするにはどうしたら良いのでしょうか?
808 名前:デフォルトの名無しさん mailto:sage [2011/11/28(月) 00:52:09.92 ] inp(0), inp(1)
809 名前:デフォルトの名無しさん mailto:sage [2011/11/29(火) 00:48:45.31 ] >>807 簡単なテストコード見せて
810 名前:デフォルトの名無しさん mailto:sage [2011/11/29(火) 18:09:48.11 ] >>809 wm geometry . 500x500 canvas .c -bg white pack .c -expand 1 -fill both .c create oval 230 230 270 270 -fill red bind . <KeyPress-Up> {.c move 1 0 -3} bind . <KeyPress-Down> {.c move 1 0 3} bind . <KeyPress-Right> {.c move 1 3 0} bind . <KeyPress-Left> {.c move 1 -3 0} キー入力の判定だけC言語で書いて、 例えばWindowsならWindows APIを利用するようにすれば解決すると思います でも、Tclだけで解決する方法はないのでしょうか?
811 名前:デフォルトの名無しさん mailto:sage [2011/11/29(火) 22:33:47.99 ] ググってみたけどこんな方法しかないような wm geometry . 500x500 canvas .c -bg white pack .c -expand 1 -fill both .c create oval 230 230 270 270 -fill red set moveto "" bind . <KeyPress-Up> {set moveto "up"} bind . <KeyPress-Down> {set moveto "down"} bind . <KeyPress-Right> {set moveto "right"} bind . <KeyPress-Left> {set moveto "left"} bind . <KeyRelease> {set moveto ""} proc move {} { global moveto switch $moveto { up { .c move 1 0 -3 } down { .c move 1 0 3 } right { .c move 1 3 0 } left { .c move 1 -3 0 } } after 10 move } after 10 move 方向を一つの変数でまとめてるけど方向別にすれば斜め移動も出来る
812 名前:デフォルトの名無しさん mailto:sage [2011/11/30(水) 00:27:19.26 ] >>810 どういうゲームかわからないけど、イベントループを自分で管理するべき。 そして、そのイベントループの中で、KeyPressで動かしはじめて、 KeyReleaseが来るまで動かし続ける。簡単には>>811 みたいな。 ちゃんとしたゲームしたいならasteroids.tclが参考になると思う。→wiki.tcl.tk/13601
813 名前:デフォルトの名無しさん [2011/11/30(水) 12:06:12.14 ] カーソルキーを押しっぱなしにすると ずっとKeyPressのままってわけじゃない。 KeyPressとKeyReleaseが交互に発生する。 だからそれは全然アドバイスになってない。
814 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 10:45:21.56 ] wm geometry . 500x500 canvas .c -bg white pack .c -expand 1 -fill both .c create oval 230 230 270 270 -fill red array set direction { n 0 s 0 e 0 w 0 } set delta 3 bind . <KeyPress-Up> {set direction(n) 1} bind . <KeyPress-Down> {set direction(s) 1} bind . <KeyPress-Right> {set direction(e) 1} bind . <KeyPress-Left> {set direction(w) 1} bind . <KeyRelease-Up> {set direction(n) 0} bind . <KeyRelease-Down> {set direction(s) 0} bind . <KeyRelease-Right> {set direction(e) 0} bind . <KeyRelease-Left> {set direction(w) 0} proc move {} { global direction delta if {$direction(n)} {.c move 1 0 -$delta} if {$direction(s)} {.c move 1 0 +$delta} if {$direction(e)} {.c move 1 +$delta 0} if {$direction(w)} {.c move 1 -$delta 0} after 10 move } move
815 名前:デフォルトの名無しさん mailto:sage [2011/12/01(木) 13:31:06.09 ] >>813 普通はそうならない。 コントロールパッド本体に連射機能がついてるとかならあり得るかもしれないけど。
816 名前:デフォルトの名無しさん [2011/12/01(木) 21:21:12.29 ] >>815 いや、Tkのキーバインドだとキーボードのキーリピートが働いてしまう。 メモ帳とかに文字を入力する時、たとえば"a"を押しっぱなしにすると、 "a"が一つ表示された後、少し間を置いてaが連続して入力されるだろ。 あれと同じことが起こる。 下のサンプルを動かしてごらん set x "" pack [label .t -textvariable x] bind . <KeyPress-a> {append x 1; update} bind . <KeyRelease-a> {append x 0; update}
817 名前:816 mailto:sage [2011/12/01(木) 21:35:31.25 ] このサンプルを動かして、aを押しっぱなしにしたら 1と0が交互に表示されるはず。 そうならなかったらよっぽど特殊なキーボードを使ってるんだろう。
818 名前:デフォルトの名無しさん mailto:sage [2011/12/02(金) 11:26:05.96 ] 連射機能付きJOYstickだろ
819 名前:デフォルトの名無しさん mailto:sage [2011/12/02(金) 15:07:54.99 ] >>816 ,817 そのコード片を試したわけでないので何だが、 通常、キーを押しっぱなしにすると KeyPress/KeyDownは複数飛んでくるが KeyReleaseは離したときに1回飛んでくるだけじゃないのかね。
820 名前:デフォルトの名無しさん [2011/12/02(金) 19:29:43.54 ] 試さないで何言ってる
821 名前:デフォルトの名無しさん mailto:sage [2011/12/02(金) 21:14:48.05 ] >>819 なぜテストしなかったの? コードを走らせてみれば一目瞭然なのに。 少なくとも俺の環境では>>816-817 の言う通りになったけど。 で、>>811 や>>814 のようにループで処理するとなめらかに動くのは なぜか適度にKeyReleaseが無視されているからだとわかった。 それを確認するには下の2つのコードを動かしてみればいい。 ループがあるとほとんどグリーンの円のみが現れるが、 ループが無いとグリーンとレッドの円が交互に現れる。 # ループを通した例 wm geometry . 500x500 canvas .c -bg white pack .c -expand 1 -fill both bind . <KeyPress-a> {.c create oval 0 245 10 255 -fill green -tags en} bind . <KeyRelease-a> {.c create oval 0 245 10 255 -fill red -tags en} proc main {} { .c move en 3 0 update after 10 main } main #ループ無し wm geometry . 500x500 canvas .c -bg white pack .c -expand 1 -fill both bind . <KeyPress-a> {.c create oval 0 245 10 255 -fill green -tags en; .c move en 3 0; puts 0} bind . <KeyRelease-a> {.c create oval 0 245 10 255 -fill red -tags en;.c move en 3 0; puts 1}
822 名前:デフォルトの名無しさん mailto:sage [2011/12/02(金) 23:24:20.45 ] >>821 ループ無し i.imgur.com/byFnN.png
823 名前:デフォルトの名無しさん mailto:sage [2011/12/02(金) 23:50:43.04 ] ループ無し ozcircle.net/_uploader/60860336 俺の環境ではこの通り
824 名前:デフォルトの名無しさん mailto:sage [2011/12/03(土) 10:24:08.91 ] だから〜環境依存の問題の臭いがしてるのに、 バージョンもOSも書かずに「俺の環境」じゃ 誰もこれ以上何もできんだろ
825 名前:デフォルトの名無しさん mailto:sage [2011/12/03(土) 11:50:49.20 ] >>824 Windows7とWindowsXPとLinux Mint 11で確認済 というか、そうならない環境が例外だと思われる
826 名前:825 mailto:sage [2011/12/03(土) 11:54:22.55 ] Tclのバージョンは8.4と8.5で試したが、結果は同じ
827 名前:本田 [2011/12/04(日) 21:44:12.75 ] >>825 もし同じPCでテストしてるなら。 BIOSが同じだから結果が同じ可能性がある。
828 名前:デフォルトの名無しさん mailto:sage [2011/12/04(日) 21:57:17.27 ] >>827 俺も試してみたけど>>823 みたいになった。 3台のPCでテストしたんだけど変わらない。 ってことは環境依存だとしても、そういうのって結構多いんじゃない?
829 名前:本田 [2011/12/04(日) 23:25:19.71 ] キーのリピート速度と遅延時間を設定するには www.atmarkit.co.jp/flinux/rensai/linuxtips/052keyrepert.html 同じキーを押し続けると、そのキーが連続で入力できる。 連続で入力される速度を「リピート速度」、キーを押してからリピートを開始するまでの時間を「遅延時間」と呼ぶ。 キーのリピート速度と遅延時間は、kbdrateコマンドで変更できる。 オプションを何も指定しないでkbdrateコマンドを実行すると、リピート速度が10.9cps(1秒当たり10.9文字)に、遅延時間が250ミリ秒(ms)に設定される。 これが、Linuxのデフォルトの数値だ。 使用可能なオプションは、-s、-r、-dだ。
830 名前:本田 [2011/12/04(日) 23:52:04.88 ] キー・リピート (key repeat) www.atmarkit.co.jp/icd/root/32/5785932.html キーを押したままにしたときに、連続的にそのキーが繰り返し入力されたように扱うしくみ。 一般的には、キーが押し下げられてから、キー・リピート処理が開始されるまでの間隔と、 リピート間隔(連続的にキー入力を発生させる際の時間間隔)を設定できる。
831 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 23:44:17.05 ] >>814 >>815 のものですが、>>810 を見て、てっきりWindowsの話と思ってました。 これが答えになるんじゃないでしょうか。 X Window SystemではオートリピートでPress/Releaseが交互に発生するらしいです。 goo.gl/q3zCD Windowsでなるという人いないはずだよね?
832 名前:デフォルトの名無しさん mailto:sage [2011/12/05(月) 23:57:02.19 ] あと、確認の仕方は以下で十分です。 bind . <KeyPress> {puts KeyPress} bind . <KeyRelease> {puts KeyRelease} console show
833 名前:デフォルトの名無しさん [2011/12/06(火) 10:23:09.00 ] WindowsのオートリピートってX Windowと挙動が違うの? オートリピートなんてみんな同じだと思ってた
834 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 21:17:09.62 ] X Windowって言うな
835 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 21:57:13.95 ] >>834 いみふ
836 名前:デフォルトの名無しさん mailto:sage [2011/12/06(火) 22:04:04.24 ] X Windowsというと嫌がる人ってのは見たことあるけどな X Windowだったら単純にSystemを省略しただけだから何が悪いのかわけわからん
837 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 00:27:18.67 ] >>835 , >>836 同感。
838 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 07:30:17.47 ] ま、開発元は嫌がってるけどね。
839 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 15:53:36.77 ] 略すなら X のみだろ常考
840 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 17:55:46.65 ] X Windowsでいいよ 呼び方なんぞどうでもいい
841 名前:デフォルトの名無しさん [2011/12/07(水) 19:52:34.30 ] tclvfsってどんなもので、どう使えばいいんでしょうか? 意外と情報が少ないし、たまたま見つけたサンプルコードのほとんどがまともに動かないんですけど。
842 名前:デフォルトの名無しさん [2011/12/07(水) 20:00:14.15 ] SX-Windowでいい。 国産だし。
843 名前:デフォルトの名無しさん mailto:sage [2011/12/07(水) 20:06:01.06 ] zipとかjarみたいなもんだと勝手に想像 freewrapみたいなものを自前で実装とか
844 名前:デフォルトの名無しさん mailto:sage [2011/12/08(木) 11:07:43.09 ] >>841 Starkit/Starpack, TclApp, freewrapはtclvfsを使って単一ファイル内にディレクトリ階層を持った複数のファイルを格納してる。 例えばTkSQLiteというフリーソフトがあるけど、あのEXE配布バージョンはStarpackで作られてるので(たぶん)、 package require vfs::mk4 vfs::mk4::Mount tksqlite.exe t glob -directory t * vfs::unmount t とかやると中身が見れる。 ここでtは仮想的なディレクトリの名前になってるので、 set ch [open t/tksqlite.tcl] puts [read $ch] close $ch とかやればファイルが読めるし、 file copy hoge.tcl t/hoge.tcl とかやればファイルを追加できる。 自分でVFSを作ることもできる。 vfs::mk4::Mount new.vfs t file mkdir t/subdir set ch [open t/subdir/hoge.txt w] close $ch vfs::unmount t 他にもftpディレクトリをローカルファイルシステムのように扱うvfs::ftpとかいろいろあるみたいだけど使ったことはない。
845 名前:本田 [2011/12/08(木) 23:16:45.72 ] >>841 Practical Programming in Tcl and Tk, 4th ed beedub.com/book/4th/ beedub.com/book/4th/Starkit.pdf beedub.com/book/4th/welch_examples.zip
846 名前:デフォルトの名無しさん [2011/12/10(土) 07:15:51.33 ] tclで'A'という文字からアスキーコード65を得るには、どうやればいいでしょうか?
847 名前:デフォルトの名無しさん mailto:sage [2011/12/10(土) 12:04:09.29 ] >>846 binary scan "A" c val puts $val
848 名前:デフォルトの名無しさん [2011/12/10(土) 13:17:19.43 ] >>847 ありがとうございます
849 名前:本田 [2011/12/17(土) 12:06:21.27 ] Graphics with TCL/TK www.youtube.com/watch?v=hHFOFefE1YM
850 名前:デフォルトの名無しさん [2011/12/24(土) 12:21:45.17 ] toplevelで作ったウィンドウを手で動かしてから、 wm withdrawで非表示にし、wm deiconifyで再表示させると、 最初に作られた位置に出現します。 (厳密に言うとそれよりちょっと右下) Tkの仕様なのかウィンドウマネージャの仕様なのか、 消えた時の位置に再表示されるのが自然だと思うんですが。 それともやり方が間違ってるんだろうか? 環境: Tk 8.4 Soralis 10 CDE 1.6.3
851 名前:デフォルトの名無しさん mailto:sage [2012/01/03(火) 19:11:53.53 ] >>5 さすがだねw
852 名前:デフォルトの名無しさん mailto:sage [2012/01/22(日) 19:54:12.53 ] 書けない?
853 名前:デフォルトの名無しさん mailto:sage [2012/01/22(日) 19:54:41.21 ] あれ、書けた。あけおめ。
854 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 22:24:24.34 BE:30017423-2BP(1250)] ネタがなにも無くて暇だ
855 名前:デフォルトの名無しさん mailto:sage [2012/02/01(水) 23:51:44.54 ] 850には答えてやんないの?
856 名前:デフォルトの名無しさん mailto:sage [2012/02/02(木) 00:46:23.97 ] >>855 だってTk8.4もう使ってないし、CDEも使ったこと無いし、 Sorarisの環境も無いし、ウィンドウマネージャーのせいな気がするから、 環境が無いと確認のしようがないし、
857 名前:デフォルトの名無しさん mailto:sage [2012/02/04(土) 13:14:29.62 ] 850です。 ですよねぇ〜。 仕事のマシンで環境いじれないし、 Tcl/Tkなんて(自分以外)ほとんど使ってないからなぁー。
858 名前:デフォルトの名無しさん mailto:sage [2012/02/13(月) 21:11:55.61 ] Tclは実行前にバイトコードにコンパイルされ、高速化が図られていると、説明されています。 することにもよると思いますが、bash,perl,ruby,pythonと比べると速さはどうなんでしょう? プログラムミング未経験者の、素朴な疑問です。
859 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 11:52:16.55 ] >850 Windowsでは消えた場所に戻るからウィンドウマネージャの仕様だと思う。 無理やり戻すしかない。 namespace eval GeometryMemory { variable geometry array set geometry {} } proc GeometryMemory::install {t} { bind $t <Unmap> {GeometryMemory::save %W} bind $t <Map> {GeometryMemory::recover %W} } proc GeometryMemory::save {t} { variable geometry set geometry($t) [wm geometry $t] } proc GeometryMemory::recover {t} { variable geometry if {[info exists geometry($t)]} { wm geometry $t $geometry($t) array unset geometry $t } }
860 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 11:53:14.60 ] テストスクリプト proc GeometryMemory::test {t} { toplevel $t GeometryMemory::install $t update puts "0: [wm geometry $t]" wm withdraw $t update puts "1: [wm geometry $t]" wm geometry $t +0+0 update puts "2: [wm geometry $t]" wm deiconify $t update puts "3: [wm geometry $t]" } GeometryMemory::test .t console show
861 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 15:59:53.47 ] >>858 Tclは最近のベンチマークサイトからは仲間外れにされてることが多いのでなかなか比較が見つからないけど、 比較的新しいサイトを見つけました。 goo.gl/6vXhj ちょっと信じがたい感じもしますが、ここによると Perl5 >> PHP > Ruby = Python2 >> Python3 >> Tcl みたいな感じですね。Tcl 8.4.19ですけど、8.5では劇的な速度向上はなかったと思うので、 大して変わらんのに対し、Rubyは1.9でかなり速くなったらしいので、 最新版で比べるとさらに分が悪い感じがします。 bashは、、、汎用言語といえるのかなあ。
862 名前:デフォルトの名無しさん mailto:sage [2012/02/22(水) 21:44:55.73 ] >>861 レスもらえてうれしいです。そのうえ的確なサイト紹介です。 速さとか実行速度で検索していたのですが、ベンチマークという言葉が思い当たらず、適当なサイトが見つかりませんでした。 このサイトを見て驚いたのは、Perlの速さとJava・Luaの遅さですね。また、C++は最速と思っていました。 やはり、プログラムの内容でしょうか? >Test code grows text string by adding another string in cycle until it grows up to 4 mb. 恥ずかしながら英語も全然ですのでよく分かりませんが、このベンチマークは文字列操作に該当するのでしょうか? LL言語は文字列操作が得意と説明されていますよね。 bashも入れたのは、私が試したいのが次のような内容で、キーボードでの打鍵数を調べたいのです。 1 英文字で100万字の普通の文書を、#,=等の記号も含めてアルファベット順に何文字あるのかカウントする。 2 少し複雑で、日本語で100万文字をローマ字入力したと解釈させカウントする。 2のケースは条件があります。 a 小さな'つ'の扱いです。リナックスはrinukkusuとkが2つ、アップルはappuruとpが2つとします。 b んの扱い。例えば安心は、ansinnと'ん'のあとがナ行以外なら1文字ですみますが、それ以外の'ん'は2文字必要です。 c 最後にちゃ、ちゅ、ちょはcha,chu,choと、しゃ、しゅ、しょはsha,shu,shoとすることです。
863 名前:862 mailto:sage [2012/02/22(水) 21:45:49.12 ] カウントする方法がプログラムと言えるのか、shellとかawkでも可能かどうかさえ分かりません。 このスレに書き込んだのは、今からtcl/tkの勉強を始めようと思い、実際のところを知りたかったからです。 tclshがあってインタラクティブに使え、tkでGUIも簡単に扱える、そのうえクロスプラットフォームという魅力から、 tclが多言語に比べて遅くてもよかったのです。BSDで作ったフレームがWindowsで開くまではしました。 eltclshというものを見つけました。簡単なパスとコマンドの補完ができます。 tclshではプロンプトにpwdをだせますが(改行して2行表示はできない)、eltclshではプロンプトの修正が今の私にはできません。 eltclshを改良して意地でもログインシェルにしたいと思っています。 なぜ、tclshはログインシェルになりえなかったのでしょう。 長文ついでに>>861 さんにもう一度感謝をのべよう。 tclの復権を願って、これで書き逃げさせていただきます。
864 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 00:13:15.78 ] >>859 さんくすです。 おっしゃるとおり結局は,消す前に位置を保存して, 再表示した後で位置をもどすということで解決はしましたが, なんかすっきりしなかったんですよね。
865 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 19:38:26.78 ] >>862 ベンチマークの内容は"abcd____________"という文字列がひたすらつながった4MB+alphaの文字列が1つの変数に格納されるというものです。 なんかベンチマーク用にあえて死ぬほど非効率な方法で実装されていますが、同じ結果を得たいだけなら100ms以下でできる方法があるので もうちょっと妥当なスクリプトだったらと思います。まあ、それでも負けてるのでしょうが。。。 862さんが作ろうとしているものはKAKASIという漢字->ローマ字変換プログラムを使って、いったんすべてASCIIにしてから処理するのがいいと思います。 goo.gl/EJYi その上で、bashよりもTclを使うメリットは、連想配列があることです。 ただ、連想配列を持つ言語はほかにいくらでもあるので、PerlでもRubyでも好きな言語を使えばいいと思います。 またbashではできないということでもないです。 bashやzshが気に入られてるのは補完機能などが充実してるからではないですかね。
866 名前:デフォルトの名無しさん mailto:sage [2012/02/24(金) 20:51:13.77 ] スクローラブルなウィンドウ(キャンバスウィンドウとか)内のアイテムを<B1-Motion>でドラッグ するときに、ウィンドウの端あたりまでドラッグしていくとその先の方向へスクロールしてくれる ようなのを実装したいんですが、参考になるコードスニペットないでしょうか?
867 名前:デフォルトの名無しさん mailto:sage [2012/02/25(土) 00:04:22.73 ] >>865 さん 全米が泣いた。 リナックスの世界へ案内しよう kakasi -Ha -Ja -Ka < test.txt rinakkusunosekaiheannaishiyou いろいろ試したのですが、案内のnが一つ少ないほかは完璧でした。 デフォルトがヘボン式なので、意図どおりです。感謝申し上げます。 打鍵数調べに速さは関係ありませんが、tclは8.4から最新バージョンだと、 20%くらい速くなっていそうですね。 news.mynavi.jp/news/2007/12/21/027/index.html
868 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 15:49:05.74 ] >>867 パフォーマンスに関しては、一概には言えないんですよね。 wiki.tcl.tk/1611 wiki.tcl.tk/1616 総合成績では8.4が一番優秀だったりします。 私も速度は必要なくて、乗り換えの動機はライブラリが 8.4をサポートしなくなり始めてるということぐらいなんですが。
869 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 21:11:00.69 ] lassign命だから8.4は愛せない
870 名前:デフォルトの名無しさん mailto:sage [2012/02/28(火) 22:45:08.87 ] 8.5最強伝説 - dictで連想配列の値渡最強 - dictはarrayより最速 - 無間桁計算で国家予算もらくらく計算 - clock addで日付計算最強 - clock formatで和暦がでるんだぜ! - in 演算子がめちゃ楽最高 - switch正規表現比較が無敵 - lindex $list end-1とか書けちゃう柔軟さ - {*}って知ってる?eval(失笑)ww 8.6最凶伝説(審議中) - バイトコードエンジン再実装!速いのか!? - try {} catch {} finally {} やっと使える!やっとか! - coroutine って何に使うんですかあ? - ooって結局どうなの。incr tcl ngの方がいいんじゃ・・・ -
871 名前:デフォルトの名無しさん [2012/02/29(水) 16:09:13.53 ] >>861 試験したTCLのソースをみると単純な文字列置換に"regsub"函数を使っている 、ここを定石とおりに"string match"函数に置き換えると何百倍も速くなった。 (我輩の旧式機械で源リストを実行するとトンでもないことになるが、置き換えるとまともになる。) tclは8版から劇的に速くなったが、正規表現まわりは遅いまま。 その事情を知って意図的に弱点を突いてきたようだ。
872 名前:861 mailto:sage [2012/02/29(水) 17:54:06.76 ] >>871 テストの趣旨を無視したバージョン time { set str "abcdefghefghefgh" regsub -all {efgh} $str ____ str set imax [expr {1024/[string length $str]*1024*4}] set gstr [string repeat $str [expr {$imax+1000}]] } #=>4334 microseconds per iteration 少しは尊重する姿勢を見せてるバージョン time { set str "abcdefghefghefgh" set imax [expr {1024/[string length $str]*1024*4}] set gstr [string repeat $str [expr {$imax+1000}]] regsub -all {efgh} $gstr ____ gstr } #=>114467 microseconds per iteration 5ms以下で終わる内容をあえてCore i5で10分以上かける方法でやるなんて ばかばかしいよね。
873 名前:871 [2012/02/29(水) 23:28:59.71 ] tcl関係者はtcl 7.4->tcl8.1 で「劇速した」と云ったが ユーザーは「yes except正規表現」と云っていた。 マニュアルも気合が入っていない項目と馬鹿丁寧な項目が入り混じっているし。 良くも悪くも、ちぐはぐが多いみたいだ。好き嫌いは激しかろう。
874 名前:本田 [2012/03/04(日) 23:41:21.56 ] downloads.activestate.com/ActiveTcl/releases/8.4.19.6/ downloads.activestate.com/ActiveTcl/releases/8.4.19.6/ActiveTcl8.4.19.6.295590-html.tar.gz downloads.activestate.com/ActiveTcl/releases/8.4.19.6/ActiveTcl8.4.19.6.295590-linux-ix86.tar.gz downloads.activestate.com/ActiveTcl/releases/8.4.19.6/ActiveTcl8.4.19.6.295590-linux-x86_64.tar.gz downloads.activestate.com/ActiveTcl/releases/8.4.19.6/ActiveTcl8.4.19.6.295590-macosx-universal-threaded.dmg downloads.activestate.com/ActiveTcl/releases/8.4.19.6/ActiveTcl8.4.19.6.295590-win32-ix86-threaded.exe downloads.activestate.com/ActiveTcl/releases/8.4.19.6/ActiveTcl8.4.19.6.295590-win32-x86_64-threaded.exe downloads.activestate.com/ActiveTcl/releases/8.4.19.6/MD5SUM downloads.activestate.com/ActiveTcl/releases/8.4.19.6/SHA256SUM
875 名前:本田 [2012/03/04(日) 23:44:36.35 ] downloads.activestate.com/ActiveTcl/releases/8.5.11.1/ downloads.activestate.com/ActiveTcl/releases/8.5.11.1/ActiveTcl8.5.11.1.295590-html.tar.gz downloads.activestate.com/ActiveTcl/releases/8.5.11.1/ActiveTcl8.5.11.1.295590-linux-ix86-threaded.tar.gz downloads.activestate.com/ActiveTcl/releases/8.5.11.1/ActiveTcl8.5.11.1.295590-linux-x86_64-threaded.tar.gz downloads.activestate.com/ActiveTcl/releases/8.5.11.1/ActiveTcl8.5.11.1.295590-macosx10.5-i386-x86_64-threaded.dmg downloads.activestate.com/ActiveTcl/releases/8.5.11.1/ActiveTcl8.5.11.1.295590-win32-ix86-threaded.exe downloads.activestate.com/ActiveTcl/releases/8.5.11.1/ActiveTcl8.5.11.1.295590-win32-x86_64-threaded.exe downloads.activestate.com/ActiveTcl/releases/8.5.11.1/MD5SUM downloads.activestate.com/ActiveTcl/releases/8.5.11.1/SHA256SUM
876 名前:本田 [2012/03/04(日) 23:47:21.25 ] downloads.activestate.com/ActiveTcl/releases/8.6.0.0b7/ downloads.activestate.com/ActiveTcl/releases/8.6.0.0b7/ActiveTcl8.6.0.0b7.295590-html.tar.gz downloads.activestate.com/ActiveTcl/releases/8.6.0.0b7/ActiveTcl8.6.0.0b7.295590-linux-ix86-threaded.tar.gz downloads.activestate.com/ActiveTcl/releases/8.6.0.0b7/ActiveTcl8.6.0.0b7.295590-linux-x86_64-threaded.tar.gz downloads.activestate.com/ActiveTcl/releases/8.6.0.0b7/ActiveTcl8.6.0.0b7.295590-macosx10.5-i386-x86_64-threaded.dmg downloads.activestate.com/ActiveTcl/releases/8.6.0.0b7/ActiveTcl8.6.0.0b7.295590-win32-ix86-threaded.exe downloads.activestate.com/ActiveTcl/releases/8.6.0.0b7/ActiveTcl8.6.0.0b7.295590-win32-x86_64-threaded.exe downloads.activestate.com/ActiveTcl/releases/8.6.0.0b7/MD5SUM downloads.activestate.com/ActiveTcl/releases/8.6.0.0b7/SHA256SUM
877 名前:デフォルトの名無しさん mailto:sage [2012/03/07(水) 20:28:21.05 ] TclでCのstatic宣言みたいなのができるとありがたいです。 いい方法はないでしょうか? たとえば,プロシージャの中で,呼ばれた回数に依存した処理をするような場合, 下のように,global変数をインクリメントしたりしてますが, 他のglobal変数とぶつかったりしないか心配で,夜も眠れません。 namespaceだと大げさになりそうで。 proc foo {} { global bar if [info exists bar] { incr bar } else { set bar 1 } # 呼ばれた回数に依存する処理 }
878 名前:デフォルトの名無しさん mailto:sage [2012/03/07(水) 22:30:41.71 ] >>877 ttp://wiki.tcl.tk/1532 の下から二番目のスニペットとか。
879 名前:本田 [2012/03/07(水) 23:08:53.76 ] >>877 singleton application wiki.tcl.tk/1558
880 名前:デフォルトの名無しさん mailto:sage [2012/03/09(金) 20:33:11.94 ] >>878 >>879 おふた方ともありがとうございます。 やっぱりそんな簡単にはいかないですね。 それにしても反応早すぎw
881 名前:デフォルトの名無しさん mailto:sage [2012/03/10(土) 11:07:27.49 ] 間違えた。 速すぎ。
882 名前:デフォルトの名無しさん mailto:sage [2012/03/14(水) 18:44:21.69 ] >>877 namespace大げさではけど、使いづらいとは思う。 もともと[incr Tcl]を取り込んだという割には、 名前空間付きの変数を作るitcl::scopeに相当するコマンドがなかったり、 プロシージャは見えるのに変数はvariableなしでは見れなかったりというのが使いづらい。
883 名前:882 mailto:sage [2012/03/14(水) 18:45:23.25 ] x 大げさではけど o 大げさではないけど
884 名前:デフォルトの名無しさん [2012/04/16(月) 17:32:28.78 ] tk_getOpenFile でショートカット指すとホンモノの名前が返ってきて読むとき便利だけど、ショートカット入ってたディレクトリーがどこだかわからない。どうすりゃ判るの?
885 名前:デフォルトの名無しさん [2012/04/17(火) 11:23:18.41 ] tk_getOpenFileはショートカット(.lnk)ファイルそのものを返すことはできない。 Tkの組み込みコマンドなのでスクリプトで改造もできない。 OSネイティブのきれいなダイアログじゃなくてよければ可能。 ::tk::dialog::file:: open tk_getOpenFileコマンドがないときに使われる古いダイアログみたい。 詳しくは以下参照。 $::tk_library/tk.tcl $::tk_library/tkfbox.tcl
886 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 11:28:02.15 ] >>884 wiki.tcl.tk/1060
887 名前:デフォルトの名無しさん [2012/04/17(火) 21:42:15.41 ] >>885 >>886 884です。貴重なコメントありがとうございます。 いずれにしてもかなり敷居が高そうですね。 取り敢えずは回避策を軸に考えます。
888 名前:デフォルトの名無しさん mailto:sage [2012/04/26(木) 15:47:16.82 ] >>887 全然敷居高くないよ。単に見た目が違うのを我慢してと言ってるだけ。 ::tk::dialog::file:: open というコマンドは、tk_getOpenFileと同じオプションを指定できるから オプションは同じでコマンドだけ置き換えればおk
889 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 21:23:39.21 ] jim.tcl.tk/index.html/doc/www/www/index.html Tcl8.6 のサブセットの Jim Tcl、本体は 8 ビットクリーンなのですが、内蔵ラインエディタが悪さしてシェル上での日本語入力を通しません。 それで、以下のようにしてその内蔵ラインエディタを外せばシェル上でも日本語を受け付けるようになります (CP932 でエスケープ文字と 2 バイト目が重なるようなものも、波かっこで挟んでエスケープ処理を抑制すれば入れられます)。 ./configure --utf8 --disable-lineedit utf8 のフォーマットに合う場合だけ utf8 として処理し、それ以外は単に 1 文字 8 ビットの文字列として処理します。Tcl8.6 の CVS 版に先 駆け、1 文字が 5 バイト長の utf8 文字列も取り扱えます。 なお、configure の処理実体が Tcl コードのため、そのままでのコンパイルには別の Tcl が必要です。 www.hecl.org/ Tcl 似の超コンパクトな言語 Hecl の方も、内蔵のラインエディタ jLine が日本語入力の邪魔をしているようですが、こちらは完全に組み込 まれているので、ソース自体の書き換えが必要になります (この理由で、jLine を外せば問題が解決するかどうかまでは試していません)。
890 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 23:32:02.54 ] configureがtclだと、、、?マジカヨ、、
891 名前:デフォルトの名無しさん [2012/05/04(金) 10:40:49.18 ] >>888 884です。ご教唆ありがとう。これで読むとショートカットは尻に".lnk"が付いているので区別できるようですね。 次はショートカット・ファイルからリンク先を取り出す方法に格闘します。
892 名前:デフォルトの名無しさん mailto:sage [2012/05/05(土) 00:53:02.81 ] >>891 ずいぶん難しいことしてるね。 Windowsのショートカットファイルはバイナリフォーマットだから自力で解析するよりtwapiを使うのがよいと思うよ。 goo.gl/9D9tI
893 名前:デフォルトの名無しさん [2012/05/06(日) 16:30:46.62 ] >>892 884です。何から何まで ありがとうございます。 尻が".lnk"のファイルは twapi::read_shortcut でホンモノの名前を白状させることができました。 お蔭様で、見掛けはしょぼく 中身が立派なスクリプトができました。
894 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 09:00:26.16 ] ここ読んでる人たちはEDA関連の人たちが多いんだろうなー
895 名前:デフォルトの名無しさん mailto:sage [2012/05/18(金) 22:51:20.91 ] 64bit用のtcl8.5のtcom.dllどこかにないでしょうか tcl8.6 64bit用のtcom.dllは見つけたのですが・・・ ↓ ttp://www.tin-pot.coco.mydisk.se/ tcomはソースがあるから何とかなりそうだけど、コンパイルやったことない。。。 twapiが代わりになるけど、こっちはExcelとかのオブジェクトを自動でに開放してくれない(´・ω・`) どなたか手段わかりませんでしょうか
896 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 00:05:40.60 ] おれもWindows7 64ビットにしたとき、 Tclも64ビットライブラリで作り直したかったけど、 依存する奴全部揃えられなくて諦めた。 まあ64ビットにしないといけないアプリじゃなかったし。 で、tcomみたいなOFFICEアプリ?とかを操作するのに 64ビットじゃないといけないの?答えになってないが。
897 名前:デフォルトの名無しさん mailto:sage [2012/05/19(土) 01:56:01.60 ] >>896 まあ、office操作自体は確かに64bitにする必要がないんです とあるソフトに32bit版と64bit版があって、 これにそれぞれ32bitと64bitのtclが組み込まれていているんですが、 自分が32bitで動くスクリプトを作った後に、 それをそのまま64bitに持っていったらdllの問題で組み込めなかった・・・ 悔しい。 という話です。。 64bitのPCに32bitのそのソフトをインストールすれば動作自体はするのですが。
898 名前:デフォルトの名無しさん mailto:sage [2012/05/25(金) 16:17:21.15 ] >>861 のベンチマークはちょっと変えるとTclが圧倒的に速くなるよ。 [Ruby1.9.3] + str=str.gsub(/efgh/, "____") gstr+=str; - gstr=gstr.gsub(/efgh/, "____") exec.tm.sec str.length 2sec 256kb 略) 395sec 3840kb 455sec 4096kb [Tcl8.5.11] + regsub -all {efgh} $str ____ str append gstr $str; - regsub -all {efgh} $gstr ____ gstr exec.tm.sec str.length 0sec 256kb 略) 0sec 3840kb 0sec 4096kb
899 名前:デフォルトの名無しさん mailto:sage [2012/06/17(日) 21:24:30.09 ] ジオメトリーマネージャ(pack, grid, place)の働きが イマイチよくわかりません。通り一遍のことはぐぐれば わかりますが、ちょっと凝ったことをしようとすると どれを選んでどういったオプションを指定すればよいか いつも迷ってしまいます。 何かこうスッキリわかりやすく解説してくれてるとこって ないですかね。書物は、この手のものはたいてい 高額なのでちょっと手が出ないかな。。。
900 名前:デフォルトの名無しさん mailto:sage [2012/06/18(月) 07:52:40.33 ] >>899 僕も最初はあいまいなまま結果オーライで使ってたけど、Ruby/Tkの本が丁寧な解説で役立ったよ。 Rubyを256倍使うための本・界道編 goo.gl/YuZuF
901 名前:デフォルトの名無しさん mailto:sage [2012/06/18(月) 09:01:28.10 ] ┌─┐ │●│ └─┤ _ ∩ ( ゚∀゚)彡 ┌─┬⊂彡 │●│ おっぱい!おっぱい! └─┘
902 名前:デフォルトの名無しさん mailto:sage [2012/06/18(月) 22:46:47.84 ] >>900 256倍シリーズってまだあったんですね。 確かにあれはわかりやすいかも。 Rubyは盲点でした。
903 名前:デフォルトの名無しさん mailto:sage [2012/06/19(火) 06:41:21.59 ] grid最強 pack, placeは後方互換用と思ってよい …とtkdocsのサイトには書いてあった www.tkdocs.com/tutorial/grid.html
904 名前:デフォルトの名無しさん mailto:sage [2012/06/19(火) 19:32:26.30 ] >>903 packはともかくplaceは置き換えられない部分があると思うなあ。 右上とか右下にくっついて動くロゴみたいなのはgridだとかえって難しい気がする。 gridのコマ割り考えるのも結構面倒。
905 名前:デフォルトの名無しさん mailto:sage [2012/06/19(火) 22:00:48.41 ] pack,place,gridだけで配置するより、ある程度区切ったらframeを乗せて その中で個別にpack,place,grid使って配置した方が楽
906 名前:デフォルトの名無しさん mailto:sage [2012/06/19(火) 22:03:34.92 ] placeはゲームのようなドット単位で指定したりするときに便利。 俺はTkでそういうのを作る機会がなかったので使ったことがないけど。 gridが全てにおいて万能というわけでもない。
907 名前:デフォルトの名無しさん mailto:sage [2012/06/20(水) 14:33:31.82 ] place使ってプログレスバーを作ってる例ならあるよ。Ruby/Tkだけど。 www.dumbo.ai.kyutech.ac.jp/~nagai/RubyTk/?%A4%BD%A4%CE%C2%BE%A4%CE%A5%B5%A5%F3%A5%D7%A5%EB%A5%B9%A5%AF%A5%EA%A5%D7%A5%C8