« 2005年08月 | メイン | 2005年10月 »

2005年09月14日

VBSを使ったASP覚書

VBSを使ったASP Perlを使ったCGI

基本事項

拡張子は基本的に .asp

ファイルの先頭に

<%@ Language=VBScript %>

と付け、VBコードは<% %>の間に記述。

コメントは行において ' 以降

変数

宣言
dim a

PHPと同じく型を明示できない(PHPのようにキャストできるかは知らない)。
というより、VBのvariant型(何にでも使える)しかサポートしていないっぽい。
宣言せずに使用できるが、ブロックの頭に"Option Explicit"を記述すると宣言を強要できる。(使用推奨)

配列
dim a(9)
a(1) = 1

動的配列
redim a()

構造体

type foo
mema
memb
memc
end type

dim bar as foo

グローバル変数
public a

静的ローカル変数
static a

基本的に普通かな。

おまけ、定数
const FILE = "file/path.txt"
public const FILES = "A"

演算子

= 代入
+ 加算
- 減算
* 掛け算
/ 割り算
mod 余り
^ 階乗
& 文字列結合

比較演算子

= 等しい
<> 等しくない
> より小さい
>= より小さいか等しい
< より大きい
<= より大きいか等しい
and かつ
or または

代入演算子=と比較演算子=が同一って・・・

is関数

IsArray(変数) 配列か調べる
IsDate(変数) 日付か調べる
IsEmpty(変数) 使われているか調べる
IsNull(変数) NULL 値か調べる
IsNumeric(変数) 数値か調べる
IsObject(変数) オブシェクトか調べる

比較構文

if a = 100 then messagebox "true"

if a = 100 then
messagebox "true"
end if

if a = 100 then
messagebox "true"
elseif a = 120 then
messagebox "120"
else
messagebox "other"
end if

select case a
case 100
msgbox "100"
case 200
msgbox "200"
case else
msgbox "else"
end select

繰り返し構文

for i = 0 to 100
a++
next

for i = 0 to 100 step 2
a += 2
next

do until i = 100
i++
loop

do while i < 100
i++
loop

do until i = 0
i++
if i = 100 then exit do
loop

関数

functionは戻り値がある関数。変数test(関数名)に代入した値が返される

public function test(dim a,dim b)
a = a + b
test = a + b
end function

sub は戻り値が無い関数。

public sub test(dim a,dim b)
a = a + b
end sub

配列を渡すには、引数リストでは()を付けてはいけない。

public function test(dim a, dim b)
a(3) = b(3)
test = a(0) + a(1)
end function

exit function
exit sub

セッション

if isempty(session("data")) then
session("data") = "foo"
end if

PHPと同じように扱える。

Session.Abandon
session_destroy()と同じ

インクルード

<!-- #include file="include/com.asp" -->

よく見たらSSIで見た事のあるアレ。
指定は<% %> 外

エスケープ

chr(13) '改行
chr(0) 'NULL 文字

\nは使えないのかな?

chr(&H22) ダブルコーテション「"」 chr(22)
vbTab タブ chr(9)
vbLf ラインフィード chr(10) , chr(&H0A)
vbCr キャリッジリターン chr(13) , chr(&H0D)
vbCrLf 改行 chr(13) & chr(10)
chr(0) C 言語 NULL 文字
vbNullString C 言語 NULL ポインタ文字列

ASP特有

response.write

JSのdocument.writeと同じ。

このように使うみたい。

<%
response.write("<TABLE><TBODY>")
for i = 1 to 10
response.write("<TR>")
response.write("<TD>" & i & "</TD>")
response.write("</TR>")
next
response.write("</TBODY></TABLE>")
%>

環境変数

ip = request.ServerVariables("REMOTE_ADDR") '** リモート端末の IP アドレス
user = request.ServerVariables("REMOTE_USER") '** リモート端末のユーザ名
url = request.ServerVariables("HTTP_REFERER") '** リモート端末の直前の URL
blws = request.ServerVariables("HTTP_USER_AGENT") '** ブラウザ情報
path = request.ServerVariables("PATH_INFO") '** 現 CGI のパス情報
svph = request.ServerVariables("PATH_TRANSLATED") '** PATH_INFO の物理パス
alhd = request.ServerVariables("ALL_HTTP") '** 送信された HTTP ヘッダ
htlg = request.ServerVariables("HTTP_ACCEPT_LANGUAGE") '** コンテンツの表示に使用する言語
clen = request.ServerVariables("CONTENT_LENGTH") '** コンテンツの長さ
ctyp = request.ServerVariables("CONTENT_TYPE") '** コンテンツのデータ型
scnm = request.ServerVariables("SCRIPT_NAME") '** スクリプトの仮想パス
svr1 = request.ServerVariables("SERVER_NAME") '** サーバ IP、DSN エイリアス、ホスト名
svr2 = request.ServerVariables("SERVER_PORT") '** リクエスト受信ポート番号
svr3 = request.ServerVariables("SERVER_PORT_SECURE") '** 保護ポートでリクエストが処理されたか
svr4 = request.ServerVariables("SERVER_PROTOCOL") '** プロトコル名、リビジョン
svr5 = request.ServerVariables("SERVER_SOFTWARE") '** サーバソフト名、バージョン

GET&POST

