トップ 差分 一覧 ツリー ソース 検索 インデックス検索 ヘルプ RSS RSS10 RSS20 ATOM ログイン

MemoNotes はてなブックマーク livedoorクリップ

ForMobile
6/18 FeedLoad HSPでRSS/RDF/Atomを簡単に取り扱ったり、PodCastに対応したり

この場所の存在意義

開発などをしていて、気づいたこと、覚えておきたいことなどをメモする場所。
ここに書くことは基本的に勝手に持っていって使ってかまいません。転載もアイデアの無断再利用もOK。
ただし特許などで権利を奪う行為は禁止。[1]

HSPLet

CGIと連携する

通常のいわゆる「掲示板」では、CGI(主にPerl)を使ってサーバーにデータを送り、それをサーバー側で
整形してHTMLにして出力しているが、その整形部分をHSPで行うことを考える。
当然データの送信もHSPLetでできた画面の中から行おうと思うが、その際にデータを送信する方法が2つ3つ考えられる。

  • 独自プロトコル
  • HTTPを使う方法
    • POSTで送信する方法
    • GETで送信する方法

独自プロトコル

CGIで使えるかどうか知らないけど、hspsock使えば通信は出来るはず。
サーバーを自分で立てられるような人であれば、サーバー側のソフトをCとかで書いて通信するのもありかもしれない。
あ、あとはWindows系サーバーならHSP+pcbnetなサーバーソフトとか。

POST

まずPOSTを使う方法について。これは、現在のHSPLetの標準命令では発行する方法がないようなので、必然的に
hspsockかhspsockA[2]を使うことになる。
細かい制御が出来、アップロードサイズにも(とりあえずは)制限がないので自由度が高いが、開発に手間がかかりそう。

GET

GETを使う方法は、標準命令のbloadで使用できる。例えば、次のようにするとCGIを実行できる。

bload "send.cgi?message",A

この場合、CGIプログラム「send.cgi」に、messageと言うパラメータを渡して実行し、変数Aにそのレスポンスを得る。
インターフェイス側が非常に簡単に実装できる反面、命令の意味と実質的な実装の意味が逆転していて分かりづらいことと、
送れるデータの大きさに制限があることなどが難点。

GETを使う例:ボタンを押すと数値が増えるカウンタ

ボタンを押すとカウンタが回るプログラム。カウンタの数値は常に共有され、誰かがボタンを押せば、世界中で表示されている
すべてのボタンのカウンタが回る。
仕組みは「ボタンを押したら数値をインクリメントするCGIをGETする」「一定時間ごとに保存されたデータを読み直す」だけ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        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を使って直接標準出力に書き出す。

1
2
3
4
5
6
7
8
9
10
#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」を渡すと、現在の値をそのまま返す。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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なんとかさんがいるおかげでダウンロード形式での歌詞ファイルの配布は絶望的に不可能な現状[3]
歌詞の配布は駄目でも、タイムタグだけの配布ならかまわないんじゃないだろうか。もしかするとタグの打ち方やタイミングに著作権が出るかもしれないけど、
その辺は提供者が折れてくれればいいわけで。

で、タグだけを提供すると仮定したとき、元の歌詞はどこかから引っ張ってくる必要があるけど、歌詞に対してタグを打つと言う作業はしなくてもよくなると言う寸法。
勿論、歌詞データを用意すればマージするようなソフトも提供する必要がある。

本当は歌詞を配布しているサイトがタグ付き歌詞ファイルも配布してくれればいいんだろうけど、そうはいかないだろうし。

とか言ってみるテスト。

TrackBack

TrackBack URL for this entry:
http://www.no-music-no-life.net/~tsukaban/trackback.cgi/MemoNotes
  • [1]そんなしゃれたメモなんか書いてないだろうという意見にはある程度賛同しますが。
  • [2]共に、同封のプラグイン。AはPCB氏が作ったものの互換と思われる。
  • [3]いくつか存在している邦楽の歌詞配布サイトは、「ストリーミング契約」なのです。テキストなのに。

最終更新時間:2008年07月02日 21時01分19秒


TSUKABAN!への連絡の際には、こちらもお読みください。→TsProfile