Skip to main content

7 posts tagged with "HTML"

View All Tags

Java: 複数クライアントでの自動Web(HTTP GET)レスポンス計測ツール

· 4 min read
Yu Sasaki
Enterprise Security Manager / Advisor

これは何?

  • 少数(1〜数台)のクライアント環境から多数のWebアクセスのエミュレート及びそのレスポンスを計測する際に活用するコード。
  • 指定のURLにGETリクエストを送出し、そのレスポンス(ボディ)データと処理時間(リクエスト送出からレスポンス受信まで)を算出。 ※一般のブラウザのようにレスポンス取得からデータの描画までの処理時間は含まれない。
  • main()内でスレッドプール(Webクライアント数)とタスク(合計アクセス数)を生成。仮にクライアントが応答無しになった場合は、最大awaitTime秒待って強制終了する。
  • このツールを使用した際の評価の書き方としては「XクライアントからのY時間あたりZアクセス数が発生した時のAAA(サーバ負荷|クライアントのレスポンス時間[最大|平均|最小])」の用になる見込みだが、Yを計測するコードは入れていない。。。(若干わかりにくいので、もっと簡潔な表現に落とす必要があるかも)
  • URLの指定はコマンドラインパラメータからできるように修正した方が良かったが、時間の関係で割愛している。(URLの修正にいちいち再コンパイルは手間ではある)

使い方は?

  • 下記のソースをJavaでコンパイルし、java Mainコマンドで実行する。(Eclipseがあればそれを使用すると手間が省ける)
  • アクセスURLとパラメータには気をつけること(外部サイトを指定してDOS攻撃に間違えられないように、自分のサーバか、localサーバなどを使用すること)
  • 現状実行結果を標準出力している。スレッドセーフな整形ログ出力を追加で書き込むのも良いし、標準出力内容を簡易的にして、プログラムの実行結果をファイルにリダイレクトするのも良い。

Linux: ルーティングでネットワーク遅延環境を構築 - iptables, tc

· 5 min read
Yu Sasaki
Enterprise Security Manager / Advisor

LinuxにiptablesのNAT設定とtcコマンドでネットワーク遅延環境を模擬的に構築してみたので、その手順を以下に記載する。欲を言えばクライント、サーバ側はStatic Routeに従ってルーティング出来るようルータールールの設定をしたかったが、リソース(主に時間)の関係上割愛。

環境

今回はMacのVMWare fusionで下記の3環境を用意した。左下のCentOS(ルーター部)以外は特にLinuxでなくとも良い。

192.168.11.8
+------------------+
| Kali Linux |-----+
+------------------+ |
+------------------+ | +-----------+
| CentOS (iptables)|-----+-------| BackTrack |
+------------------+ eth0 +-----------+
192.168.11.7 192.168.11.9

検証のイメージとしては、BackTrackからCentOS当てへのHTTPリクエストをKail Linux側へ転送、そのレスポンスをKali Linux経由でBackTrackが受信、Webページの表示を行う。CentOS側のインターフェイスに対してdelayをかけることで疑似的な遅延環境となる。(BackTrack側でtcコマンドを実行すれば話が早いのだが、上記であれば両端の環境がLinux以外のOSでかつ遅延設定できない環境でも対応できる)

Python: SimpleHTTPServerでWebサーバをたてる

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

Python のみでWebサーバを提供できるのでその動作確認。今回は下記SimpleHTTPServerモジュールを使用する。

import SimpleHTTPServer
SimpleHTTPServer.test()

上記コードを実行すると下記のようにWebサーバをポート8000番(デフォルト)で提供する。

Java, JSP: 現在時刻が指定期間内か判定する - GregorianCalendar#before、after

· 3 min read
Yu Sasaki
Enterprise Security Manager / Advisor

日時を扱うクラスはDateとGregorianCalendarがありますが、Sunは後者を推奨しているようです。実際GregorianCalendarのほうが扱いやすいです。下のサンプルは、現在時刻が指定した期間内か否かを判定するものです。

ソースコード

<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@page import="java.util.*" %> <%! final int MONTH_OFFSET = 1; String showTime(Calendar cal) { String str; str = cal.get(Calendar.YEAR) + "/" + (cal.get(Calendar.MONTH) + MONTH_OFFSET) + "/" + cal.get(Calendar.DATE) + " " + cal.get(Calendar.HOUR) + ":" + cal.get(Calendar.MINUTE); return str; } boolean isPeriod(Calendar start, Calendar end) { Calendar cur = Calendar.getInstance(); return cur.after(start) && cur.before(end); } %> JSP Date Comparison

# JSP Date Comparison

<% // (year, month, date, hour, minute) monthの範囲は0-11で1月は0 Calendar startTime = new GregorianCalendar(2009, 2 - MONTH_OFFSET, 23, 21, 0); Calendar endTime = new GregorianCalendar(2009, 2 - MONTH_OFFSET, 23, 21, 10); out.println("開始時刻: " + showTime(startTime) + "
"); out.println("終了時刻: " + showTime(endTime) + "
"); if (isPeriod(startTime, endTime)) { out.println("現時刻は指定期間「内」"); } else { out.println("現時刻は指定期間「外」"); } %>

日時の比較はGregorianCalendar#after、beforeメソッド以外にint compareTo(Calendar cal)等もあります。 実際に使う際、期間を指定するGregorianCalendarのコンストラクタの引数データは他の入力から受け取るようにします。

