« 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はあんまり好きじゃないんだけどなあ……。
■注意
- 予約語や変数名、関数名に大文字小文字の区別はない
- 一文一行が原則。よって文末にセミコロンを付けてはいけない
- True:-1 False:0 そしてTrueは-1の時だけで、それ以外はFalseになる。(C系とは逆)
- elseif。 else if では無い!
- switch-caseが全然違うので注意!しかもbreak無しでスルーさせるのも使えない!(勝手にbreakしやがってくださる)
- for文も全然違うので注意!なんて親切なんだ、死んじゃえ!
- 関数の引数は標準でアドレス渡し。つまりいくらでも関数内で弄れてしまう。なんてこった!
- 引数リストの宣言で"ByVal"キーワードを付けたらOK。絶対忘れないようにしよう。というか普通こっちを標準にすべきじゃないの?
- returnは無い。関数名と同じ名前の変数への代入で代用……何で?
投稿者 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でも一緒だったなあ。
""は特殊文字を特殊文字として解釈する時、''は特殊文字を自動エスケープする時に使うのが違うところ。
- 定数定義:define('foo','constant value'); ← なんだか関数っぽくなってます。
- なんだか関数っぽくなってます。
- ただし、「""」変数展開文字列リテラル内でdefineした単語を使ってもそのままの単語として認識されてしまうので注意。
- マジック定数の存在:アンダーバーは二個一組である点に注意
__LINE__ | これが書いてある場所の行番号 |
__FILE__ | ファイルのフルパス |
__FUNCTION__ | 関数名 |
__CLASS__ | クラス名 |
__METHOD__ | クラスのメソッド名 |
デバッグ用でしょうね、きっと。
■追記
ところで、赤本は体系的に関数をお勉強みたいな感じの構成じゃないのでちょっとまとめるには時間を置いて知識を集積する必要がありそうです。
続くとしたら読書メモに。
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の記憶+αで書いているので嘘だらけかもしれません。
理論上は行けると思うんですよ。きっと。
これがうまく行くのならば、色々便利なのです。だからどうかうまく行きますように。お願いしますです。