HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0103
Y_repeatHSPとRubyの連携13解決


Y_repeat

リンク

2020/1/3(Fri) 21:39:10|NO.89159

HSPユーザーの皆さん。新年、おめっとーございまーす

自分のHSPの適正に疑問が付いてきて
色々、多言語、物色してるんですけど
Rubyが一番、勉強はかどるかんじなんですが
好きっつーか勉強はかどるみたいな

で、先日、他のスレッドで
HSPとPythonをソケットを使って連携してるサンプルが載ってて
便乗質問です
HSPとRubyを連携させるのはどんなかんじなんすか?

自分がググったかんじでは
http://dgames.jp/dan/20050109_2
にHITしたぐらいっす

HSPでGUIの処理をして
メインルーチンはRubyで処理したいっす

HITしたとこは
HSPがサーバーで
Rubyがクライアントになってます
自分の計画的には
Rubyをサーバーにして
HSPをクライアントにしてGUI操作をしたいです

ですが、どっちにしろ文字列の受け渡しっぽくて
HSPがサーバーで、処理はクライアント的で
Rubyがクライアントで、処理はサーバー的なかんじで

通信は1対1オンリーでOKっす

なんかこの流れで、色々通信させると
色んな言語と連携出来て
HSPの世界が広がりますな

ではでは



この記事に返信する


Y_repeat

リンク

2020/2/10(Mon) 22:31:35|NO.89468

こんばんわ。何か色々注文書いてしまって申し訳ありませんでした
教えていただきたかったのはシンプルな叩き台みたいかんじので
注文してしまったのは最終的な自分の目標です
ベースみたいのを提示していただけたなら
自分の拙い腕でちょこちょこやっていきたいです

自分、プログラミングはベースっぽいとこしかやったことなくてですね
技術的に少々難しいのとかは あんま出来ないっす
Rubyは現在逆引き書籍で勉強中なくらいで
技術的なことはサッパリです



Y_reoeat

リンク

2020/2/11(Tue) 21:47:38|NO.89475

なんかサンプルスクリプトは案外シンプルで
とりあえず細かくコメント入れてるとこです
行数も短いしググりながら自力で出来るかもしれません



zakki

リンク

2020/2/12(Wed) 18:10:14|NO.89477

正攻法ではPythonの話やその例と同じようにソケット通信すれば普通に連携できます。
ローカルでの1:1限定だとpipeget/pipeputでruby hogehoge.rbなプロセスとやり取りにすると
Ruby側も単に標準入出力の読み書きで済むので若干楽かもしれません。

通信速度がミリ秒単位くらいでよければRubyでローカル専用のウェブサーバーフレームワークを使って
HSP側からhttploadで呼ぶと、ソケットの詳細やディスパッチの手間は若干省けるかもしれません。
https://qiita.com/toru0408/items/a73c486566fc2a58026b

あとはこれもローカル限定で、さらにRubyのバージョンが古いですがActiveScriptRubyを
ScriptControl経由で呼ぶこともできるんじゃないかと。
https://www.artonx.org/data/asr/
https://wiki.hsp.moe/Module%EF%BC%8F%E6%96%87%E5%AD%97%E5%88%97%E3%81%AE%E8%A8%88%E7%AE%97%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB.html



ベイン

リンク

2020/2/12(Wed) 18:58:33|NO.89478

標準入出力で通信するサンプルを前に作ったやつを貼っておきます。
(ほんとうは解説記事を書こうとしていたんですが・・・)

https://github.com/vain0x/hsp3-modules/tree/master/mod_child_process

もともとは knowbug デバッガ (C++ と HSP で通信しているアプリ) から切り出してきたもので、
pipeput/pipeget はその用途には弱かった (細かい制御ができないっぽい) ので、
Win32 API 直叩きでやっています。



Y_reoeat

リンク

2020/2/12(Wed) 20:36:33|NO.89480

こんばんわ。ちょこちょこRubyのソケットのサンプルとか簡単な解説とか読んでたら
出来そうな気がしてきました

昨日、コメント書いてたのをどしようか?と思ってるんですけど
ここに投稿するには冗長かな?
なんですけど、ほとんどHDLからのコピペなので
自分のブログに載せるのも抵抗がありまして
ここで否定されたら削除しますってことで

