更新時刻順

HyperEstraier の Perl Binding を使ってみた。

Last Update: 2005-10-04 (Tue) 18:46

Hyper Estraier になって、色々外部のプログラムからも扱いやすくなっているようなので、いまさらながら試してみました。

プログラミングガイド だけでは良くわからなかったのと、Perl でやってる人が見付からなかったので、ここにサンプルを載せておきます。

単純にデータベースを開いて、検索を実行し、パスの一覧を表示するだけのスクリプトです。

以下のスクリプトを作成するにあたって、HyperEstraier の Python Binding できた が参考になりました。

» 続きを読む...

△トップ | コメント (2) | トラックバック(1)

配列の全ての並び順を取得する

Last Update: 2004-01-30 (Fri) 15:19

他所で書く機会があったので、せっかくなのでメモ。

例えば、これを実行すると、

3,2,1
3,1,2
2,3,1
2,1,3
1,3,2
1,2,3

を返してくれる。

» 続きを読む...

△トップ | コメント (0) | トラックバック(0)

perlcc 評価

Last Update: 2004-01-22 (Thu) 15:09

他所で perlcc をテストしてみる機会があったので、せっかくなので日記にも記録しておく。perlcc てのは、perlスクリプトを実行形式にコンパイルしてくれる物。

TD-Board (掲示板スクリプト) がコンパイル出来て普通に使えたので、これでテスト。

apache 付属の ab コマンドで調査。(ab -n 100 -c 10 (10の同時接続を10回実行して計100リクエストを処理)) これを10回実行し、平均を算出。

» 続きを読む...

△トップ | コメント (0) | トラックバック(0)

無限フォームからのPOST送信の弊害

Last Update: 2003-12-09 (Tue) 17:26

私も バッドノウハウ という奴に毒されているのか、Perl のスクリプトを書く時は大抵が以前作ったコードを何の疑いも無くコピペしており、内容の完全性については結構おろそかにしてしまっている場合が多々あります。

というわけで、前々から疑問に思っていた「FORM から POST する量には制限はないの?」について調べてみた所、結構嫌な結果になってしまいました。

結論から言うと、合計1.3MB程度でINPUTフィールドが1万個あるフォームがすんなり送信出来ました。

これはつまり、POST されたデータを受け取る段階で、サイズもフィールドの数も考慮しないで処理を行った場合、無駄に1万回のループを発生させる事が可能という事を示しております。1万個以上は試していないのですが、何となくメモリの許す限りループしそうな気はします。Perl だし。

うちのショボイスペックのサーバで検証した所、このフォームを送信した場合の処理速度は、何もない時に比べて200倍以上の時間が掛かりました。途中で jcode なんかで文字コードを変換したりすると、もっと時間が掛かってしまう事でしょう。

フィールド数を数えて、ある程度まで行ったらエラーを出すのと、length 等をチェックして、異常に大きい場合はエラーを出す、両方の対策をした方がいいでしょう。片方だけ対策しても駄目。

ざっと調べてみた所、この脆弱性(?)が発生すると考えられるデコード処理を行っている方は 結構いそう な感じです。お気付きの通り私も対策をしていませんでした。

ついでに言うと、Cookie の処理についても同じようにループ処理させている場合、やっぱり沢山ループしてしまうかもしれません。未検証なので不明ですが、気を付けるに越した事はないですね。

ところで、FORM から POST する量に制限はないんですか?:-)

ちなみに箱庭諸島はループ処理を行っていないので、箱庭管理人の方は安心して下さい。(笑

△トップ | コメント (3) | トラックバック(0)

CGI での HTTP_* に関するクロスサイトスクリプティング脆弱性

Last Update: 2003-10-27 (Mon) 11:35

※この脆弱性は おでん田中さん2ちゃんねる のどっかのスレッドで発見した物です。私はこれで何が出来るか、という部分を検証したりしてみました。クロスサイトスクリプティング脆弱性については、IPA の解説等を参考にして下さい。

これを知った時はびびりました。なんせ、自分が作ったCGIスクリプトで USER_AGENT を表示する奴は全部汚染しているからです。

HTTP_USER_AGENT はブラウザの識別子の事で、例えば InternetExplorer なら Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) 等と決まってるわけですが、この USER_AGENT はその辺にあるサードパーティ製のブラウザを使えば自由に編集可能です。自分の好きな名前を名乗る事が出来るんですね。

実はこの USER_AGENT に、実行可能なタグを埋め込んだりする事も出来ちゃう、というのが今回のお話しです。

» 続きを読む...

△トップ | コメント (8) | トラックバック(0)

PerlMagick

Last Update: 2003-05-26 (Mon) 13:15

ImageMagick の Perl 用フロントエンド(?)です。画像を色々といじれます。

まず、example.jpg のサイズを半分にします。Read で読み込み、Minify でサイズ変更、Write で書き出しです。

#! /usr/bin/perl
use Image::Magick;
$img_file = "example.jpg";
$i = Image::Magick->new; $i->Read($img_file); $i->Minify(); $i->Write("$img_file");

» 続きを読む...

△トップ | コメント (2) | トラックバック(0)

Benchmark

Last Update: 2003-05-26 (Mon) 11:21

Perl の処理速度を比較するために使用するモジュールです。複数の処理の処理速度を求めて比較できます。

URL デコードの二つを例にします。「Perlの小部屋」という文字列をデコードしています。

