※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

MGWSIで Apache から GT.M を使えるようにしたときの作業メモです。
MGWSI導入については → こちら

  • GT.M / MUMPS向けの通信プロセス は準備済みとします。
    • 仲介用デーモンプロセスは使わない設定にします
    • 使うようにもできるけど、使わない方がパフォーマンスでるらしいので

最初の一歩

  • ~/mgwsi/bin/m_apache22.so を /usr/lib/apache2/modules/ 配下へコピー
  • /etc/apache2/mods-avalable/ 配下へ以下の2ファイルを作成
mgwsi.load
LoadModule m_apache_module /usr/lib/apache2/modules/m_apache22.so
mgwsi.conf
SetEnv MGWSI_PORT 7041
  • ここで a2enmod で mgwsi を有効にするのが流儀のようですが…
    • めんどうなので、手作業で mods-enable 配下にシンボリックリンクをはりました
  • Apache を再起動
  • 以下のような HTMLファィルを作成し
<html>
<head>
<title>First Step</title>
</head>
<body>
<form method="POST" action="test.mgwsi?xxx=yyy1&xxx=yyy2">
<input type="text" name ="a" value="b" /> <br />
<br />
<input type="text" name ="c" value="d" /> <br />
<br />
<input type="submit" name="go" value="SUBMIT" />
</form>
</body>
</html>
  • SUBMIT ボタンをクリックすると送信した情報がブラウザに表示されます
    • 拡張子 .mgwsi をもつページをリクエストした場合は、内容が GT.M に送り出されます
    • GT.M の受け側は(省略されているので)WEB^%ZMGWSIS ルーチンが想定されます
      • ZMGWSI.RO を登録した時に作成される以下の部分が相当します
CGI … サーバの情報
DATA … GET なり POST なりで送った情報
WEB(CGI,DATA)
 N REQ,X,Y
 S REQ=""
 S REQ=REQ_"HTTP/1.1 200 OK"_$C(13,10)
 S REQ=REQ_"Content-type: text/plain"_$C(13,10)
 S REQ=REQ_"Connection: close"_$C(13,10)
 S REQ=REQ_$C(13,10)
 W REQ
 W $G(CGI)
 S X="" F  S X=$O(CGI(X)) Q:X=""  W X_"="_$G(CGI(X))_$C(13,10)
 W $C(13,10)
 S X="" F  S X=$O(DATA(X)) Q:X=""  S Y="" F  S Y=$O(DATA(X,Y)) Q:Y=""  W X_":"_Y_"="_$G(DATA(X,Y))_$C(13,10)
 Q

GT.M ルーチンを自作

  • TESTDSP1.m を作成&コンパイル
※分かりやすいように、命令は省略せずに書きました。
TESTDSP1(CGI,DATA)
 NEW REQ
 SET REQ=""
 SET REQ=REQ_"HTTP/1.1 200 OK"_$CHAR(13,10)
 SET REQ=REQ_"Content-type: text/plain"_$CHAR(13,10)
 SET REQ=REQ_"Connection: close"_$CHAR(13,10)
 SET REQ=REQ_$CHAR(13,10)
 WRITE REQ
 WRITE ^animal($GET(DATA("key",1)))_$CHAR(13,10)
 QUIT 
  • mgwsi.conf を変更&Apache を再起動
SetEnv MGWSI_PORT 7041
SetEnv MGWSI_M_FUNCTION ^TESTDSP1
  • 以下のような HTMLファィルを作成し、ブラウザから SUBMIT をクリックするとブラウザに鳴き声が表示されます
<html>
<head>
<title>My Routine</title>
</head>
<body>
<form method="POST" action="test.mgwsi">
<select name="key">
<option value="dog">DOG
<option value="cat">CAT
</select><br />
<br />
<input type="submit" name="go" value="SUBMIT" />
</form>
</body>
</html>
  • 拡張子が .mgwsi の場合は無条件に(指定された)GT.M ルーチンに渡されます
    • ちなみに .ewd も同様の動きとなります。
    • 別の拡張子に対応するよう指定することもできるようです。
  • もし拡張子より前の部分になにか意味を持たせたい場合は、GT.M ルーチンの方で実装することになります

XMLHttpRequest を使う

  • submit をかけずに、いわゆる Ajax っぽく使う場合の説明です。
  • TESTDSP1.m を変更&コンパイル
※改行をつけなくしただけです
TESTDSP1(CGI,DATA)
 NEW REQ
 SET REQ=""
 SET REQ=REQ_"HTTP/1.1 200 OK"_$CHAR(13,10)
 SET REQ=REQ_"Content-type: text/plain"_$CHAR(13,10)
 SET REQ=REQ_"Connection: close"_$CHAR(13,10)
 SET REQ=REQ_$CHAR(13,10)
 WRITE REQ
 WRITE ^animal($GET(DATA("key",1)))
 QUIT 
  • ~/mgwsi/java/m_client.js をWEBディレクトリへコピー
    • 自前で書ける人は自作でもいいのですが、せっかくあるんで使ってみました
  • 以下のような HTMLファィルを作成し、ブラウザから GET VOICE をクリックするとテキストボックスに鳴き声が表示されます
<html>
<head>
<title>XMLHttpRequest</title>
<script type="text/javascript" src="m_client.js"></script>
<script type="text/javascript">
<!--
function get_val()
{
  var k = document.myform.key;
  var r = document.myform.res;
  var d ='test.mgwsi?key=' + k.options[k.selectedIndex].value;
  var res = server_proc(d);
  r.value = res;
}
-->
</script>
</head>
<body>
<form name="myform">
<select name="key">
<option value="dog">DOG
<option value="cat">CAT
</select><br />
<br />
<input type="text" name ="res" value="" size=20 /> <br />
<br />
<input type="button" name="go" value="GET VOICE" onClick="get_val()" />
</form>
</body>
</html>
※うまくとれない時は、Apache の再起動をするといいかもしれません。