// ソケットモジュール読み込み #include "hspsock.as" // アプリのタイトル記述 title "TCPサーバーテスト" ; ; HSPによるTCP/IPサーバー・クライアント通信のスクリプトです。。 ; ソケットを作成して、クライアントに文字列を送信して終わります。 ; このスクリプトは、client.asのスクリプトと対にしてお使いください。 ; あらかじめ、このスクリプトを実行しておき、LAN上の別マシンから ; client.asを実行することにより、通信を行ないます。 ; portにポート番号(変更しなくても可)を設定します。 ; 接続に成功すると、クライアント側に、サーバーの時刻が文字列 ; として送信されてきます。 ; // メインルーチン // *byeでソケットを閉じてから帰って来る *main // 変数portに番号999を代入 port=999 // IPアドレス取得。システム変数refstrにIPアドレスが代入されると思われる ipget // IPアドレス表示。refstrにはIPアドレスが代入されると思われる mes "IPアドレス:"+refstr // 変数portの番号を表示。先ほど代入したもの mes "ポート"+port+"で接続を待っています..." // ソケットをサーバーとして初期化。 // ソケットID番号0。先ほど代入した変数port。を引数として実行。HDL参照 sockmake 0,port // sockmakeを実行した後、結果がstatに代入される // statが0なら正常実行。1か2か3(HDL参照)ならエラーなのでダイアログで文章を表示して // エラールーチン*errbyeにジャンプ if stat : dialog "Socket error": goto *errbye // repeat命令の無限ループ処理 // ただしaをプログラムカウンタとして使っている // aは繰り返し回数表示用。終了条件として使っている訳ではない a=0 repeat // クライアントの着信を待つ。引数1は0。引数2はデフォルト値の0 // 引数1はソケットID番号。引数2は代替ソケットID番号。HDL参照 sockwait 0 title "CHK="+stat+"/"+a // sockwait命令は、クライアントの着信がない場合や、エラーが発生した場合には、 // システム変数 statに0以外の値を返します。HDL参照 // statが1以上なのでエラー。ダイアログに文章を表示して // エラールーチン*errbyeにジャンプ if stat>1 : dialog "Socket error": goto *errbye // システム変数 statに0が代入された場合にはじめてクライアントとの接続に成功し、 // sockget命令、sockput命令などの通信を行なうことができるようになります。HDL参照 // statが0なのでクライアントと接続成功。無限ループを抜けて次の処理へ if stat=0 : break a+ // 無限ループなので少々waitする。ソケット処理が入るのを待っていると思われる // ゆえにそんなに細かいwaitではない。 wait 10 loop // HDLのsockwait命令の項にはrefstrには何も言及していないので // ひょっとしたら、さっきipgetを使用した時にIPアドレスがrefstrに代入されたままかもしれない mes "接続しました。("+refstr+")" wait 100 // 時刻情報を代入するローカル変数的変数 t1=0:t2=0:t3=0 t1=gettime(4) // 4 : 時(Hour) t2=gettime(5) // 5 : 分(Minute) t3=gettime(6) // 6 : 秒(Second) HDL参照 // 時刻(時:分:秒)他を文字列変数に代入 mm="今の時間="+t1+":"+t2+":"+t3 // ソケットにデータを送信します。 "message"で指定した文字列か、 // または文字列型変数の内容をそのまま送信します。 // 引数1。"message" : 送信するメッセージ // 引数2。0〜31(0) : ソケットID番号。HDL参照 sockput mm // 送信中にエラーが発生した場合は、システム変数 statに0以外の値が代入されます。HDL参照 // statがtrue(0以外)だとエラーが発生してるので、文章を表示して、 // エラールーチン*errbyeにジャンプ if stat : dialog "Socket error": goto *errbye // 送信した文章を表示 mes "["+mm+"] を送信しました。" ; // ソケットのルーチン終了。ソケットを閉じたら // メインルーチン*mainに飛ぶ *bye // ソケットを閉じる sockclose // メインルーチン*mainに飛ぶ goto *main ; サーバーを続ける // ソケット処理にエラーがあった。ソケットを閉じて // 文字列を表示したら動作終了 *errbye // ソケットを閉じる sockclose mes "終了" // 動作終了 stop



Y_reoeat

リンク

2020/2/12(Wed) 21:15:20|NO.89481