#! /usr/bin/perl
use Benchmark;
$count = 100000; $value = "Perl%E3%81%AE%E5%B0%8F%E9%83%A8%E5%B1%8B";
timethese($count, {'TEST1' => '&test1;', 'TEST2' => '&test2;', });
sub test1 { $str = $value; $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1 )/eg; }
sub test2 { $str = $value; $str =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C", hex($1) )/eg; }

» 続きを読む...

△トップ | コメント (0) | トラックバック(0)

Perl で四捨五入の計算をする

Last Update: 2003-05-25 (Sun) 18:41

0.5 を足してから int します。負の値に対しては 0.5 引いてから int です。

$one = round(190.5); # $one = 191
$two = round(-30.2); # $two = -30
sub round { my $var = shift; my $a = ($var > 0) ? 0.5 : -0.5; return int($var + $a); }

△トップ | コメント (0) | トラックバック(0)

Perl2Exe

Last Update: 2003-05-25 (Sun) 15:12

Perl2Exe なんて使ってる人はあんまり居ないようで、情報が少ないので紹介してみます。自分も全然使ってませんが、こういうのもあるんだよって事で。

Perl2Exe は、Perl で作ったファイルを EXE ファイルにしてしまおうという何とも素晴らしいものです。EXE の実行だけだったら、Perl をインストールしてある必要はありませんからね。

シェアウェアらしく、料金を払わない場合は出来上がった EXE を実行した時に広告メッセージが表示され、使用期間も30日間のようです。

» 続きを読む...

△トップ | コメント (7) | トラックバック(1)

Perl で切り上げの計算をする

Last Update: 2003-05-24 (Sat) 10:40

1 を足してから int します。負の値や整数に対しては、そのまま int です。

$one   = ceil(19.1);  # $one   = 20
$two   = ceil(-30.5); # $two   = 30
$three = ceil(5);     # $three = 5
sub ceil { my $var = shift; my $a = 0; $a = 1 if($var > 0 and $var != int($var)); return int($var + $a); }

△トップ | コメント (0) | トラックバック(0)

print sprintf のフォーマット

Last Update: 2003-05-24 (Sat) 10:38
%c     文字
%s     文字列
%d     整数 10進数
%o     符号なし  8進数
%u     符号なし 10進数
%x     符号なし 16進数
%lo     8進数 (long)
%ld    10進数 (long)
%lu    符号なし10進数 (long)
%lx    16進数 (long)
%f     浮動小数点

△トップ | コメント (0) | トラックバック(0)

stat 関数の詳細

Last Update: 2003-05-22 (Thu) 10:30

Perl の stat 関数で得られる情報の一覧。

0       デバイス情報
1       i ノード番号
2       タイプ、パーミッション
3       対象ファイルのリンク数
4       オーナー ID
5       グループ ID
6       デバイス識別子
7       ファイルサイズ (byte)
8       最終アクセス時刻
9       最終更新時刻
10      最終 i ノード変更時刻
11      最適ブロックサイズ
12      割当てられているブロック数

△トップ | コメント (0) | トラックバック(0)

CGI 経由のエラー出力

Last Update: 2003-05-22 (Thu) 10:27

CGI 経由でも画面にエラーを表示してくれます。

use CGI::Carp qw(fatalsToBrowser);

他にも KCatch という便利そうなものもあります。

△トップ | コメント (0) | トラックバック(0)

ファイル演算子

Last Update: 2003-05-21 (Wed) 10:35

Perl で取得出来るファイル演算子一覧。

-r    読み込み可能であれば
-w    書き込み可能であれば
-x    実行可能であれば
-o    実行ユーザーと所有者が同一であれば
-R    実行ユーザーでなく、実ユーザーで読み込み可能であれば
-W    実行ユーザーでなく、実ユーザーで書き込み可能であれば
-X    実行ユーザーでなく、実ユーザーで実行可能であれば
-O    実行ユーザーでなく、実ユーザーのものであれば
-e    存在すれば
-z    存在し、サイズが 0 であれば
-s    ファイルサイズを返す
-f    通常ファイルであれば
-d    ディレクトリであれば
-l    シンボリックリンクであれば
-p    名前付きパイプであれば
-S    ソケットであれば
-T    テキストファイルであれば
-B    バイナリファイルであれば
-b    ブロック型の特殊ファイルであれば
-c    キャラクタ型の特殊ファイルであれば
-u    setuid ビットがセットされていれば
-g    setgif ビットがセットされていれば
-k    sticky ビットがセットされていれば
-M    最終更新時刻からの日数
-A    最終アクセス時刻からの日数
-C    最終 i ノード変更時刻からの日数
-t    ファイルハンドルが tty としてオープンされていれば

△トップ | コメント (0) | トラックバック(0)

正規表現

Last Update: 2003-05-20 (Tue) 13:22

演算子やらメタ文字やら色々覚えなきゃいけない事が多い正規表現の解説。

文字クラス

-    範囲
^    先頭に置くとそれ以外にマッチ
/[01234567]/ 0~7 までの数字 1 文字にマッチ /[0-9\-]/ 数字 1 文字かマイナス文字 1 文字にマッチ /[^0-9]/ 数字以外の 1 文字にマッチ /[a-zA-Z]/ 英字 1 文字にマッチ /[0-9]+/ 1 文字以上の数字にマッチ

» 続きを読む...

△トップ | コメント (2) | トラックバック(0)

変数についての覚書

Last Update: 2003-05-20 (Tue) 12:12

Perl での変数の取り扱いについて。

2 つの変数の入れ替え

($one, $two) = ($two, $one);

ハッシュを値でソートする

%Hash = (a => 200, b => 1200, c => 300);
@Keys = sort { $Hash{$a} <=> $Hash{$b} } keys %Hash;
foreach my $key (@Keys){ print "$key , $Hash{$key} \n"; }

ハッシュの要素数取得

$num = keys %Hash;

△トップ | コメント (0) | トラックバック(0)

 
Copyright (C) Kyosuke Takayama, Some rights reserved.