七行プログラミング (452レス)
上下前次1-新
196: 195 [sage] 03/12/05 06:42 ID:??? AAS
 >>194194(2): nobodyさん [] 03/12/05 06:41 ID:1VQJofzV(1) AAS
sage機能実装。大幅に機能削ってしまったのでbranch. 
 marge よろしく;-] 
  
 use CGI":all";charset$c='EUC-JP';sub l{a{href,pop},pop}chdir G;sub e{escapeHTML 
 param pop}$d=e(N)||'七氏';($F=e B)=~/[.\/]/?die:($u=($m=e M)=~/sage/?(stat($F)) 
 [9]:0),open F,">>$F";flock F,2;s!\w+外部リンク:.+!l$&,$&!eg,s/\n/br/eg,print F li(b($m? 
 l$d,'mailto:'.$m:$d),localtime.p$_)if$_=e T;$t='スレ';open F;$/='';*x=*textfield; 
 put header,start_html($F||$t),startform,h1($F||$t),$F?ol(<F>).hidden(B,$F).l$t, 
 '?':ol(li[map{l$_,"?B=$_"}sort{-M$a<=>-M$b}<*>]).$t.x(B),br,submit,Name,x(N), 
 Mail,x(M),br,textarea(T,'',7,80,1),endform,end_html;$u&&utime time,$u,$F 