こんばんわ。載せるか迷ってるスクリプトその2
今日はクライアントのサンプルです

// ソケットモジュール読み込み #include "hspsock.as" // アプリのタイトル記述 title "TCPクライアントテスト" ; ; HSPによるTCP/IPサーバー・クライアント通信のスクリプトです。。 ; TCPサーバーに接続して、サーバーから文字列を取得して終わります。 ; このスクリプトは、server.asのスクリプトと対にしてお使いください。 ; あらかじめ、server.asを実行してあるLAN上の別マシンに接続します。 ; 変数adrに接続先のIPアドレスを、portにポート番号(変更しなくても可) ; を設定してください。接続に成功すると、サーバー側の時刻が文字列 ; として送信されてきます。 ; ; このスクリプトは、LAN接続を前提に作成された簡単なモデルです。 ; インターネットなどの、速度が安定しない通信環境や、負荷のかかる ; ホストでは、送受信が遅れた場合などの対処が必要になる場合があります。 ; // IPアドレス(と思われる)を文字列形式で変数adrに代入 adr="127.0.0.1" // TCPで使用するポート番号(と思われる)を変数portに代入 port=999 // 変数adrとportを表示。mesの表示の先頭が変数なのはちょっと怖い mes adr+"、ポート"+port+"に接続中..." // ソケットを初期化して接続。 // TCP/IP通信を行なう際には、必ず最初に初期化して // 相手のサーバーに接続しなければなりません。 // 引数1はソケットID番号。引数2はURL指定文字列(IPアドレス代入してますね) // 引数3はポート番号。HDL参照 sockopen 0,adr,port // sockopen命令が実行された結果が、システム変数statに代入されます。 // 結果がエラーの場合は、0以外の値になります。 (大体1か2か3か4のようです) // 初期化でエラーが起こった場合は、通信を行なうことはできません。HDL参照 // statがtrue(0以外)なら文章をダイアログで表示して、動作終了サブルーチンへジャンプ if stat : dialog "socket error" : goto *bye // ソケット接続に成功したようです mes "接続しました..." // aはカウンタ用変数です。表示に使用するようです。終了条件には使いません a=0 // repeatを使った無限ループ repeat // データの到着を調べる。 // 引数1:ソケットID番号(HDL参照)。sockopen命令の引数1で使ったやつと思われる。 // 指定したソケットに sockget系の命令で取得できるデータが到着しているかどうか調べます。 // 受信可能なデータがある場合は、システム変数 statに0が代入されます。 // データが到着していない場合は、システム変数statは1になります // 通信エラーなどが起こった場合は、システム変数 statは2以上の値になります。 // エラーが起こった場合は、通信を行なうことはできません。(HDL参照) // エラーの値は大体、1か2のようです。(HDL参照) // sockcheckはデータの到着を調べるだけです。 // 実際のデータを取得するには、sockget, sockgetc, sockgetbなどの命令で // 受信する必要があります。 sockcheck 0 // エラー/正常の値が入ってるstatを表示 title "CHK="+stat+"/"+a // statがfalseだったら(0だったら)無限ループを抜ける // statがtrue(0以外)だったら無限ループ継続 if stat!=0 : break // 無限ループなので(今回は多めに)wait wait 10 // カウンタインクリメント a+ loop // カウンタ初期化 a="" // データを受信 // p1=変数 : 受信内容が格納される変数名 // p2=0〜(64) : 受信サイズ(byte単位) // p3=0〜31(0) : ソケットID番号(sockopen、sockcheckで使ったやつ(多分)) // 受信中にエラーが発生した場合は、システム変数 statに0以外の値が代入されます。(HDL参照) sockget a,64 // stat がtrueなら(0以外なら)文字列を表示して。終了サブルーチンへ if stat : dialog "socket error" : goto *bye // aにはsockgetの内容が代入された // (さっき使用した変数と使い回しているのが気持ち悪いが) // 受信したデータを表示 mes "サーバーからのメッセージ : "+a // 特にエラーはなかったのでここに来ているが // ルーチンは終了したので終了処理に進む // 途中にエラーがあった場合もここにジャンプして来る *bye mes "終了" // ソケットを閉じる sockclose // 処理終了。endじゃなくてstop。動作が止まるだけで、 // スクリプトは終了しない stop
→zakki様
正攻法のソケットの方がやりやすいんでしょうか
まずは正攻法でやりつつ、ググってみます
→ベイン様
おお。knowbugの作者様なんですね
使用させてもらっています
モジュール変数の中身を表示してくれるのが嬉しいです
スクリプトは時間がある時、写経とか、ルーズリーフへの書き写しとかしてみます