実行結果例

本日の21:05に計ると…

JSP Date Comparison
開始時刻: 2009/2/23 9:0
終了時刻: 2009/2/23 9:10
現時刻は指定期間「内」

追記: SimpleDateFormatによる出力の整形

d_kamiさんに改良していただきました。ありがとうございます(^-^)

String showTime(Calendar cal) { Date date = cal.getTime(); SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm"); return format.format(date); } と書けばすっきりするよ、import java.text.SimpleDateFormatを忘れずに - SimpleDateFormat - マイペースなプログラミング日記

showTimeを修正して計りなおした実行結果は、

開始時刻: 2009/02/23 21:00
終了時刻: 2009/02/24 21:10
現時刻は指定期間「内」

確かに出力はyyyy/MM/dd HH:mmの形式になっていて見栄えも良いです。

参考サイト

PHP: フォーム情報の送信・受信 - POSTメソッド

· 3 min read
Yu Sasaki
Enterprise Security Manager / Advisor

HTMLフォームの情報をPOSTメソッドで送信し、送信されたデータをPHPスクリプトで取得しHTMLに埋め込み表示してみます。フォームの各フィールドははformタグ中でinput、select、textareaタグ等を用いて指定します。特にinputタグは下表の様にtype属性が色々あります。

inputタイプtype属性
テキスト入力type="text"
パスワード入力type="password"
ラジオボタンtype="radio"
チェックボックスtype="checkbox"
送信ボタンtype="submit"
ボタンtype="buttun"

フォームデータの送信先はformタグのaction属性で指定します。また、そのときのリクエストメソッドの指定はformタグのmethod属性で指定し、ここではPOSTを用いるのでmethod="post"と記述します。POSTはGETメソッドと異なり特に文字制限はありません。

ソースコード

form_test.html

HTMLフォーム情報の送信テスト

ID:
PASS:
性別:男性 女性
学年: 1年生 2年生 3年生 4年生
所有デジタル機器: PC Cell
コメント:

フォームデータは同ディレクトリに設置したshow_form_data.phpファイルに送信しています。

show_form_data.php

$value) { $have_dig[$key] = $value; } } $comment = htmlspecialchars($_POST["comment"], ENT_QUOTES); } else { echo "フォームページからアクセスしてください。"; exit(1); } ?> HTMLフォームのPOSTの受信テスト 送信されたデータは、
ID:
PASS:
性別:
学年:年生
所有デジタル機器:
コメント:

POSTリクエストでshow_form_data.phpへアクセスした場合はexit関数でスクリプトを終了します(→PHP: exit - Manual)。 htmlspecialchars関数で特殊文字をエスケープします(→PHP: htmlspecialchars - Manual)。今回はPOSTメソッドに関する練習用スクリプトなのでバリデーション処理は入れていませんが、実際はセキュリティ対策と合わせて色々フィルタするなり、リダイレクトで別ページに誘導するなりの処理が必要です。最近はこの辺の処理をフレームワークで上手くラップしてくれるのでかなり楽になっています。 あと、余談ですがforeach文では操作対象の配列のコピーを作成して、コピーに対して処理していきます。

実行結果

form_test.html

HTMLフォームへの入力

show_form_data.php

POSTされたデータの出力

Rubyで引数の設定値によって4パターンの部分文字列を取得するラッパー関数

· 2 min read
Yu Sasaki
Enterprise Security Manager / Advisor

引数に設定値を与え、それによって挙動を変えることで、似た機能をまとめてみます。

追記(2008.2.8):正規表現のマッチを保持する変数があったことを失念していました。「$`」マッチした部分より前の文字列、「$&」マッチした文字列、「$'」マッチした部分より後ろの文字列を使えばより簡潔に書けると思いました。

ソースコード

EXCL = true
INCL = false
BEFORE = true
AFTER = false
#
# string 分割する文字列
# delineator 分割する場所
# desired BEFORE: delineator 文字列より前の文字列
# AFTER: delineator 文字列より後の文字列
# type INCL: 分割文字列に delineator を加える
# EXCL: 分割文字列に delineator を加えない
def split_str(string, delineator, desired, type)
low_str = string.downcase # 小文字に揃える(変換)
marker = delineator.downcase
return if (low_str.index(marker) == nil) # delineator に一致しない
if (desired == BEFORE)
if (type == EXCL)
split_pos = low_str.index(marker)
else
split_pos = low_str.index(marker) + marker.length
end
parsed_str = low_str[0, split_pos]
else
if (type == EXCL)
split_pos = low_str.index(marker)+marker.length
else
split_pos = low_str.index(marker)
end
parsed_str = low_str[split_pos, string.length]
end
return parsed_str
end
string = "I'm designing a Web crawler and a Search engine."
p split_str(string, "crawler", BEFORE, INCL);
p split_str(string, "crawler", BEFORE, EXCL);
p split_str(string, "crawler", AFTER, INCL);
p split_str(string, "crawler", AFTER, EXCL);
p split_str(string, "crauler", AFTER, EXCL);

実行結果

"i'm designing a web crawler"
"i'm designing a web "
"crawler and a search engine."
" and a search engine."
nil

単に部分文字列を取得するには

str = "A Web crawler"
p str[6, str.size] #=> "crawler"