para1 = request.querystring("para1")
** http://sak-main/w_test/test.asp?para1=abc の「abc」を取得します。

text1 = request.form("text1")
** 入力フォームの submit になるフォームデータを取得します。

リダイレクト

response.redirect("http://sak-main/w_test/test2.asp?a=123")

PHPといっしょ。HTMLのヘッダに書いて送るのでBODYを書く前じゃないと使えない

学習

VB6と同じように扱えるらしいです。
VBはあんまり好きじゃないんだけどなあ……。

注意

投稿者 miff : 15:26

2005年09月06日

みふでもわかるPHP - 1

テスト環境

CLI(Command Line Interface)が動かなかったので普通に鯖経由で。

出力

test.php

<?php
echo "Hello World\n";
echo("Hello World\n");
print "Hello World\n";
print("Hello World\n");
?>
<?="Hello World\n"?>
Hello, World

本来なら色んなタグ(<html><head><body>等)で修飾せねばなりませぬが、
テストするだけなのにそんな物付けるの面倒なので。

・単純出力にはechoとprintの二種類があり、双方共関数では無い
・文の末尾にはセミコロンを付ける必要がある
・<?php - ?>の間にPHP文を入れる
・phpタグの間以外に書かれた物は単なるHTML文として出力される

$hour = 10; $min = 50; $sec = 20;
printf("%d時%d分%d秒",$hour,$min,$sec);
$time = sprintf(""%d時%d分%d秒",$hour,$min,$sec);

懐かしのprintfとsprintfが出てきました。使い方も同じです。
また、変数は宣言する必要も型の区別も無い代わりに頭に'$'を付けなければならないようです。

$time = $hour.$min.$sec;
echo $time;
$timec = $hour + $min + $sec;
echo $timec."<br>";

'.'は文字列連結演算子です。
また、使う先によって文字列や数値の区別は勝手につけてくれます。
また、どう判別しているのかよくわかりませんが、文字と数値を+しても反映されません。

その他基本的な文法

for while if-else 等基本的にC形式。
この辺が全然違うとごっちゃになるので嬉しい。そういえばJAVAやJSでも一緒だったなあ。

""は特殊文字を特殊文字として解釈する時、''は特殊文字を自動エスケープする時に使うのが違うところ。

__LINE__これが書いてある場所の行番号
__FILE__ファイルのフルパス
__FUNCTION__関数名
__CLASS__クラス名
__METHOD__クラスのメソッド名

デバッグ用でしょうね、きっと。

追記

ところで、赤本は体系的に関数をお勉強みたいな感じの構成じゃないのでちょっとまとめるには時間を置いて知識を集積する必要がありそうです。
続くとしたら読書メモに。

投稿者 miff : 23:25 | コメント (0)

2005年09月03日

みふでもわかるC++番外篇 - ばらばらな物をまとめて扱う

static

クラスで共有するメンバを持つにはstaticを宣言する。
ただし、別に定義も行わなければ参照エラーが出る。
よって、使い方としては

class HOge{
public:
static int val
};

int HOge::val = 0;

list

描画対象オブジェクトは可変数、可変種存在できなければなりません。
つまり、言い換える必要は無いと思いますが、ある時点でいくつ存在するかわからずどんな種類の対象が存在するかもわからないという事です。
しかしだからといって、これを対象毎に制御していてはどんどんスパゲティーになっていき、最後にはにっちもさっちも行かなくなる事は目に見えています。

もっと具体的な書き方をしますと、
色々な種類の画面上オブジェクト毎にクラスを作りそれを制御するわけですが、当然状況によって存在するインスタンスの個数も変わるわけです。
また、描画を行うにはそれぞれのオブジェクトに描画をするようメッセージを渡す必要があるわけですが、様様なクラスから作られたインスタンスが入り混じっている状況で一括してメッセージを送る事はできないだろうか、という事です。

そこで登場するのがstatic宣言なのです。
上述の通り、staticな変数はそのクラスから作られたインスタンスで共有する事になり、インスタンスを通さずに参照できます。
つまり、staticなポインタから成るリストを作り、コンストラクタで自分自身をそのリストに追加し、デストラクタで削除するようにすれば良いのです。
描画を行う際にはこれまたstaticな関数(これまたインスタンスを通す必要が無いのです)でリストを辿り、順にメッセージを渡せば面倒無しに問題が解決できそうです。

しかし、staticな変数と言えどもその範囲は同じクラスのみであり、「様様なクラスが入り乱れる状況」においては複雑さが変わらないのではないでしょうか?
では、描画を必要とするクラスは全て一つの基底クラスから派生させるとしたら?
例えば基底クラスAから派生したクラスBがあるとして、AのポインタをBに向ける事が可能です。
ですから、基底クラスにおいてAのポインタを始点とするリスト構造とそれを辿る関数を用意しておき、必要な際に使用するようにすればこの問題は解決できると言えます。
もちろん、描画を司る関数を仮想関数にしておく等細かい部分のケアは必要ですが、大枠はこれで可能

……なのでしょうか。
JAVAの記憶+αで書いているので嘘だらけかもしれません。
理論上は行けると思うんですよ。きっと。
これがうまく行くのならば、色々便利なのです。だからどうかうまく行きますように。お願いしますです。

投稿者 miff : 09:58 | コメント (1)



XREAAD