すごい質問を見つけた(と、UWSC用モールス・スクリプト)

UWSC公式掲示板ですごい質問を見つけた。
質問者さんには悪いと思うけど、あまりにあまりなので、私の受けた衝撃を書きたいと思う。
あと、おまけで最後に、UWSCでモールス信号を解釈するジョーク・スクリプトをつけた。
モールス信号の練習をしたい方はどうぞ!(笑)



問題の質問

VB.NETからuwscのexeを呼び出して、パラメータ2つintegerを受け取りたいのですが、ファイルの書き出しとかしないで受け取る方法。
VB.NET側も良くわからず調査してませんが、まずuwsc側はどうかと思い、お聞きします。
プログラム上でのパラメータ受け渡しが出来れば一番良いのですが、難しそうなので(少し調べたが良くわからないので)クリップボード等の様にどんなアプリでも使用出来そうなメモリはないものかと思いお聞きします。(クリップボードは他に使用するので、今回は使用出来ません。) 


ま、普通の人にはよく判らないと思うので、少し改変します。

トライアスロンに参加して、完走したいのですが、競技用自転車を買う方法。
泳ぎ方も良くわからず調査してませんが、まず自転車はどうかと思い、お聞きします。
Web通販で買えれば一番良いのですが、難しそうなので(少し調べたが良くわからないので)百貨店の様にどんな自転車でも売ってそうな店はないものかと思いお聞きします。(近くの百貨店は自転車を扱ってないので、今回は使用出来ません。)


、、、どうですか。私の受けた衝撃、判ってもらえました?
泳ぎ方もわからないのに、トライアスロン、、、。
そして聞くのは、自転車の買い方。
確かに、街の自転車屋さんでは売ってないかもしれないけど、専門店やWeb通販で買えるよっ。
どこをどう調べたんだよ。
ってか、自転車買えても解決しないでしょ、、、泳げないじゃん、、、。
いや、センスが良くて問題にならないのかもしれなけいど、、、。
答える気力がなくなりまする。

ところでなぜ質問に答えるか?

一文の得にもならないのにね。
いや、得になるからです。私の場合ですが

  • 素晴らしいソフトを作成されたumiumiさんの力になれる(ような気がする)
  • 自分も興味ある(技術的に調べてみたい)
  • 質問者さんに喜んでもらえるのが嬉しい(回答後、お礼がないと寂しい、、、)

この辺ですね。


今回のケースをあてはめると

  • umiumiさんの力にはなりたい!(+1)
  • 技術的に興味を持つことはない(答えは簡単)(0)
  • 質問者さんのゴールは遠い(-1)

、、、答える気力は0になってしまいました、、、。

小言

体言止めかよ!

投げやりな感じをあたえるから、質問では避けましょう。

「お聞きします」って、、、

なんか微妙なんですよね、、、。
しかも二回連続。
もうちょっと、うっと思う人が出ない聞き方が良いと思います。
「教えてください」とか丁寧にしたいなら「お教え願います」とか。

夢は大きくても質問は小さく

ピンポイントで聞いた方が、答えはつきやすいですよ。

ということで今回の質問は

こうだったら、答えがつきやすかったかも。

VB.NETからuwscのexeを呼び出して、パラメータ2つintegerを受け取る方法を教えてください。
ファイル経由やクリップボード経由でない方法を探しているのですが、ちょっとわかりませんでした。
よろしくお願いします。

まあこれでも、調査が足らんだろ、という気はしますが。
また、受け取るのがUWSCスクリプト側なのか、VB.NETのアプリなのか不明です、、、。

ちなみに回答

禁止事項は、ファイルとクリップボードだよね。
一杯あるねぇ。

簡単に思いつく系

コマンドライン引数で渡す(起動側(VB.NET)->起動された側(UWSC))
リターンコードに詰め込む(起動された側(UWSC)->起動側(VB.NET))
受け渡し用ウインドウに書く

Windows機能使用系

グローバルアトム、名前付きパイプ、DLL共有、Windowsメッセージ、メールスロット、イベント、、、

メモリ領域系

メモリマップドファイル、RAM DISK(AWE APIとか)

ループバック通信系

TCP/IPバーチャルCOM、、、

最早何したいの系

MSGBOXを出しておき、押された秒数を利用する。
MSGBOXを出しておき、モールス信号として解釈する。
MSGBOXをYES/NOで出しておき、固定長2進数として解釈する。
HTTPサーバーを立て、そこが受け渡し値を管理し、UWSCIEオブジェクトでアクセスする。


大量ですよ!選り取り見取り。
検証は一切してないけど、DLL作っちゃだめ、という制約はないからどれでも可能なはず。
(多分、ほとんど作らなくてもいけるはずだけど)


最後のなんか、ロマンすら感じますね。
しかも受け渡し先の端末の物理位置にも縛られない。
案外素晴らしいかもしれない(インターネット接続必須になるけど)
GAEを使えば、無料でできるし。


他に何かあったかなぁ?



おまけ、UWSCでモールス信号スクリプト

モールスI/F用スクリプトです(笑)
Sendはその場でLeftClickしてしまうので、注意が必要。
Receiveは、MSGBOXをOKするまで受信するので、LeftClickはOKボタン以外でどうぞ。
(画面のどこをクリックしても、反応しちゃいます)


慣れないとなかなか上手く打てないですね。
懐かしいなぁ。