むぅ。(w 
197(1): nobodyさん [sage] 03/12/05 07:03 ID:??? AAS
 >193193(2): 128 [] 03/12/05 03:38 ID:2kvaGCEL(1) AAS
 乙カレーっす。 
  
 7thread ログの形式を変えてみました。 
 今までのログは利用できません。 
  
 あと__DATA__以降にスタイルシートを指定できるようにしました。 
  
 #!/usr/bin/perl 
 use CGI":all";charset$c=Shift_JIS;*i=*param;*x=*textfield;sub l{a{href,pop},pop 
 }sub e($){escapeHTML i pop}chdir G;($F=e B||e S)=~m![./]!?die:open F,">>$F";$t= 
 'スレ';$d=e N||'七氏';flock F,2;s!\w+外部リンク:.+!l$&,$&!eg,s/\n/br/eg,print F li(b(e M? 
 l$d,'mailto:'.e M:$d),localtime.p$_)if$_=e T;open F;$/='';put header,start_html 
 (-title=>$F||$t,-style=><DATAencoding,$c,lang,ja),startform,h1($F||$t),$F?ol( 
 <F>).hidden(B,$F).l $t,'?':ol(li[map{l$_,"?B=$_"}sort{-M$a<=>-M$b}<*>]).$t.x(S) 
 ,br,submit,Name,x(N),Mail,x(M),br,textarea(T,'',7,80,1),endform,end_html 
__DATA__ 
 h1{color:red; font-size:140%;} 
 p {margin:0; padding:0.5em; background:#EEF;} 
お疲れ様。取り急ぎ、動作報告します。 
 Perl5.8.2/CGI.pm3.00, Perl5.6.1/CGI.pm2.752で確認しました。 
  
 -style=<DATA> は、CGIpm/3.00ではlinkのhref属性に入ってしまう。 
 引数の型によってlink, styleの出力を区別してるらしい。see _style method in CGI.pm 
  
 古いバージョンのCGI.pmではxmlのencoding属性の指定は出来ない。 
 <body encoding="..." となるので特に影響はないけど。
198: nobodyさん [sage] 03/12/05 13:00 ID:??? AAS
 >>194 
 *本当に下がる* sage 機能、無理矢理 merge 。:p 
 URL auto link が犠牲に。 
  
 #!/usr/bin/perl 
 use CGI":all";sub l{a{href,pop},pop}sub e($){escapeHTML param pop}($C,$B,$D,@S) 
 =<DATA>;charset$C;chdir G;($F=e B||e S)=~m![./]!?die:open F,">>$F";flock F,2;$s 
 =($m=e M)=~/sage/;*x=*textfield;s/\n/br/eg,print F li(b($m?l e N||$D,'mailto:'. 
 $m:e N||$D),localtime.p$_)if$_=e T;close F;$s&&utime 1,1,$F;open F;put header, 
 start_html(-title=>$F||$B,encoding,$C,lang,ja),style(@S),startform,h1($F||$B), 
 $F?ol(<F>).hidden(B,$F).l Top,'?':ol(li[map{l$_,"?B=$_"}sort{-M$a<=>-M$b}<*>]). 
 New.x(S),br,submit,Name,x(N),Mail,x(M),textarea(T,'',7,80,1),endform,end_html 
  
 __DATA__ 
 Shift_JIS 
 7ch 
 七氏 
 h1 {color:red; font-size:140%;} 
 p {margin:0em; padding:0.5em; background:#EEF;} 
  
 utime は FreeBSD だとファイル閉じないと効かなかったです。 
 Win98SE だと開いたままいぢれたけど。 
199: 128 [sage] 03/12/05 18:07 ID:??? AAS
 皆様。乙! 
 sage 機能いいですねぇ。 
  
 >>197 
 チェックありがとっす! 
 -style ってバージョンによって違ったんですね。 
 2.98でも確認できました。 
  
 修正版です。$/の定義はズルしてます。(w 
  
 #!/usr/bin/perl 
 use CGI":all";charset$c=Shift_JIS;*x=*textfield;sub l{a{href,pop},pop}sub e($){ 
 escapeHTML param pop}chdir G;($F=e B||e S)=~m![./]!?die:open F,">>$F";$t=Thread 
 ;$d=e N||NoName;flock F,2;s!.+外部リンク:.+!l$&,$&!eg,s/\n/br/eg,print F li(b(e M?l$d,' 
 mailto:'.e M:$d),localtime.p$_)if$_=e T;open F;put$/=header,start_html(-style=> 
 {code=><DATA>},title=>$f=$F||"7$t",lang,ja,encoding,$c),startform,h1($f),$F?ol( 
 <F>).hidden(B,$F).l$t.List,'?':ol(li[map{l$_,"?B=$_"}sort{-M$a<=>-M$b}<*>]).New 
 .$t.x(S),div(submit,Name,x(N),Mail,x(M)),textarea(T,'',7,80,1),endform,end_html 
 __DATA__ 
 h1{color:red; font-size:140%;} 
 p {margin:0; padding:0.5em; background:#EEF;} 
 b {color:green;} 
 a:hover{background:#FCC;} 
 input,textarea{margin:0 10px 0 2px;} 
200(6): nobodyさん [sage] 03/12/05 22:30 ID:??? AAS
 マ板から誘導されました。 
 既出と承知しつつ、1行掲示板です。 
 一応、名前と本文両方がないとはじく機能と、投稿日付つき。 
 (4行目の $t[4]/$t[3] を $t[2]:$t[1] にすれば、手動リロードの 
 簡易チャットにもなります。名前毎回入れるの面倒だけど。笑) 
 ファイル名は lb.cgi、パーミッション755で置けばいきなり稼動可能です。 
  
 #!/usr/bin/perl 
 $l='log.dat';@t=localtime();$t[4]++;use CGI;$q=new CGI;$d=$q->param('n'); 
 $e=$q->param('h');($d&&$e)and &g;&p;exit;sub g{&i;open F,">$l";flock(F,2);print 
  F "$t[4]/$t[3]:$d<BR>$e<HR>\n",@b;close F;}sub p{&i;print"Content-Type:text/h" 
 ,"tml\n\n一行掲示板<FORM METHOD=POST ACTION=\"lb.cgi\" NAME=1>名前<INPUT TYPE=" 
 ,"TEXT SIZE=20 NAME=n><BR>本文<INPUT TYPE=TEXT SIZE=60 NAME=h><BR><INPUT TYPE=" 
 ,"SUBMIT VALUE=\"送信\"></FORM><HR>",@b;}sub i{open F,"$l";@b=<F>;close F;} 
201(2): nobodyさん [sage] 03/12/06 00:29 ID:??? AAS
 >>200 
 特にヒネりもなく縮め。 
  
 #!/usr/bin/perl 
 use CGI":all";*P=*param;-e($F='log.dat')||open F,">$F";if(P(n)&&P(h)){open F, 
 "+<$F";flock F,2;@b=<F>;@t=localtime;seek F,0,0;print F++$t[4],"/$t[3]:",P(n), 
 '<BR>',P(h),"<HR>\n",@b}open F;$I='<INPUT TYPE';print"Content-Type: text/html\n 
 一行掲示板<FORM METHOD=POST ACTION=\"$0\">名前$I=TEXT SIZE=20 NAME=n><BR>本文", 
 "$I=TEXT SIZE=60 NAME=h><BR>$I=SUBMIT VALUE=\"送信\"></FORM><HR>",<F> 
  
 過去の作品に出てくるテクや Perl の言語仕様をしっかり研究してから 
 次回作を作って見せて欲しいな。 
  
 ところで 7blosxom と 7thread と 7ch (>>128128(8):  ◆PAmX3cjLtw  [] 03/04/18 15:48 ID:yrVQyLZr(2/2) AAS
 俺も作ってみた。 
 2chモドキの掲示板です。ログファイル F が必要。 
 URLと、発言番号への自動リンクがありますが、使い物になるかどうか・・・。 
 Win98のPWSとLinuxのApacheで動作を確認しました。。。 
  
 ------------ 7ch.cgi ----------------- 
 #!/usr/bin/perl 
 use CGI':all';*i=*param;$n=i N;$m=i M;$t=i T;open F,'+<F';eval{flock F,2};1 for 
 <F>;$.++;if($t){$_=$t;s/</</g;$h='<a href=';s!(https?外部リンク:.+?)$!$h$1>$1</a>!mg 
 ;s!>>(\d+)!$h#$1>>>$1</a>!g;s/\n/br/eg;seek F,0,2;print F dt("$. :".b(a{href=> 
 $m?"mailto:$m":undef,name=>$.},$n||='名無しさん'),':'.localtime),(dd $_.br.br) 
 ."\n"}seek F,0,0;*x=*textfield;print header(-charset=>''),start_html(-style=>' 
 body{background:#eee}b{color:green}').startform,dl(<F>),hr,submit('書き込む'),' 
 名前:',x(N),' E-mail:',x(M),br,textarea(T,'',5,70,1),endform.end_html; 
 -------------------- 
  
 結構つかれた・・・。  
〜) 、参加作という事で 
 外部リンク:cm.xrea.cc に載せていいですか? >オリジナル作者各位 
 と言っても実際に載せるのは年越してからになると思いますが(苦)。 
202(1): nobodyさん [sage] 03/12/06 17:16 ID:??? AAS
 スレ汚し失礼。簡易telneted。ポート1029を使います。 
 use Socket;socket(SERVER,2,1,getprotobyname('tcp'));setsockopt(SERVER, 
 SOL_SOCKET,4,1);bind(SERVER,pack_sockaddr_in(1029,INADDR_ANY));listen( 
 SERVER,1);select(SERVER);$|=1;for(;;){accept(CLIENT,SERVER) 
 ;select(CLIENT);$|=1;$cmd;print '$ ';while($c=getc(CLIENT)){if($c=~/\n$/){ 
 print `$cmd`,"\n",'$ ';$cmd = '';}else{print $c;$cmd .= $c;}}close CLIENT}
203: 128 [sage] 03/12/07 00:41 ID:??? AAS
 >>201 
 7ch と 7thread のオリジナル作者です。 
 どうぞ載せてくださいませ。 
204: nobodyさん [] 03/12/07 03:57 ID:enSfwhvY(1/3) AAS
 >201 
 参加してたんだw。どぉも。一年ぶりです。 
 <- 7blosxomのプロトタイプ提供者(===7wiki)です。 
  
 > 外部リンク:cm.xrea.cc に載せていいですか?  
 他にも幾つかストックあるので、公開時には掲載よろしくお願いします。m(_ _)m 
205: 7uploader [] 03/12/07 09:25 ID:enSfwhvY(2/3) AAS
 もっと詰めてからにしようと思ったけど、とりあえず公開します。後はよろしく:) 
  
 #!/usr/bin/perl 
 use CGI':all';$CGI::POST_MAX=1024*1000;chdir D;if($u=upload u){open F,">./$u"or 
 die;binmode F;while(read$u,$b,1024){print F$b}close F}@f=sort{-M$a<=>-M$b}<*>;( 
 ($_=param d)&&grep/^$_$/,@f)?do{open F,$_;put header(-Content_length=>-s, 
 attachment=>$_,-type=>"application/octet-stream"),<F>}:do{put header,start_html 
 ,start_multipart_form,filefield(u),submit,endform,hr,table({-border=>1},Tr[th([ 
 qw/name size date/]),map{td([a({href,"?d=$_"},$_),-s,''.localtime((stat)[9])])} 
 @f]),end_html} 
  
 __END__ 
 TODO 
 [ ] 保存するファイル名のチェック。 uploadされたphpやshtmlが実行されるのを防止,や../等の対策。 
 [*] 出力するファイル名のチェック。 
 [ ] binary ファイルの取扱。(for windows) 
 [ ] 他のブラウザへの対応。
206: nobodyさん [sage] 03/12/07 09:39 ID:??? AAS
 >>202 
 term 関係はシステム依存度高くて鬼門でごわす。 
  
 #!/usr/bin/perl 
 use Socket;socket S,2,1,getprotobyname"tcp";setsockopt S,SOL_SOCKET,4,1;bind S, 
 sockaddr_in 1029,INADDR_ANY;listen S,1;{accept C,S;binmode C;select C;$|=1;$n= 
 "\r\n";print$p='$ ';while($_.=$c=getc C){if(s/[$n]+\x00//){/^exit$/&&last;s/\s+ 
 \z//x for@o=`$_`;print join$n,'',@o,$p;$_=''}else{$c=~/[$n]/||print$c}}close C; 
 redo} 
  
 TeraTermPro → Win98SE (command.com) と 
 TeraTermPro → FreeBSD 4.x (tcsh) で動作する事を確認。 
 FreeBSD 上で telnet localhost 1029 は動作不能。 
 誰か残りの行で UNIX 系 OS 用のコード組み込んで下さい。:o) 
207(1): nobodyさん [] 03/12/07 20:49 ID:enSfwhvY(3/3) AAS
 Socket関連も、環境に依存する定数があったと思う。 
 後、ls コマンドの実装。 
  
 環境 
 Linux NetKit0.17 telnet で動作確認。(line mode) 
 > env | grep TERMCAP 
 TERMCAP=SC|screen|VT 100/ANSI X3.64 virtual terminal:\ 
  
 use Socket;socket S,PF_INET,SOCK_STREAM,getprotobyname'tcp';setsockopt S, 
 SOL_SOCKET,SO_REUSEADDR,1;bind S,sockaddr_in 1029,INADDR_ANY;listen S,1;{accept 
 C,S;binmode C;select C;$|=1;$n="\r\n";print$p='$ ';while($_.=getc C){if(length 
 ==1){s/^[$n\x00]//}elsif(s/[$n]$//){/^exit$/&&last;(/^cd\s*(.*)/)?chdir$1:print 
 join$n,(map{s/[$n\z]//g;$_}`$_`),$p;$_=''}}close C;redo} 
  
 character mode では、local echoが返らなかった。 
 端末への対応、悪化してたりしたらゴメン(焦 
208: 7hoo [] 03/12/09 13:46 ID:+unlQkjh(1) AAS
 PerlHoo(外部リンク:www.webreference.comです。 
 ディレクトリ型のリンク集。後1行がなかなか縮まらない >_<。 
  
 use CGI":all";$_='($p)=path_info=~m|^/*(.+?)/*$|;chdir("./$p")||die;@f=grep-d, 
 <*>;%F=(Url,U,Title,T);$F=".7hoo";if(@P=Ms/[\r\n]/ /g;$_}Mparam$_}(U,T,D)){open 
 F,">>$F";print F join"\t",@P,"\n"}put header,start_html,p(join" / ",(A},Home),M 
 A.($i.="/$_")},$_}split"/",$p),hr,(param 1)?(h2($p),startform(POST,url."/$p"),( 
 Mtextfield($F{$_},"",40),b$_,br}keys%F),textarea(D,"",3,40,1),br,submit,endform 
 ):(table(Tr Mtd{valign,top},ul li[MA.($p?"/$p":"")."/$_"},$_}grep-d,@f[$_*15..$ 
 _*15+14]]}(0..@f/15)),hr,(open(F,$F)&&M@N=split/\t/;h3(a{href,$N[0]},$N[1]),p$N 
 [2]}<F>)),hr,p(A."/$p?1=1"},Edit),end_html';s/M/map\{/g;s/A/a\{href,url/g;eval 
  
 __END__ 
  
 リンクを登録すると、登録したカテゴリのディレクトリ内に .7hoo ファイルを生成します。 
 例: Home / foo / bar だと、./foo/bar/.7hoo に記録される。  
  
 データ・ファイルが各ディレクトリ毎に散らばるのでテスト利用の場合は注意してください。 
 データファイルの掃除にはシェル等から > find ./target_dir -name ".7hoo" -exec rm {} \;
210: nobodyさん [sage] 03/12/10 15:33 ID:??? AAS
 おつかれ〜 
211: 200 [sage] 03/12/11 21:24 ID:??? AAS
 連投でうざかったらすみません。200で作った1行掲示板を 
 普通の掲示板に変更してみました。 
  
 #!/usr/bin/perl 
 $F='log.dat';$n='board.cgi';use CGI":all";*Q=*param;*f=*textfield;open F;@b[0.. 
 18]=<F>;close F;if(Q(1)&&Q(2)){@t=localtime;$_=Q(2);s/\r\n/\n/g;s/\r|\n/<br>/g; 
 $a=(Q(3))?a({-href=>'mailto:'.Q(3)},Q(1)):Q(1);$_="[".++$t[4]."/$t[3] $t[2]:". 
 sprintf("%02d",$t[1])."] $a".br.$_.hr.$/;open F,">$F";flock F,2;print F $_,@b;} 
 print header(-charset=>Shift_JIS),"*けいじばん*",start_form(post,$n),"おなまえ" 
 ,f(1),br,textarea(2,'',4,26),br,"めーる",f(3),submit('送信'),end_form,hr,$_,@b; 
  
 とりあえず、おまじない程度にShift_JIS(NN4対策)、本文が改行可能(Macの 
 改行コードも対応)、メール欄追加、日付+時間表示などの機能を付加して 
 ぴったり7行です。 
  
 //項目が全部ひらがななのは自サイトで使う用なので。苦笑 
212: 200 [sage] 03/12/11 21:51 ID:??? AAS
 それと、2行目の$Fでログファイル名、$nで自ファイル名を変更可能。 
 3行目の先頭にある18を「最大ログ数にしたい数-2」に変更すれば 
 最大ログを設定できます。 
213(1): nobodyさん [sage] 03/12/12 02:52 ID:??? AAS
 ● 最低限押さえるべきポイント for Perl 
 ・識別子は全て一文字にする 
 ・演算子の優先順位を把握して冗長な括弧を全て省く 
 ・サブルーチンは頭の方で宣言して routine(); から括弧を省く 
 ・ブロックの最後の文はセミコロンを省略できる ("main" ブロック然り) 
  
 ● 基本縮めテクニック for Perl 
 ・使用する関数に関してマニュアルを精読する :) 
 ・bare word ([A-Za-z]\w*) を使ってクォートを省く 
 ・長い名前の関数を複数回使うなら別名を作る (*P=*param;) 
 ・特殊変数や暗黙の代入を積極的に使う 
 ・(スカラー|リスト|ブール)コンテキストでの各挙動を意識する 
  
 ● Tips for Perl 
 ・同名のファイルハンドルを open し直すなら close は要らない (>>186186(4): nobodyさん [sage] 03/12/03 23:13 ID:??? AAS
 7blosxom.cgi l10n for Japanese 
 start_html に -title=>$0 入れると7行に収まらなかった(苦)。 
  
 #!/usr/bin/perl 
 use CGI':all';use File::Find;($Y,$M,$D)=grep/^\d+$/,@i=path_info=~m|/([^/]+)|g; 
 $R=$i[-1]=~/\.txt$/?pop@i:'\.txt';find sub{($d,$m,$y)=(localtime($t=(stat)[9])) 
 [3..5];$e{$File::Find::name}=$t if!($Y&&$Y-$y-1900)&!($M&&$M-$m-1)&!($D&&$D-$d) 
 &/$R$/},$P=join('/','.',grep!/\.\.|^\d+$/,@i);put header(-charset=>$c='EUC-JP') 
 ,start_html(-encoding=>$c,lang,ja);for(sort{$e{$b}<=>$e{$a}}keys%e){open F,$_; 
 s/^\.//;chomp($h=<F>);put h2(a{href,url.$_},$h),pre<Fhr}put end_html 
  
 >>182 
 '..' さえ防いだら大丈夫な気も… 
 既に開かれてるファイルハンドルを open し直すと、開いていたファイルは 
 close されてから新しいファイルを open するので、close は明示しなくても 
 可な筈。 
 外部リンク[html]:perldoc.com  
 参照) 
 ・最も短くかける無限ループは "{ ... ;redo}" 
  
 ● 「使える」Web プログラムを目指す人に 
 ・XSS 脆弱性に配慮する 
 ・文字コードに依存する定数は外部へ追い出す 
 ・「想定外の入力」でどのように誤作動するか確認する 
 ・多機能より堅牢を 
  
 Tips を充実させたいところ。 
214: nobodyさん [] 03/12/12 19:15 ID:O0tbE8Vp(1/2) AAS
 Gj and thankU>213 
 僕もTipsをまとめようかなと思ってました。 
 7行スクリプト向けのTipsと実用的なTipsを混同すると、誤解する人が出てこないかな? 
 との杞憂もあり。パターン言語で、このTipsはどういった時に使えるとか、 
 Tipsが使える場合の背景や制約等を細かく書こうと思ってたんだけど。(現在作業中断中 
 indexだけでも書き出してみるかな。 
  
 paddingテクニック for perl 
 - ファイルハンドルの直前で改行すると 1 byte diet 出来る。(open後等) 
 - 正規表現内で改行する場合は x を付ける。 
 - 変数名はprefix($@%)と名前の間にスペース/改行を含んでも良い。 
  
 基本縮めテクニック for perl 
 - and or && || の使い分け。場合によっては前後の()を省略できる。 
 - コード全体を圧縮 $_='...';s/xxx/zzz/g;eval # 事例: DeCSS, 7Hoo 
 - There'sMoreThanOneWayToDoIt 
 既に書かかれたコードに捕らわれず、異なるアプローチで書き起こす事も忘れずに。 
  
 Common Tips for perl 
 - $foo ||= 10; # foo が 空もしくは0 なら 10 を代入。 
  
 縮めTips for CGI.pm 
 - use CGI":all"; で main:: にインポート。 
 - 別名が付けられている関数は短い方を利用。 
 -- start_form -> startform, end_form -> endform 
 - 環境変数を所得する関数が準備されている。 
 -- $ENV{'PATH_INFO'} -> path_info, referer 等。 
 - 独自tagを出力する関数を作る。 事例 >>122122(2): nobodyさん [] 03/03/10 02:24 ID:drTO4vMw(1) AAS
 使い方わからなかったけど…(かちゅーしゃのログ持っていないので。 
  
 '<a href="'.pop().'</a> 
 ↓ 
 "a href=\"$_[0]</a>" 
 7rss.cgi 
 - 自分自身のURL -> url, self_url 
 - 他。 
  
 大抵の機能はモジュールで提供してくれてるが、VERSIONの違いには注意。 
215(1): PATH_INFO 内での '..' [] 03/12/12 19:52 ID:O0tbE8Vp(2/2) AAS
 >>186 読んで思い出した。 
 PATH_INFO に .. が現れるのってどういった場合なんでしょう? 
 親ディレクトリより上を参照出来る危険があるのかなと思ったけど。 
 QUERY_STRINGからなら勿論チェックが必要ですが。 
 PATH_INFOの場合CGI自体が呼ばれない様な気がする。 
  
 以下のようなリクエストを試してみました 
  
 外部リンク:www.example.com 
 外部リンク:www.example.com 
 外部リンク[cgi]:www.example.com 
  
 bar.cgi/../ とすると、 
 サーバーは bar.cgi のあるディレクトリの indexを返してくる様なんだけど。 
 これって、サーバーの実装に依存するのかな?apache,IIS他幾つかのサイトで確認。 
 流石にDocumentRootより上を参照しようとするとBad Requestになるけど。 
今、丁度7行HTTPdを公開しようと調整していたので、自分でも調べるつもりですが 
 もし、詳しく知ってる方いたらフォローお願いします。m(_ _)m 
216(1): nobodyさん [sage] 03/12/13 16:17 ID:??? AAS
 ご自由に編集して下さい。(´ω` 
 外部リンク[cgi]:cm.xrea.cc 
  
 #--- 7memo.cgi --- 
 #!/usr/local/bin/perl 
 chdir"D";use CGI":all";charset$c='EUC-JP';($_)=path_info=~m|[^/]+|g;s/^\s+|[<>| 
 ]|\s+$//g;tr/\x00-\x1F.\x7F/./;$F=length>2?escape CGI$_:Top;open F,($m=param w) 
 ?">$F":$F;flock F,2;$/='';print F$m||=<F>;sub U($){unescape CGI@_}opendir D,'.' 
 ;put header,start_html(-title=>U$F,lang,ja,encoding,$c),ul(map{li"".localtime(( 
 stat)[9]),a{href,url."/$_"},U$_}sort grep!/^\./,readdir D),h1(U$F),startform(0, 
 url."/$F"),p(textarea(w,$m,25,70),submit),endform,end_html 
 __END__ 
  
 7wiki を参考に色々いぢってみました。 
217(1): nobodyさん [sage] 03/12/15 02:27 ID:??? AAS
 >>215 
 /foo%5C..%5C..%5Cbar なんてのをそのまま Win 鯖で食うとヤバいかと。 
218(2): 7memo [sage] 03/12/15 13:08 ID:??? AAS
 ちょぼちょぼいぢり。 
  
 #!/usr/local/bin/perl 
 use CGI":all";sub d{chomp($_=<DATA>);$_}sub U($){unescape CGI@_}chdir d;charset 
 $c=d;$s=d;$_=path_info=~m|[^/]+|?$&:d;s/^\s+|\.+|\s+$/./g;$_=escape CGI$_;-d&& 
 die;open F,($m=param w)?">$_":$_;eval{flock F,2};$/='';print F$m||=<F>;opendir 
 D,'.';put header,start_html(-title=>U$F,lang,ja,encoding,$c),h1(U$F),startform( 
 0,url."/$F"),p(textarea(w,$m,20,70),submit$s),endform,ul(map{li"".localtime(( 
 stat)[9]),a{href,url."/$_"},U$_}sort grep!/^\./,readdir D),end_html 
  
 __DATA__ 
 data_dir 
 EUC-JP 
 save memo 
 Top Page Title 
219: nobodyさん [sage] 03/12/15 13:18 ID:??? AAS
 >>218 
 s/\$F/\$_/g; _| ̄|○ 
220(2): Unit7.pm [] 03/12/15 17:14 ID:zoqm3JaO(1/3) AAS
 #!/usr/bin/perl 
 package Unit7;sub new{bless{},pop}*set_up=*tear_down=sub{};sub p{printf@_}sub 
 assert{my($s,$f,$m)=@_;++$s->{n};$f?++$s->{o}:p"%s:%d\t$m\n",(caller)[1,2]}sub 
 run{$s=shift;$N=$O=0;for(grep/^test/,keys%{ref($s)."::"}){$s->{n}=$s->{o}=0;$N 
 ++;set_up$s;$s->$_;tear_down$s;p"$N ) $s->{o}/$s->{n}\t$_\n";$s->{n}-$s->{o} 
 or $O++}p"\nRun $N Tests. $O success.\n"}7 
  
 __END__ 
 $s ... $self 
 $N ... test* メソッドの数 
 $o ... 成功したテストの数 
 $n ... サブテストの数 
 $o ... 成功したサブテストの数 
  
 Test::Unit::TestCase 相当のモジュールです。 
 メソッド名 set_up, tear_down, assert は、オリジナルのTest-Unitを意識してそのままにしています。 
 名前を併せたらTestRunner.pl で実行できるかな?と互換性を期待したけど、無理だった。
上下前次1-新書関写板覧索設栞歴
あと 232 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル アボンOFF
ぬこの手 ぬこTOP 0.013s