ID:???雑記サイト移転に伴い、AutoHotkey関係はこっちに書くことに。05:47:47新マウスジェスチャスクリプトとりあえず正式版ということにhttp://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zipジェスチャ認識部分のネタが尽きたので。テスト用に作った入力中のジェスチャをツールチップ表示する機能を、メニューから呼び出せるようにした。23:47:20設定GUIのプロトタイプiniファイルの仕様が固まったので、設定GUIも作ってみようかと考える。Gui,Add,Tabでタブ上にタブコントロールを配置できない。仕方ないので、メインタブ上にジェスチャ定義と動作割り当ての2つのタブを作ることに。ジェスチャ定義選択部分を複数作って同期するのが面倒だが、見た目はすっきりした。その他、色々あって以下のような感じになった。少なくとも、旧バージョンのGUIよりはマシだろう。これはこれで悪くないが、せっかく書きやすいように作ったiniファイル仕様が日の目を見なくなってしまうのは惜しい。iniファイルのフォーマットで定義情報をクリップボードやファイルにエクスポート・インポートする機能を付けてみたらどうか。掲示板とかでやりとりするときに便利そうである。そんなことしたがる人がいるかは疑問だが。23:50:40設定GUIのプロトタイプiniファイルの仕様が固まったので、設定GUIも作ってみようかと考える。Gui,Add,Tabでタブ上にタブコントロールを配置できない。仕方ないので、メインタブ上にジェスチャ定義と動作割り当ての2つのタブを作ることに。ジェスチャ定義選択部分を複数作って同期するのが面倒だが、見た目はすっきりした。その他、色々あって以下のような感じになった。少なくとも、旧バージョンのGUIよりはマシだろう。これはこれで悪くないが、せっかく書きやすいように作ったiniファイル仕様が日の目を見なくなってしまうのは惜しい。iniファイルのフォーマットで定義情報をクリップボードやファイルにエクスポート・インポートする機能を付けてみたらどうか。掲示板とかでやりとりするときに便利そうである。そんなことしたがる人がいるかは疑問だが。11:45:46設定GUIを作成(たぶん)http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip一応動作するようになったはず。GUIを作るのは死ぬほど面倒くさい。何百行ものコードを書かなくてはならない。項目を選択していないときは削除ボタンを押せないようにしておくなど、余計な気配りも必要となる。結果、スクリプトファイルは本体の4倍以上の34KBにもなってしまった。これだけの手間をかけて作っても、使い勝手はエディタでの直接編集と大差ない。見ても、骨折り損のくたびれもうけである。マウスでクリックしたウィンドウやコントロールのクラス名を取得する入力補助機能だけは便利である。個人的にはどうでもいい。してSendコマンドの引数などは自分で入力するしかないので、AutoHotkeyを知らない人にとっても役に立たない気がする。条件定義名やジェスチャパターンの重複なども防止していないので、後でなんとかしよう。22:56:50マウスジェスチャ2修正http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip初期状態で動作しないのとかを直したはず。半端だが、段々飽きてきた。19:39:35マウスジェスチャ2更新http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zip条件定義名とジェスチャパターンで、不正な入力を出来ないようにした。入力があるごとに不正な文字がないか、重複がないかをチェックして、確定ボタンの有効・無効を変更する。ジェスチャパターンの末尾から1ステップ分の操作を削除するボタンも追加。正規表現を利用することで、複数文字のボタン操作も簡単に削除できた。05:34:41いつも色々乙です。AHKについては初心者でスクリプトについても詳しく知らないので的外れなことを言ってたらスルーしてください。何も触れていない場合のパラメータを検知したら強制的にThumb_Deactivate()実行、みたいにしたら、既知の不具合の「ボタンの押しあげ操作が発生せず押しっぱなしになる」という不具合に対応できないかと思ったのですが。ツールバーボタンのコマンドIDを調べてSendMessageコマンドを作成する機能追加http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zipファイルダイアログの上フォルダコマンドと戻るコマンドを実行させたかったので作った。「入力」ボタンが押されたときにそのサブルーチンを実行するという機能を用意してあったので、それを使う。コマンドIDを調べる部分は、昔作ったスクリプトを適当につなぎ合わせたら動作した。19:42:32ディスプレイが2台になったので、旧マシンもVNCではなく直接操作したいと思い、1011puという得体の知れないタッチパッド付きキーボードを買ってきた。キーボードとポインティングデバイスがコンパクトなサイズにまとまっているので、必要なときだけ取り出して使うには丁度良いと思ったのである。ThumbRemapを使えるかと思ったが、対応するドライバが見つからない。SynapticsのもALPSのもGlidePointの奴も認識してくれない。仕方ないので、単に右シフトに右ボタンを割り当てることに。タッチパッドに触れてなくても動作するから、こっちの方が使いやすい。左ボタンは元から付いてるタップでいいや。修正とか改良http://lukewarm.s101.xrea.com/myscripts/MouseGesture2.zipオプション画面に色々とひどいバグがあったので修正した。8方向モードで斜めとみなす角度の範囲を設定可能に。デフォルトでは45度だが、60度にして斜めを認識しやすくしたり、90度にして斜めだけにしたりもできる。斜めストロークの後と縦横ストロークの後で斜めの範囲を変化させる機能も用意した。初回のみ8方向にしたり、斜めから開始したら斜めのみということも可能なはず。8方向モードは使っていないので、正直どうでもいいが。ユーティリティ関数として、マウスカーソルを移動する「MG_Move()」を用意した。CoordMode、SetMouseDelay、BlockInputなどを行いつつMouseMoveする。引数を省略すると、ジェスチャ開始位置に移動する。あと、初回起動時の処理を再び修正。初期状態で同梱されているMG_Config.ahkの中に、MG_Edit.ahkを呼び出すコードを入れることにした。これにより、色々と余計な物を削減できたはず。動作確認のためにジェスチャ文字列をそのまま表示していたので分かりにくかった。そこで、矢印で表示する機能も付けることに。Shift_JISには上下左右の矢印はあるが、斜めはなかった気がする。そこで、斜め矢印が存在するWingdingsという記号フォントを使う。よると、XPなら標準で入っているはずなので大丈夫だろう。Gui,Fontでこのフォントを指定しても、何故か0x80以上(?)の文字が正しく表示されない。仕方ないので、自分でデバイスコンテキストを取得して直接描画することに。なにやら文字の間隔なども設定できるらしい。押しているボタンによって文字色を変えて区別できるようにした。設定画面を作るのは面倒なので、拡張設定スクリプトに自分で記述する手抜き仕様。設定画面には、矢印ナビを使うかと、起動時からナビを有効化するかの設定のみ用意した。適当な作りだが、一応綺麗に表示されているようである。09:09:29ビデオカードにDVI-D端子が2つ有ることに気付いたので、デュアルモニターにしてみた。セカンドを上とか左に配置すると、マイナス座標の領域が生まれるんだな。モニターの設置位置の問題であまり使いやすくないので、とにかく多くのスペースが必要なときだけ使うことにする。適当に数行の変更で作れる簡易的な機能にした。「MG_Tooltip」という変数にテキストが入っていると、ジェスチャ文字列の代わりにそれが表示されるように。ジェスチャ入力が終了すると、MG_Tooltipの内容はクリアされる。閉じる系)のように、右ボタン押し下げから派生するアクションの説明を割り当てて使う。このスクリプトの仕様では、内容を読んでいる間にタイムアウトしてしまうが。SIDEとか言う店(キングケバブの向かい)で外付けのタッチパッドを見つけた。GlidePointって書いてあったからThumbRemap.ahkも動作するはずである。6000円以上もするしPS/2版しかなかったしそれほど欲しくもなかったのでスルー。23:27:43以前作ったコマンドラインランチャーに色々と不具合があることに気付いたが、行き当たりばったりに拡張していったせいで手の施しようが無くなっているので、作り直すことを考える。まともな拡張機構を用意して、ウィンドウやプロセス、テキストなども扱えるようにしたい。以下、現在までに挙がっているアイデア。└出力をターゲットリストに全ての状態遷移は、ホットキー/ローカルホットキーに割り当てる。アイテム確定、コマンド決定、実行など、複数の遷移を1キーに割り当てることも可能。Enterに割り当てる処理では、コマンド未指定時ターゲット種別に応じたデフォルトコマンドを実行。●候補リストの1位より入力内容を優先するモード候補リストで選択を行っていない場合、Enterなどで入力内容自体がターゲットとして確定する。Shift+Enterでは逆の動作になる。20:14:07マウスジェスチャ2、新規ボタン一発作成機能追加http://lukewarm.s101.xrea.com/myscripts/MouseGesture.html8つほどボタンが付いているマウスを手に入れたので、ボタン定義スクリプトを作成してジェスチャに使うことに。既存のボタン定義スクリプトをコピーして書き換えるのが思いの外面倒だったので、設定画面に作成補助機能を追加した。これで、マウスのドライバユーティリティで拡張ボタンに割り当てたキー名と、登録したいボタン名を入力するだけで、定義スクリプトを作成できるようになった。こんなマニアックな機能、使う人がいるかは疑問だが。20:14:14マウスジェスチャ2、新規ボタン一発作成機能追加http://lukewarm.s101.xrea.com/myscripts/MouseGesture.html8つほどボタンが付いているマウスを手に入れたので、ボタン定義スクリプトを作成してジェスチャに使うことに。既存のボタン定義スクリプトをコピーして書き換えるのが思いの外面倒だったので、設定画面に作成補助機能を追加した。これで、マウスのドライバユーティリティで拡張ボタンに割り当てたキー名と、登録したいボタン名を入力するだけで、定義スクリプトを作成できるようになった。こんなマニアックな機能、使う人がいるかは疑問だが。チルトとかのための機能を追加http://lukewarm.s101.xrea.com/myscripts/MouseGesture.htmlマウスの左右チルトにジェスチャを割り当てたい。従来の仕様では、ボタンを押している間中PostMessageし続けるというようなことが出来ない。そこで、トリガが放されるまでタイマーでジェスチャサブルーチンを呼び出し続けるMG_While()関数を追加した。トリガが放されたときに一度だけ別の動作を実行させたり、押し下げ・押し上げ時のみ実行する機能も付けた。この関数により、WM_HSCROLLを繰り返しPostMessageさせることで、チルト風の動作を実現できるようになった。「右ボタンを押しながらチルト」や「タイトルバー上でチルト」など、様々な操作にスクリプトを割り当てられる。設定の仕方が多少ややこしいが。04:06:49本体がv1.0.47.06になって、動的関数名による呼び出しが追加されたことで、>>96のモジュール機構が実現しやすくなりそうだ。不特定のスクリプトファイルを#Includeする方法がないと、設定スクリプトで動的にスクリプトを生成しなければならないことには変わりない。ワイルドカードによる一括#Includeなどが欲しいところだ。関数が存在しているかどうかのチェックも今の所用意されていないが、下記のようにすれば代用は出来そうだ。追加http://lukewarm.s101.xrea.com/myscripts/MouseGesture.html画面端はOrchisで使っているので自分では使わないだろうけど作ってみた。認識処理自体は、SysGetで画面サイズを取得し、タイマーでカーソル位置を監視するだけで出来た。画面端接触をボタンとして定義し、「画面上端でカーソルを左に移動」とか「画面左端で右クリック」という操作も定義できるように。その為、「画面端への接触」は接触した瞬間に発動する。一定時間触れ続けたときに発動させたければ、「MG_Timer()」を使えばいい。当初は、上下左右の各辺を任意の数に分割できるようにしようかと思ったが、4つ以上は誰も使わないだろうからやめた。分割数の設定自体を廃止してしまい、分割無し、2分割、3分割を共存させられるように。使いたい部分の定義モジュールを手動でMG_Buttonsフォルダに入れるようにした。これにより、「縦は2分割、横は3分割」のような使い方も可能に。角を使うときはその角に接している辺は使わないようにする必要がある。「各辺の中央1/3と角」のような使い方をしてもいい。そんな感じで、かなり適当な作りだが、どうせ自分では使わないので構うまい。画面端にカーソルを移動したときに操作したいウィンドウがしたにあるとは限らないため、アプリケーション別の割り当てには使いづらい。そもそも画面端という絶対的な存在によってアプリケーション別の動作という相対的な現象が起こるのはおかしいし、仕様が一貫していないと覚えにくいので、このままでいいだろう。カーソル下ウィンドウではなくアクティブウィンドウをターゲットにするオプションを追加http://lukewarm.s101.xrea.com/myscripts/MouseGesture.html一応付けた。ホイール操作やキーボード操作はアクティブウィンドウに送られるのが普通だから、こちらの仕様の方が一貫性という面では正しいような気もする。いうか、非アクティブなウィンドウがターゲットのとき、Sendが正しく動かない。ControlSendだと、プログラムのキー操作認識方法によっては動作しないし、困ったもんだ。スクロール機能追加http://lukewarm.s101.xrea.com/myscripts/MouseGesture.htmlIEのホイールクリックのやつみたいなのがあれば便利かもと思い作ってみた。ジェスチャ開始位置からの相対距離に応じてスクロールする。MG_While()と組み合わせて、ボタンを押している間繰り返し実行することで使う。IEの場合、ホイールボタンを放すことによって開始され、解除するのにもう一度クリックが必要だが、こちらはボタンを放せばすぐに停まるので使いやすいかも知れない。ついでに、JaneStyleのビューアとかにあるドラッグスクロールも作ってみた。WM_[H|V]SCROLLは、コントロールが定めた単位でスクロールするため、1単位とピクセルを正しく対応させるのが難しい。適当に1スクロール単位あたりに必要なピクセル数を指定するようにした。11:24:12違った、IEもホイール押しっぱなしでカーソルを移動すると押してる間だけスクロールする。ホイールだから押しづらいが。00:05:30「AutoHotkeyを廃れさせるページ」にて、JavaScriptベースのAutoHotkey風スクリプトユーティリティ「JHK」のテスト版を公開http://lukewarm.me.land.to/かねてからAutoHotkeyの行き当たりばったりに拡張されてきた言語仕様には辟易していたので、JavaScriptエンジンを利用してAutoHotkey風のツールを作ることに。SpiderMonkeyを使おうかと思ったが、なにやら面倒くさそうだったので、とりあえずWindowsScriptControlを使う。ホットキー割り当てとキー操作の送信などの機能を実装してみたところ、それなりに動作するようになった。スクリプトコントロールのリファレンスやサンプルが少なくて、エラー関連の動作などがよく分からずに困ったが、とりあえず何とかなった。ホットキーに動作を割り当てるスクリプトは、以下のような感じになる。JavaScriptなら、文字列から関数を生成することも可能なので、いくらでもラッパーを作って簡略化可能である。01:53:17JHKはエイプリルフールのネタである。ActiveX.ahkを使って、AutoHotkeyで実装した。19:21:35USBタッチパッドがまともな日本語パッケージで売り出されていたhttp://plusd.itmedia.co.jp/pcuser/articles/0806/19/news050.htmlので買ってきた。「ありそうでなかった」とか書いてあるが、普通に前からあったような気がする。今は無きUser'sSideとかで売ってた。キーボードの下に消しゴムを挟んで浮かせ、その隙間に本体上部の枠を挟んで設置。厚手の片手用パームレストを2つ買って、左右に設置した。スタンダードモデルだと少し幅が広すぎて、6とか7を押そうとすると親指の付け根がパームレストからはみ出して不安定な感じだ。ドライバはGlidePointとかいうやつ。ALPS社製のはずだが、以前作ったThumbRemap.ahkの奴とは作りが違うようだ。無くても別に困らないが、せっかくだからそのうち対応させよう。03:14:37ドライバをインストールすると設置する向きを変えられることに気付いた。領域端でのスクロール機能はちゃんと回転してくれない。これにより、左右パームレストの間隔を狭められると共に、ボタンが横に来るので親指でクリックできるようになる。ツリー/リストビューのヒットテストなどを追加http://lukewarm.s101.xrea.com/myscripts/MouseGesture.htmlツリービューやリストビュー上では、TVM_HITTESTやLVM_HITTESTで、指定座標がアイテムのどの部分かなどを調べられる。情報を構造体で受け渡す必要があるため、VirtualAllocEx()で対象プロセス上にメモリを確保した上でWriteProcessMemory()やReadProcessMemory()で操作しなければならず、非常に面倒くさい。自分では使わないので保留していたが、度々要望があったので、しかたなく実装することにした。ターゲットのプロセスIDを記録しておく必要が出てきたため、MG_PID変数を新たに追加した。他にはプライオリティの変更くらいしか使い道がなさそうだが。ターゲットウィンドウ・コントロールの位置サイズなどを得る関数を追加http://lukewarm.s101.xrea.com/myscripts/MouseGesture.html一つのウィンドウ上に同種のコントロールが複数存在するうちの片方だけにマッチする条件を作りたいときなどに使うかもしれない。そんな割り当てが必要になることがあるのかは謎だが。マウスカーソルを判別する機能を追加これにより、HTMLヘルプなどのIEコンポーネントでも、ホイールクリックで新規ウィンドウで開くを実現できたりするようになる。GetCursor()では自分のスレッドのカーソルしか取得できないが、AttachThreadInputを使う事で他のスレッドのカーソルハンドルを得られる。矢印などの標準カーソルのハンドルは、0x10011〜0x10029などの値で、複数の環境で同じ値だったので、とりあえず一定だと思う事にして、カスタム条件式のテンプレートとして用意した。あと、スクリプトの紹介ページを微妙に詳しくした。ターゲットプロセスのコマンドラインを取得するMG_CommandLine()を追加AutoHotkeyやJavaなど、ホストプログラムによって実行されるタイプのプログラムは、ウィンドウクラスや実行ファイル名がどれも一緒になってしまって判別に使えない。タイトルが不定だったり、他のプログラムと同じだったりすると、プログラムを見分ける手立てがない。そこで、コマンドラインによる条件判別を可能にする事に。他のプロセスのコマンドラインを取得するAPIは存在しない。何とかして対象プロセスからコマンドライン文字列を盗み出したい。当初は、フックを利用して関数を注入するとか、WriteProcessMemoryで機械語のコードを書き込んでCreateRemoteThread()で実行するとか、ややこしい方法しか思いつかず苦労したが、結局意外と簡単な方法で済んだ。実は、コマンドライン文字列が格納されているアドレスはどのプロセスでも一定で、GetCommandLineはそのアドレスを返しているだけなのである。格納アドレスはkernel32.dllのバージョンによって異なるようだが、GetCommandLineAのアドレスから機械語のMOV命令の分を飛ばしたアドレスを読めば取得可能である。自分のプロセス上で文字列の格納アドレスを調べ、「ReadProcessMemory」で対象プロセスの当該アドレスから文字列をコピーすれば、コマンドラインが得られる。最後のアドレスはプログラムによって違うので、ターゲットプロセス上から取得する必要があるのを見落としていた。06:49:07MouseGesture.ahkをWindowsVistaのUAC下で無理矢理使用する方法UACの一般権限では、管理者権限のプロセスをSendなどで操作できない。逆にAutoHotkeyのプロセスをが管理者権限で実行されている場合、MG_CommandLine()で一般プロセスのコマンドラインを取得できないなどの制限がある。両方の権限のプロセスで完全に動作するような気がする。ところで、Vistaでタスクマネージャを見てみたら、コマンドラインが普通に表示できるようになっていた。APIが追加されたのだろうか?こいつでも、権限の違うプロセスのコマンドラインは取得できないようだった。前から作ろうと思っていて放置していたものを作った。テキスト以外の任意のクリップボード形式を読み書きする関数群。ファイル名のリストをエクスプローラなどに貼り付けられる形式でコピーするために。エクスプローラやダイアログで開いているフォルダにファイルを送りたいときに使うかも。ファイルドロップ関数は、改行区切りで指定したファイル群をWM_DROPFILESで指定ウィンドウに送る。ウィンドウへのドラッグ&ドロップでしかファイルを受け付けないソフトなどに使用するかも。05:30:52MigemizeEverythingEverything(http://www.voidtools.com/)で無理矢理Migemo検索する。普通に変換した方が速い。マルチバイトに対応していないらしく、時々誤検出する。17:01:37はじめましてワードパッドのウインドウ上にあるボタンでフォントの色、サイズ、上線のつけはずしを操作するスクリプトを作りました。うまく動きませんでした。16:54:12120ですが、なんとか出来そうなので自分でやってみます。ありがとうございました。01:28:45120/121です。Hackerで無事できました。ありがとうございました。06:07:202chのAutoHotkeyスレにMouseGesture.ahkの質問が書かれていたのに、DION規制で書き込めなくて困る。誰か親切な人があと555モリタポほど恵んでくれれば、p2で書き込めるのだが。http://lukewarm.me.land.to/WSHとAutoHotkeyを気分によって使い分けるのに嫌気がさしたので作ることに。Firefoxで使われているJSAPIなる物を使う。JSAPIだけをビルドする方法が分からず、何故かFirefox全体をビルドする羽目に。出来上がったDLLがMSVCR90.DLLに依存していて、テスト用の環境で動作しない。Firefox3.1betaに同梱されていたDLLに差し替えたら起動出来た。DLL関数の呼び出しとコールバック関数の生成、メモリの確保・読み書き用の関数を作成。一部AutoHotkeyのソースを参考にした。EnumWindows関数を呼び出してコールバックを受け付け、可視ウィンドウのタイトルを出力するという処理が動作するようになった。JavaScriptは動的に関数を生成出来るので、いちいちラッパー関数を定義したりしなくても、普通の関数と同じ感覚で呼び出せるのが便利だ。Unicode対応でないAPIで日本語を扱うと文字化けする。JSAPIの内部文字コード(UTF-16)からANSI文字列への変換時に、Shift_JISではなくlatin-1として変換されている模様。修正箇所が多くて面倒くさいが、WideCharToMultiByteで変換するようにすれば解決するだろうか。00:30:56間違えて一日早く公開してしまったが、上記はエイプリルフールのネタなので本気にしないように。21:11:42とりあえずいくつかのバグ修正と文字列変換のマルチバイト対応化、JSAPIの構造体ポインタを取得する機能の追加、非コンソール版の作成を行っておいた。コマンドライン引数の取得やテキストの出力など、何から何まで自分で定義しなくてはならないが、使おうと思えば使えるはずである。17:56:35実行速度の比較。AutoHotkeyが1.0.48で大幅に高速化されたというので、SpiderMonkeyと比べてみた。無調整のSpiderMonkeyは6秒台、JITコンパイルを有効にしてGC自動実行を抑止したSpiderMonkeyが4秒台だった。1.0.48は確かにかなり高速化されている。A_Indexを使わずに別のカウンタ変数を使うなどの変更を行うと、すぐに4秒以上かかるようになってしまった。SpiderMonkeyでは、文字列として連結せずに配列にpush()するようにすると0.4秒程度になるなど、方法によっては桁違いに高速になる。04:59:34>>124をマルチスレッドに対応させるなどした。SpiderMonkeyをマルチスレッド対応させる上で主に注意すべきなのが、GCのタイミングであるらしい。あるスレッドが何かに使うためにオブジェクトを生成して、他から参照されている状態にする前に、他のスレッドでGCが実行されてしまうと、使うはずだったオブジェクトが解放されてしまう恐れがある。そこで、リクエストという仕組みで、スレッドがJSAPIの処理中であることを通知して、GCが発生しないようにしておく必要があるらしい。GCが必要になると、他の全てのスレッドのリクエストが完了/中断されてGC可能状態になるまで待ち合わせてから、GCが実行されるらしい。オブジェクトなどへのアクセスは、排他制御が行われるので、複数スレッド間で共有しても問題無いらしいが、共有オブジェクトへのアクセスが多発すると、待ち合わせが多発して効率は落ちるようだ。大体の仕組みが分かったので、まず既存のコードにJS_[Begin/End]Request()などの処理を追加した。次に、マルチスレッドでスクリプトを実行できるようにする。別途作成したJSAPIコンテキストを使い、新規スレッドで指定のスクリプトを実行するという関数を用意してみた。関数をネイティブコード側から呼べるようエクスポートする関数に、不特定多数のスレッドから呼ばれても大丈夫なようにする機能を追加。新規コンテキストを生成するコストが大きいため、従来方式と選択可能にした。前者はグローバルオブジェクトも新規作成するが、後者は元のコンテキストのグローバルオブジェクトをそのまま利用する。以前の1から60万までを文字列として連結する処理を2つのスレッドで実行させてみたところ、異様に遅くなった。両方のバージョンとも速度は大差ないので、問題なのはGCの待ち合わせのようだ。文字列やオブジェクトをあまり生成しないであろう素数探索処理を並列実行させたところ、シングルスレッドの時とほとんど同じ速度で実行された。(マルチコア環境なので)コンテキスト作成版と関数エクスポート版での速度差はあまり見られない。グローバルオブジェクトを共有すると、文字列やオブジェクトの操作時にも共有部分へのアクセスが発生して遅くなるかと思ったが、それほど問題にはならないようだ。関数エクスポート版では、グローバル変数や関数が生成されたスコープでの変数にも普通にアクセスできるので、利便性が高い。実際にマルチスレッド処理が必要になるのは、処理時間のかかるAPIの実行中に他の処理を行わせたい場合等だろうから、GCによる効率の低下はそれほど気にする必要はないだろう。してもそのような処理を並列実行させたい場合は、プロセス自体を並列化させればいい。12:56:46.NETFrameworkで作成されたアプリケーションのコンボボックスの選択値を取得する方法を知っている方がみえましたら教えてください。ControlGet関数でChoiceを使用しても値を取得できません。02:39:52「File.exists」か「File.exist」か迷って、検索して以下のページを見つけたtp://piro.sakura.ne.jp/latest/blosxom/topics/2008-10-08_naming.htmが、結局文字数の少なさを優先して、「has」「is」以外は原型にすることにした。08:27:08>>124を久しぶりに更新。ネイティブコード関数を呼び出したときに、GetLastError()の値を取得して例外を投げる機能を追加した。ラッパ関数の中で使われているJSAPI呼び出しでエラーコードがリセットされてしまうらしく、GetLastError()をラップしても役に立たないため。それと、>>131は、exist以外の例が思い浮かばないので、sをケチるのはやめてexistsにした。12:07:20>>124を更に更新。指定アドレスの64ビット整数を読み書きする機能を追加した。符号付きの64ビット整数の負の値を読み書きするのが面倒くさそうだったので。08:22:57去年、延々と人知れず作っていたスクリプトを公開してみる。>>124をまともに使えるようにするためのライブラリである。ng.exeのディレクトリにlibディレクトリを置いて、ng.jsに__NG__EvalFile(__NG__HostPath().replace(/([^\\]+)$/,"\\lib\\Base.ng"));と書き、その下にプログラムを記述すれば試せる。コマンドラインで与えられたスクリプトを読み込んで実行する部分とかは、そのうち実装する。prototype.jsのように、独自のクラス機構を中核としたライブラリになっている。インスタンスメソッドの他にクラスメソッドを登録でき、ミックスイン的なものによる多重継承のような感じの機能も搭載するなど、色々とややこしくなってしまった。ドキュメント的な物はまだ無いが、スクリプトの後ろの方を見れば、前の方で定義された機能がどんな感じのものかくらいはわかるかも知れない。06:19:45>>134にスクリプトファイルへの関連付け機能や、それなりのドキュメントなどを追加して、そこそこ実用的な感じにした。00:02:10http://lukewarm.me.land.to/を更新。スクリプトが最後に評価した値をプロセスの終了コードにするように。関数のインポート・エクスポートで、文字列系の型を廃止。GetLastError()の値を例外として投げる場合、関数の返値をプロパティとして得られるようにした。2005-10-08。