あるディレクトリの存在を隠したいが,不特定多数の外部ホストからそのディレクトリの中の CGI にアクセスできる必要があり,しかし .htaccess でゴニョゴニョ設定するのは面倒くさい ( 正直に言えば,やり方が分からない ) 場合があると思います。具体的には今の私がそう。
ブラクラチェッカーの管理は毎日行う必要があるんだけど,大分に帰省中は FTP で接続できません。だから「ブラクラチェッカーを管理する CGI」を書きました。必要なディレクトリ内に必要なメンテナンス CGI を配置して帰省に臨むのです。そしてこの CGI の存在が一般のユーザにバレると厄介なので,ディレクトリの存在ごと隠蔽できれば良さげ。
こんなトリックを思いつきました。
#!/usr/bin/perl -w
use strict;
binmode(STDOUT);
print "Status: 404\r\n";
print "Content-type: text/html\r\n\r\n";
print <<"HTML----------------------------";
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
The requested URL $ENV{'REQUEST_URI'} was not found on this server.<p>
<hr>
<address>Apache/1.3.26 Server at www.jah.ne.jp Port 80</address>
</body></html>
HTML----------------------------
これを実際に設置してみました。次の URL にジャンプしてみてください。
http://www.jah.ne.jp/~fild/cgi-bin/stealth-test/ ( 存在するはずの場所 )
http://www.jah.ne.jp/~fild/cgi-bin/stealth-test/index.cgi ( 存在するはずの場所 )
http://www.jah.ne.jp/~fild/cgi-bin/stealth-test/not-exists ( 本当に存在しないファイル )
http://www.jah.ne.jp/~fild/cgi-bin/stealth-test/exists.htm ( これはアクセス可能 )
最後の URL にはアクセス可能。このファイルがダイレクトでバレない限り,ユーザにディレクトリの存在がバレる事はないと思います。
.htaccess と何が違うのかと問われると,弱いわけですが。
どうも WindowsMediaPlayer の起動がまったりし過ぎるので,マシンを再起動したのです。とりあえず正常にリブートを始めたっぽいんですが・・・
C: ドライブのスキャンディスクが始まったっ!?
ビビりました。しかも進行は遅く,途中で scandisk が再起動して完全チェックまで始めやがりました。クラスタを全て走査します。30 分かかります。
・・そういえば私は昨年も HDD がダメになった瞬間に立ち会っています。これは某 fj2 社の HDD で,粗悪コントロールチップが熱で変質してしまったのが原因。そのわずか 1 年でまたもや HDD がイカれますか? そういうギャグは勘弁してくれませんか神様?
心臓のドキドキに耐えながら 30 分経過,なんとかスキャンディスクは終了。急いで C:\SCANDISK.LOG のログをテキストエディタで開きます。どのファイルがダメになったのか,ヒントがあるかも知れません。
ドライブ WINDOWS (C:) のエラー :
このドライブにはエラーはありませんでした。
はっ・・・焦らせやがってっ!!
こんなフォームがありましたとさ。
これを submit すると
$ENV{'CONTENT_TYPE'}multipart/form-data; boundary=---------------------------265001916915724
-----------------------------265001916915724[CRLF] Content-Disposition: form-data; name="file"; filename="hoge.txt"[CRLF] Content-Type: text/plain[CRLF] [CRLF] ( hoge.txt の内容 )[CRLF] -----------------------------265001916915724[CRLF] Content-Disposition: form-data; name="inputCtrl"[CRLF] [CRLF] input text data[CRLF] -----------------------------265001916915724--[CRLF]
"------265001916915724" みたいなセパレータでそれぞれのフィールドが分けられている事が分かります。最後は余分な "--" にも気をつけてね。どうやらこのセパレータ,環境変数 $ENV{'CONTENT_TYPE'} の boundary=... の部分から得ればよいと思いませんか?
思ってはいけません。
あー,いやいいんだけど,注意しなければなりません。この boundary=(.*) で得られた文字列とそれぞれのセパレータは,ちょっと違います。
↓boundary=(.*) の文字列 ---------------------------265001916915724 -----------------------------265001916915724 ↑セパレータ
セパレータはそれぞれ頭に余計な "--" が付くようです。ちゃんと RFC1867 にも例が載ってあるし,よく読まないとね > 自分
そろそろ関東地方も梅雨明けしてよい頃なんだけど,今日も雨で寒いのです。室内気温 26 度,室外気温 18 度。本当に夏なのか!?
私は 8 月の中旬に大分に帰り,3〜4 日ほど山に篭ります。このイベントのために人生を過ごしていると言っても過言ではありませんマジで。この日に安心して確実に里帰りをするために,まず就職口は選ぶ必要があります。行動も慎む必要があります:8 月の中旬に用事を作ってはいけません。早目に帰省プランを立てる必要があります。ノートパソコンに,最新の作業環境を移す必要があります。
そして・・サイトの管理,どうするよ。
cgi.coara.or.jp に置いてある CGI は,私のノートパソコンから FTP でいじる事ができるのです。しかし jah.ne.jp に置いてある CGI はこれが不可能。専用の ISDN 回線でないと何にもアクセスする事が出来ません。よって jah.ne.jp にあるファイルを外部からダウンロード,アップロード,もしくは編集できるような仕組みを仕込んでおく必要があります。
今,そのためのアップローダを作っていたりします。RFC1867 "Form-based File Upload in HTML" を参考にしてね。
Perl の構造体の中身をファイルに保存して次の実行時に利用するには 2002-07-07 を用いる事が考えられます。しかしこれでは,掲示板の書き込みのように大量の件数の構造体をシリアライズするには不向きなんじゃないかと。
ファイルのフォーマットをこうする時:
[key1]value 1-1[key2]value 1-2[key3]value 1-3 [key1]value 2-1[key2]value 2-2[key3]value 2-3 [key1]value 3-1[key2]value 3-2[key3]value 3-3 ...
この 1 行分を分解,構造体に収めるには? こんなコードを書いてみました。
# 1 行を構造体に分割する
# @param データ行
# @returns 構造体のリファレンス
sub parse_line {
my %result = ();
if ( $_[0] =~ /[(.*?)]([^\[]*)/ ) {
do {
my ($key, $value) = ($1, $2);
# ここで $value に対して汚染チェックなど。。。
if ( ref $result{$key} eq 'ARRAY' ) {
push @{$result{$key}}, $value;
}
elsif ( defined $result{$key} ) {
$result{$key} = [ $result{$key}, $value ];
}
else {
$result{$key} = $value;
}
} while ( $' =~ /[(.*?)]([^\[]*)/ );
}
return \%result;
}
あれれ,2003-06-22 のデータ行を分割するコードよりもなんだか複雑な事をやっています。これは,例えば次のように 1 つのキーに複数の値が存在するようなデータ行について
[multikey]value 1[multikey]value 2[multikey]value 3
次のようなリストを持つ構造体を作る事ができるのです。
my %result = (
multikey => [
'value 1',
'value 2',
'value 3',
],
);
さてこのネタ,続けるべきか続けないべきか。。。
2ch のム板だったかなあ? 多数の掲示板をヲチしているので,情報の出所をすぐに忘れてしまうのが私の唯一の悪い癖です。だいたいこんな感じのやりとりがありました。
case WM_DESTROY: ::ShowWindow( m_hwnd, SW_HIDE ); ::PostQuitMessage( 0 ); return 0;質問:上記は Windows のとあるバグを回避するためのコードとの事。
WM_DESTROYの時にウィンドウをSW_HIDEで隠す事により,バグが回避できるらしい。一体どのようなバグがあるのか?回答:タスクバーに空のボタンが残るバグがある。なお,Microsoft はこれを仕様と主張している。
・・だそうで。バグの再現方法が分からないので少しもどかしいんだけど,これはどのアプリケーションでも常識として実装されているのかなあ?
まだまだ私の知らないバグ・バグ回避が沢山あるはずなので畏れ。いつまでたっても Windows プログラミングを極める事ができませんよ?
何かの事件に関連して,法務局が 2ch に投稿された記事 500 件以上について削除要請を出した,と,中野サンプラザのデカい電光掲示板に表示されていました。
2ch と言えば個人が運営する中では日本最大のサイト。そんなのが社会問題となって,よせばいいのに中野サンプラザの電光掲示板で,中央快速線のホームから普通にその名前を拝む事が出来るなんて。
相変わらず時代が進むのが速すぎ ("早すぎ" でなくて )。
私の愛 IDE "VC++5.0" は,正確には "Visual Studio 97 Learning Edition" という製品。当時は何が何だかサッパリ分かっていなかったので,一番安いものに手を出したのです。しかしドキュメントにおいて Win32 API をあまり網羅していなかったり,OLE / COM についても詳細なドキュメントが見つからなかったりと,"Learning" にしてはあまり親切な製品ではありませんでした。
ふと Microsoft のサイトで "Visual Studio 97 Service Pack 3" なる文字列を発見。そう言えば私の VS97 の箱には "Service Pack" の文字は書かれてありません。これはおそらく,何のサービスパックも付属していないはず。ああそう言えば,今まで気付きませんでした ── いやむしろ,今さら VS97 のサポートなんか・・と諦めてさえいたのです。
4 時間かけて 100MBytes をダウンロード。.exe ファイルを実行すると一気に .cab ファイルが展開されました。そして VS97_SP3\jpn\readme.wri を開いてみたのです。
重要 Visual Studio 97 Service Pack 3 は、Visual C++ 5.0 Learning Edition には対応していません。
_| ̄|○ 神様なんていない。
今日からサービス開始。例えば "http://日本語ドメイン名協会.jp/" とかね。もちろん「日本語ドメイン名協会」なんて文字列そのままで DNS を引けるわけではなく,この日本語文字列にちょっとした処理を施してから,普通に DNS でアドレスを検索する仕組みのようで。その簡単な解説を「国際化ドメイン名」というページで知ることが出来ます。
「日本語ドメイン名EXAMPLE。jp」(ユーザが入力した文字列)
↓ NAMEPREPによる正規化
「日本語ドメイン名EXAMPLE.jp」
↓ Punycodeによる変換
「xn--example-6q4fyliikhk162btq3b2zd4y2o.jp」
2 番目,英文字が「EXAMPLE」と大文字になっているのはただの typo ? それはともかく「。」をピリオドに変換する事まで仕様に含まれているのには仰天。やっぱりそういう需要が多いんだろうなあ。。。
仕組みを詳しく知るにはソースを読むのが一番。"idnkit" なるものが公開されています。また,これに関する RFC は以下の通り:
勉強してみるべし。
・・自分への戒めです。vector も string も,私が欲しいと思う機能はちゃんとついています。演算子は私が想像していた通りに動くし,コンストラクタは非常に使いやすく出来ています。vector クラスの push_back() だって非常に感覚的に使えます。もっともっと vector<string> を使っていくべきです自分。
プランクトンはみじんこに食べられ,めだかに食べられ,フナに食べられ,ねこに食べられます。出力結果はこう:
+ねこ--------------------+ |+フナ------------------+| ||+めだかの学校は川の中+|| |||+みじんこ----+ ||| ||||プランクトン| ||| |||+------------+ ||| ||+--------------------+|| |+----------------------+| +------------------------+
string クラスは本当によくやってくれます。
ところで,今日の笑うトコロはここ:
plankton | waterFlea | killifish | crucianCarp | cat;
or 演算子で,UNIX のパイプの真似事をやっちゃっています。いつもこんな事ばかりやって遊んでるから,他の人のクラスも信用できなくなるんじゃないの自分? とりあえず自分を小一時間問い詰めれ自分?
驫麤:Unicode で 0x9A6B 0x9EA4。今まで私が出会った中で最高の煽り文句です。さーて,回線切って首以下略。
「セキュリティホール memo」( by 小島肇さん ) より。IE で c:\aux に行こうとするとフリーズするとの事。どことなく concon 問題と似た雰囲気です。
WinXP, 2k, Me でも確認されており,問題はかなり広く拡がりそうです。また IE6 および IE5 の両方で問題は確認されているので,殆どの人がこの問題を抱えているかと。
もっとも「img src="c:\aux"」 としても 「a href="c:\aux"」 としても,また HTTP ヘッダの Refresh や Location で飛ばしても問題は起こらないので,ブラクラとして応用される事はなさそうです。ただし「a href="c:\aux"」や Refresh でアクセスした場合,アドレスバーには 「C:\AUX」 という文字列が残っています。迂闊に Enter キーを押さないように注意しなければなりません。
・・・おっとっと,驚愕の事実発見。なんと,この問題に一番弱いのは Mozilla だったりします。Mozilla 1.5a + WinMe で試したところ,アドレスバーに 「file://c|/aux」と入力,Enter キーを押すと OS ごと固まりました。また 「a href="file://c|/aux"」で何回かジャンプすると,やはり OS ごと固まります。
Opera はさすがに強固。何の問題も起こらないようです。
このオープンな web 上において,時を重ねるごとに HTML やスクリプトを「盗まれたくない」という声が高まって来ているようです。そこで Microsoft がリリースしたのが「スクリプト エンコーダ」。JScript をわけのわからない文字に置き換える事で,その要求に応えています。もちろん InternetExplorer 専用ですが。
<!-- この文字列はデタラメです -->
<script language="JScript.Encode">
"--j@`$$&3oog;eosAS+:!"&%<;K@{`2n...
</script>
しかしまぁエンコードされたものはデコードしたくなるのがハカーの性 ( saga )。デコーダを書いた方もいらっしゃいます。
これで Mozilla や Opera でも,エンコードされたスクリプトを動かす事が可能です。よろしくお願いします>開発者様
ん,他人任せカコイイ。
結構前の事なんだけど,2ch でこんなネタを見かけました:C 言語に,知られざる演算子が存在していた模様です。古いコンパイラでまれにサポートされていたんだけど,なぜかドキュメント化される事無く忘れ去られてしまいました。しかし現在でもほとんどのコンパイラでこの演算子は有効だとか。
*/=a */= b; は,a に b を掛けて b で割り,a に戻す。/*=a /*= b; は,a を b で割って b を掛け,a に戻す。整数演算の場合,もちろん,小数は切り捨てられる。具体的には,このようなコードになります:
int a = 15, b = 15;
// a = a / 10 * 10;
a /*= 10;
// b = b * 10 / 10;
b */= 10;
printf( "a=%d, b=%d\n", a, b );
a=10, b=15
みなさんもぜひお試し下さい。コーディングする際には,文法に従って色分けのされないエディタを使ってみてはどうでしょう?
あはは。( ・・しまった,予期せぬ脱力だ! )
UNIX/Linux 界隈で盛んで,Win32 にも移植されたようなソフトウェアをダウソした場合は,ぜひ bin ディレクトリを覗くべきだと思いました。面白い発見があります。
こんなコードを書いて見ます。
@echo off
if "%OS%" == "Windows_NT" goto WinNT
perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
goto endofperl
:WinNT
perl -x -S "%0" %*
@rem WinNT はここでエラー処理をするべき -- Perl の bin フォルダ参照
goto endofperl
--------- この下から perl コード -----
(ちなみにこの部分はバッチとしても Perl としても認識されていないので
自由にドキュメント等の記述が可能)
#!/usr/bin/perl -w
print scalar localtime time, "\n";
__END__
--------- この上まで perl コード -----
(この部分もやっぱりバッチとしても Perl としても認識されていない)
:endofperl
このバッチファイルをコマンドライン上で動かすと現在時刻が表示されます。Perl のスイッチ -x と,一般的にアプリケーションの第 0 引数が自分自身の名前である事を上手に利用しています。
Windows2000 では .pl ファイルを perl に関連づける事で,特にこのようなバッチファイルを書く必要はありません。しかし Win9x / WinMe ではなぜか関連付けを行っても自動では Perl インタプリタが実行されません。そんな時にこの技は非常に便利。
これに "=head1 NAME" みたいな ( これの文法はよく知らないんだけど ) ドキュメント生成用のタグを付加する事で,Perl コードの実行およびドキュメント生成が 1 ファイルで可能になったりします。まさに至れり尽せり。
で,Perl 6 まだぁ?
ソフトウェアと建築物は,「設計」したり「構築」したりと,なかなか似た所が多いと考えられています。・・が,なぜかソフトウェアは建築物とは違い,
なぜなんだろう? 暇を見つけて考えているんだけど,ぜんぜん分かりません。。。
ソフトウェアの価格は著作権を根拠として設定されています。おお,なんだか芸術家みたい。
しかし Netscape や Real,Yahoo!,Google,それに Linux 周辺産業などから観察できる通り,エンドユーザーから何らかの対価を得ずとも,それなりに繁栄は可能なようで。
ゲーム業界も同じ事が可能ではないかなと思うですよ。
・・アクアプラスは過去に「アビスボート」というゲームをファンクラブ会員に無料で配布した経験があるようですが,それでも無名のままで終わったね。上記のどこか途中のプロセスで途絶えたら大赤字となるわけで,ダメダメですか。うーん・・・