!!!この場所の存在意義 開発などをしていて、気づいたこと、覚えておきたいことなどをメモする場所。 ここに書くことは基本的に勝手に持っていって使ってかまいません。転載もアイデアの無断再利用もOK。 ただし特許などで権利を奪う行為は禁止。{{fn そんなしゃれたメモなんか書いてないだろうという意見にはある程度賛同しますが。}} !!!HSPLet !!CGIと連携する 通常のいわゆる「掲示板」では、CGI(主にPerl)を使ってサーバーにデータを送り、それをサーバー側で 整形してHTMLにして出力しているが、その整形部分をHSPで行うことを考える。 当然データの送信もHSPLetでできた画面の中から行おうと思うが、その際にデータを送信する方法が==2つ==3つ考えられる。 *独自プロトコル *HTTPを使う方法 **POSTで送信する方法 **GETで送信する方法 !独自プロトコル CGIで使えるかどうか知らないけど、hspsock使えば通信は出来るはず。 サーバーを自分で立てられるような人であれば、サーバー側のソフトをCとかで書いて通信するのもありかもしれない。 あ、あとはWindows系サーバーならHSP+pcbnetなサーバーソフトとか。 !POST まずPOSTを使う方法について。これは、現在のHSPLetの__標準命令では__発行する方法がないようなので、必然的に hspsockかhspsockA{{fn 共に、同封のプラグイン。AはPCB氏が作ったものの互換と思われる。}}を使うことになる。 細かい制御が出来、アップロードサイズにも(とりあえずは)制限がないので自由度が高いが、開発に手間がかかりそう。 !GET GETを使う方法は、標準命令のbloadで使用できる。例えば、次のようにするとCGIを実行できる。 bload "send.cgi?message",A この場合、CGIプログラム「send.cgi」に、messageと言うパラメータを渡して実行し、変数Aにそのレスポンスを得る。 インターフェイス側が非常に簡単に実装できる反面、命令の意味と実質的な実装の意味が逆転していて分かりづらいことと、 送れるデータの大きさに制限があることなどが難点。 !!例 !GETを使う例:ボタンを押すと数値が増えるカウンタ ボタンを押すとカウンタが回るプログラム。カウンタの数値は常に共有され、誰かがボタンを押せば、世界中で表示されている すべてのボタンのカウンタが回る。 仕組みは「ボタンを押したら数値をインクリメントするCGIをGETする」「一定時間ごとに保存されたデータを読み直す」だけ。 {{code HSP,8,1,0] pos 0,30:objsize 200,30 A="" button gosub "増やす",*cntplus repeat bload "counter",A color 0,0,0 boxf 0,0,200,30 color 255,255,255 pos 0,0 mes "["+A+"]" wait 100 loop *cntplus bload "getcnt.exe",X B=int(A)+1 A=""+str(B) color 0,0,0 boxf 0,0,200,30 color 255,255,255 pos 0,0 mes "["+A+"]" wait 100 return }} なお、対応するCGIプログラムはすぐ下の「HSPでCGI」に収録。随時読み直しているファイルの名前が「counter」で決めうちなのは このCGIにあわせて作られているためで、普通はもっと何とかしたほうがいいはず。 !!!HSPでCGI HSPにはCUIの実行ファイルを作成できる機能があるので、これを利用してWindwos系のサーバーで動作させられるCGIプログラムを 作成することが出来る。一般的なPerl-CGIなどと同様にGETやPOSTでのデータの受け渡しも比較的容易に出来る。 !!データを受け取る !GET GETコマンドでパラメータとして渡されるデータは、環境変数QUERY_STRINGに格納される。例えば、 http://localhost/test.exe?id=1&name=TSUKABAN! とすると、QUERY_STRINGには id=1&name=TSUKABAN! と言う文字列が格納される。パラメータごとに切り分けるにはgetstr命令などを使う。 !POST POSTコマンドで送信されたデータは、input命令で取得できる。 !バイナリデータの場合 まだ確認していないが、おそらくAPIを叩いて直接標準入力から取得すれば何とかなると思われる。 !!データを出力する 基本的には、mes命令で書き出してやるだけでよい。Content-Typeの出力を忘れずに。 !バイナリデータの場合 バイナリデータをmesで出力しても、NULLで途切れてしまうため、APIを使って直接標準出力に書き出す。 {{code HSP,8,1 #runtime "hsp3cl" #uselib "kernel32.dll" #cfunc GetStdHandle "GetStdHandle" sptr #func WriteFile "WriteFile" sptr,sptr,int,int,sptr #define STD_OUTPUT_HANDLE $FFFFFFF5 ;ここでは、DATにバイナリデータ、SIZEにデータの大きさが格納されているとする RET=0 WriteFile GetStdHandle(STD_OUTPUT_HANDLE),varptr(DAT),SIZE,varptr(RET),0 stop }} この例ではContent-TypeやContent-Lengthを出力していない。事前にmes命令かWriteFile関数で書き出すこと。 !!例 !GETを使う例:実行すると数値が増えるカウンタ パラメータなしで実行すると、現在保存されている数値に1足してtext/plainで返す。 パラメータに「status」を渡すと、現在の値をそのまま返す。 {{code HSP,8,1 #packopt name "getcnt" #runtime "hsp3cl" #include "mod_getenv.as" mes "Content-type: text/plain\n" SBUF="" getenv SBUF,"QUERY_STRING" if SBUF="status"{ exist "counter" if strsize!-1:bload "counter",SBUF BUF=int(SBUF) mes ""+BUF end }else{ exist "counter" if strsize!-1:bload "counter",SBUF BUF=int(SBUF) BUF++ SBUF=""+BUF bsave "counter",SBUF,strlen(SBUF) mes ""+BUF end } }} なお、数値があふれた場合について何の対処もしていないため、2^31-1(=2147483647)を超えると値がマイナスになる。 !!!アイデアスケッチ いろんなアイデアとかを書きなぐってみる。 !!カラオケタグ付き歌詞ファイルを配信できないだろうか 某JASなんとかさんがいるおかげでダウンロード形式での歌詞ファイルの配布は絶望的に不可能な現状{{fn いくつか存在している邦楽の歌詞配布サイトは、「ストリーミング契約」なのです。テキストなのに。}}。 歌詞の配布は駄目でも、タイムタグだけの配布ならかまわないんじゃないだろうか。もしかするとタグの打ち方やタイミングに著作権が出るかもしれないけど、 その辺は提供者が折れてくれればいいわけで。 で、タグだけを提供すると仮定したとき、元の歌詞はどこかから引っ張ってくる必要があるけど、歌詞に対してタグを打つと言う作業はしなくてもよくなると言う寸法。 勿論、歌詞データを用意すればマージするようなソフトも提供する必要がある。 本当は歌詞を配布しているサイトがタグ付き歌詞ファイルも配布してくれればいいんだろうけど、そうはいかないだろうし。 とか言ってみるテスト。 {{trackback include}}