morse.uws

OPTION EXPLICIT


IFB GET_UWSC_NAME = "morse.uws" THEN
	DIM s = MSGBOX("Receive(YES) Send(NO) End(CANCEL)", BTN_YES OR BTN_NO OR BTN_CANCEL)
	DIM b = ""
	SELECT s
		CASE BTN_YES
			THREAD Morse.ReceiveThread(TRUE)
			MSGBOX("Morse")
			Morse.StopReceiveThread()
		CASE BTN_NO
			WHILE b <> EMPTY
				IF LENGTH(b) THEN Morse.Send(b)
				b = INPUT("Send data")
			WEND
		DEFAULT
			// nop
	SELEND
ENDIF


MODULE Morse

	// モールス受信スレッド用
	DIM _loop = TRUE
	// モールス受信内容
	DIM _receive = ""
	// 単語区切り
	DIM _separator = " "
	// 短点長さ(msec)、長点は短点*3、文字間隔は短点*3、語間隔は短点*7
	DIM _term = 100	// 人間用には100msecがおすすめ。40msecが限界かも
	DIM _s = _term * 0.001
	DIM _l = _term * 0.003
	DIM _w = _term * 0.004
	// 設定変更用
	DIM _change = FALSE
	DIM _timeOut = 500
	// 使用ボタン
	DIM _receiveBtn = VK_LBUTTON
	DIM _sendBtn = LEFT

	// モールス符号テーブル
	HASHTBL _table
	// 逆変換用テーブル
	HASHTBL _tableSend

	PROCEDURE Morse
		// モールス符号テーブルの登録。短点は「.」長点は「-// 数字の略体テーブル
		_table[".-"] = 1
		_table["..-"] = 2
		_table["...-"] = 3
		_table["....-"] = 4
		_table["....."] = 5
		_table["-...."] = 6
		_table["-..."] = 7
		_table["-.."] = 8
		_table["-."] = 9
		_table["-"] = 0

		// 逆変換用テーブルの作成
		DIM i, m = LENGTH(_table) - 1
		FOR i = 0 TO m
			_tableSend[_table[i, HASH_VAL]] = _table[i, HASH_KEY]
		NEXT
	FEND


	PROCEDURE Send(msg)
		DIM i, m = LENGTH(msg)
		FOR i = 1 TO m
			DIM b = COPY(msg, i, 1)
			IFB _tableSend[b, HASH_EXISTS] THEN
				PrivateSend(_tableSend[b])
			ELSEIF b = _separator THEN
				SLEEP(_w)
			ELSE
				PRINT "Send unknown: " + b
			ENDIF
		NEXT
	FEND
	PROCEDURE PrivateSend(msg)
		DIM i, m = LENGTH(msg)
		FOR i = 1 TO m
			DIM b = COPY(msg, i, 1)
			SELECT b
				CASE "."
					BTN(_sendBtn, DOWN)
					SLEEP(_s)
					BTN(_sendBtn, UP)
				CASE "-"
					BTN(_sendBtn, DOWN)
					SLEEP(_l)
					BTN(_sendBtn, UP)
				DEFAULT
					PRINT "PrivateSend unknown: " + b
			SELEND
			SLEEP(_s)
		NEXT
		SLEEP(_s)
		SLEEP(_s)
	FEND


	PROCEDURE StopReceiveThread()
		_loop = FALSE
	FEND

	PROCEDURE ReceiveThread(bPrint)
		DIM s = (GETTIME() * 1000 + G_TIME_ZZ) / 1000
		DIM b = FALSE, input = "", t = FALSE, word = "", n = 0.1
		_loop = TRUE
		WHILE _loop
			n = (GETTIME() * 1000 + G_TIME_ZZ) / 1000
			IFB GETKEYSTATE(_receiveBtn) THEN
				IFB !b THEN
					b = TRUE
					t = TRUE
					s = n
				ENDIF
			ELSE
				IFB b THEN
					IFB n - s < _l THEN
						input = input + "."
					ELSE
						input = input + "-"
					ENDIF
					b = FALSE
					s = n
				ELSEIF t THEN
					IFB n - s > _w THEN
						IFB LENGTH(word) THEN
							IFB bPrint THEN
								PRINT "ReceiveThread: " + word
							ELSE
								Wait(FALSE, TRUE)
								IF LENGTH(_receive) THEN _receive = _receive + _separator
								_receive = _receive + word
								Wait(TRUE, TRUE)
							ENDIF
						ENDIF
						word = ""
						t = FALSE
					ELSEIF n - s > _l THEN
						IFB _table[input, HASH_EXISTS] THEN
							word = word + _table[input]
							s = n
						ELSEIF LENGTH(input) THEN
							PRINT "ReceiveThread unknown: " + input
							s = n
						ENDIF
						input = ""
					ENDIF
				ENDIF
			ENDIF
			SLEEP(0.001)
		WEND
	FEND


	// マルチスレッド・同時アクセスを厳密にするなら、改良が必要
	PROCEDURE Wait(chg, up)
		DIM w = _timeOut
		WHILE _change <> chg AND w > 0
			SLEEP(0.001)
			w = w - 1
		WEND
		IFB w > 0 THEN
			IF up THEN _change = !chg
		ELSE
			PRINT "!!! PrivateWait Timeout Error !!!"
		ENDIF
	FEND

ENDMODULE