Y_repeat

リンク

2020/2/19(Wed) 22:42:26|NO.89515

こんばんわ。
→ペイン様
やってた写経が一区切りついたのでペイン様のスクリプトをプリントアウトして
ルーズリーフに書き写してます

>knowbug デバッガ (C++ と HSP で通信しているアプリ) から切り出してきたもので、
ということで、C++とHSPの通信モジュールかな。と思ったら
Rubyと通信していてびっくりしました
という訳で、解決つけておきます

なんとなく考えてるのは
HSP側でGUI操作をして
Rubyをdll感覚で、関数呼び出し形式で使用し、
データもRuby側で管理ってかんじです
dllとの違いはデータをRuby側で管理するとこで
例えば、以前質問したんですが
dll側でmallocしたデータはいつ消えるのかわからなく
Rubyで管理してしまえば
GCはあるんですが
大体はRubyの実行が終了する時に死ぬんだろうなーってとこです



Y_repeat

リンク

2020/2/19(Wed) 22:54:43|NO.89516

こんばんわ。マヌケなタイポしてたっていうね

>もともとは knowbug デバッガ (C++ と HSP で通信しているアプリ)
> から切り出してきたもので
そういうことならこの形式のC++とHSPの連携モジュールみたいの見てみたいですね
VC++は仕様が揺れてるイメージなのでminGWの方が長く使えるモジュールになると思います
minGWの方で構造体を操作して連携操作で長らく待たれている構造体操作とか

どうも調子こいてる発言多くて申し訳ないです

書き写してて気づいたんですが
#module m_a mem_A,\ //バックスラッシュ
local loc
とか
記述の途中で改行出来るようになったんですか?



ベイン

リンク

2020/2/20(Thu) 19:10:28|NO.89519

> Rubyをdll感覚で、関数呼び出し形式で使用し、
> データもRuby側で管理ってかんじです

FFI (foreign function interface) みたいな感じですかね……
Ruby は詳しくないので、Ruby/HSP3 が互いの関数を呼べるのかは分からないです。

とりあえず文字列の送受信ができれば関数呼び出しの代わりはできます。
例えば Ruby 側から "mes こんにちは" という文字列が送られてきたら
「こんにちは」の部分を取り出して mes で表示する、
みたいなスクリプトを書いておく感じです。

knowbug だとこのあたり。

https://github.com/vain0x/knowbug/blob/v2.0.2/src/knowbug_client/kc_main.hsp#L206

keys/values に処理のパラメータの名前とデータが渡されるので、
ひたすら分岐して対応する命令 (app_xxx) の呼び出しをやっています。

送受信する文字列はこんな感じです:


Content-Length: 44 method = initialized_event version = v1.0.0

( https://github.com/vain0x/knowbug/blob/v2.0.2/knowbug-protocol.md )

データを Ruby 側で持つというのは私もよいと思います。
knowbug も基本的にデータは C++ 側で持っていて、
表示に必要な情報を HSP 側に渡す感じになってます。

> #module m_a mem_A,\ //バックスラッシュ
> local loc
> とか
> 記述の途中で改行出来るようになったんですか

はい、プリプロセッサ命令だけですが、行の最後にバックスラッシュをつければ命令の途中で改行できます。
わりと昔からだったと思います。



Y_repeat

リンク

2020/2/20(Thu) 22:42:41|NO.89521

こんばんわ。返信ありがとうございます→ペイン様

僕もRubyは勉強中ですが
ペインさんの書き込みを見て、普通にevalすればよくね?とは思いました

> #module m_a mem_A,\ //バックスラッシュ
> local loc
#moduleの途中でバックスラッシュしてる記述はありませんでしたね
しかもlocal変数まで確保したがってるし
#moduleに属するローカル変数て何だ?とか思いましたが
#moduleでlocal変数確保してる記述もありませんでしたね

>わりと昔からだったと思います。
自分、質問して、一回通してマニュアル読んだ方がいいですよ
みたいに書かれてたのにまだ通して読んでないっていうね
でもHSPはマニュアルに書かれてない仕様も多くて大変ですね
自分、HSPは歴浅いイメージもあるんですが
今となっては大分古株感あります
コンテスト初投稿もたしか2008だったかな?



Y_repeat

リンク

2020/2/26(Wed) 00:07:06|NO.89556

こんばんわ
別スレに書き込んだ後
ググりながらサクラエディタの設定やってました

せっかくRubyと連携するならUTF8で連携したいと思いまして
自分もそろそろUTF8に移行しようかな。と思いまして

Ruby側はUTF8スクリプトで問題なさそうなんですけど
HSP側はUTF8スクリプトで動かしても問題あるでしょうか?
そうそう、ソースコードの書写は終わりました
キーワードが入ってきたくらいで、あんまり理解出来てないっす

コマンドラインコンパイラのついでにknowbugも入れたんですけど
(これで何回目だ?w)
UTF8版は完成まだっぽいすね
陰ながら応援しています。頑張ってください



Y_repeat

リンク

2020/2/26(Wed) 17:47:41|NO.89560

こんにちわ

ペイン様作のスクリプトと
Ruby版whitespaceを連携させたら
著作権はどうなるでしょうか?

Ruby版whitespaceはLGPLなんですよね
書籍にのってるRuby版whitespaceは
いっぱい改造しないと再配布NGっぽいので
githubに載ってるLGPLのやつの方が再配布
条件緩そうなんですよね

Rubyの方はdllっぽく使う予定で
連携も動的っぽくなるっぽいので
ペイン様作のスクリプトにコピーレフトは
かからないんじゃないかな?とは思うんですが

まあ、自分でRuby版whitespaceを少々いじった部分が
コピーレフトになる分にはしょうがないとは思いますが



Y_repeat

リンク

2020/2/28(Fri) 19:10:29|NO.89577

昨晩、LGPLに関してちょこちょこググってたんですけど
LGPLと通信した場合、ライセンスはどうなるかはわかりませんでした
GPLのアプリと通信した場合はグレーゾーンと書いてました
LGPLのアプリと通信した場合はそれよりは白っぽいグレーゾーンなのかな
とは思います
LGPLのライブラリを使用した場合
使用したスクリプトは公開するのならライセンスは構わないみたいな事も
書いていました
LGPLのアプリと通信した場合
通信に利用したブラウザのライセンスはどうでもいいみたいには
書いていました
LGPLのアプリとの統合みたいにググってもいいかんじにはHITしませんでした
LGPLは出来損ないの子供みたいだから
あんまりちゃんと定義してないとも書いてました
関わった人が自分はこう解釈した。みたいなかんじで良い
みたいにも書かれていました
あんまり変な解釈だと訴訟されるかもしれない。とも書いていました

ライセンスにはデュアルライセンスみたいのもあって
whitespace@Ruby+ペイン様のスクリプトを改造したのを
LGPLで公開して

ペイン様のスクリプトを改造したのと
受け取った文字列を大文字にして返す(Ruby)スクリプト
みたいな簡単なのと
合わせてペイン様のライセンスにならってCC1.0で公開する
デュアルライセンスがいいのではないかな
とは思っている所で御座います

デュアルライセンスとして
CC1.0とするクライアント系スクリプトとモジュールは
LGPLでコピーレフトしたものまんまでなくてもいいかんじもしてきました
なんとなく同じのをCC1.0としてライセンスすると

ペイン様はCC1.0でコピーレフトのないライセンス設定なので
改造スクリプトをLGPLとするのもそんなに問題ない気もして
使う人の好きにしていいよ的な立ち位置なのかなとも思ったり
僕がLGPLとして配布したとしても
GITHUBにある元スクリプトはずっと
変えたくなるまでCC1.0でしょうから

又、whitespaceとのやりとりは
自動的にwhitespaceスクリプトとして保存したもののFILE名を渡すのと
input/output情報と(量は多くないです)
EXITくらいなので
ペイン様スクリプトを利用しなくてもソケット通信で十分
みたいなかんじもします

ライセンスに関してはたまに読むくらいで
自分、拙いんで、見解のNG部分とかありましたら
指摘してください



ONION software Copyright 1997-2023(c) All rights reserved.