七行プログラミング (452レス)
上下前次1-新
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 で実行できるかな?と互換性を期待したけど、無理だった。
221(1): 03/12/15 17:21 ID:zoqm3JaO(2/3) AAS
>>220 の使い方です。
- assert(bool, [message])
- set_up, tear_down は、他のTestUnit framework と同等。
- test runner は付いてないので、自分で実行しないといけない。->run;
new MyTest->run;
{package MyTest;
use base qw/Unit7/;
sub new { shift()->SUPER::new(@_) }
sub set_up { my($self)=@_; $self->{val} = 0 }
sub tear_down { my($self)=@_; undef $self->{val} }
sub test_foo {
my($self)=@_;
$self->assert(defined $self->{val}, "defined val");
$self->assert(!$self->{val}, "! val");
$self->assert(0==$self->{val}, "0 == val");
$self->assert('0' eq $self->{val}, "'0' eq val");
}
sub test_bar {
my($self)=@_;
$self->{val} = 1000;
$self->assert(1000 < $self->{val}, "1000 < val"); # failure
$self->assert(1000 <= $self->{val}, "1000 <= val");
$self->assert(1000 == $self->{val}, "1000 == val");
$self->assert(1000 > $self->{val}, "1000 > val"); # failure
$self->assert(1000 <= $self->{val}, "1000 >= val");
}
}
222(1): 03/12/15 18:50 ID:zoqm3JaO(3/3) AAS
>>220.diff
- $o ... 成功したテストの数
+ $O ... 成功したテストの数
>>221 の捕捉。
基底クラスを Test::Unit::TestCase に変更するとTestRunner.pl でも実行できます。
でも、Test::Unit::TestCase => Unit7の互換はなし。
>>216
ありがとう。早速使わせてもらってます。
>>218
()や{}の末尾では、引数の型宣言なしに弧省略出来たと思う。
nice tricky closure.
FP的なアプローチってコードの短縮に貢献出来るテクニック多いよね。
>>217
Windows 環境の事すっかり忘れてた。
でも、エンコードしなきゃ大丈夫じゃない? %5C
223: 03/12/16 04:29 ID:??? AAS
>>222
PATH_INFO の挙動調べてみました。確認ブラウザは
IE 6.0.2800.1106 、Mozilla 1.5 、Opera 7.23
・AN HTTPD 1.42k
ピリオド直後の \ は / に変換され、パスとして最適化される。
より上位のディレクトリを指す事はできない。
/foo/bar../baz は 404 。/foo/bar.../baz は 403 。
環境変数 PATH_INFO には URI-unescape 済みの値が入っている。
・Apache 1.3.29 on FreeBSD
\ はそのまま渡され、パスとして最適化される。
より上位のディレクトリを指す事はできない。
/foo/bar../baz はそのまま渡される。
環境変数 PATH_INFO には URI-unescape 済みの値が入っている。
IIS は周りに無いので未調査。
224(1): 7memo 03/12/16 14:56 ID:??? AAS
これで一旦完成。
#!/usr/local/bin/perl
use CGI":all";sub U{unescape CGI@_}chomp(($d,$c,$s,$q,$_,@w)=<DATA>);chdir$d;$_
=$&if path_info=~m|[^/]+|;tr/\x00- \x7F/ /s;$_=escape CGI$_;-d&¨$/='';open
F,($w=param w)?">$_":$_;eval{flock F,2};print F$w||=<F>;opendir D,'.';charset$c
;put header,start_html(-title=>U($_),style=>$s,lang,ja,encoding,$c),ul(map{li""
.localtime((stat)[9]),a{href,url."/$_"},U$_}sort grep!/^\./,readdir D),h1(U$_),
startform(0,url."/$_"),p(textarea(w,$w,@w),submit$q),'</form>',end_html
__DATA__
data_dir
EUC-JP
外部リンク[css]:example.com
save
Default Page Title
20
70
225: 03/12/20 01:06 ID:??? AAS
>>224
お疲れ様です。
使いやすいしいい感じ。
226: ?O?????|?X 03/12/28 16:50 ID:7YW8A3U6(1) AAS
c
227: ?O?????|?X 03/12/28 21:24 ID:7YW/F4a6(1) AAS
b
228: ?O?????|?X 03/12/30 16:01 ID:2yZZI8A2(1) AAS
ccv
229: [ ] 04/01/02 08:14 ID:??? AAS
(・Д・)
230: 04/01/18 12:18 ID:??? AAS
テクニックメモを基に既存プログラムのメンテ中。
・CGI.pm は最新版縛りで。
・日本語が通るように。
・改めて調べたら Win32 でもグロブ使えたのでそのように。
・XSS 脆弱性や open に渡す値の再確認。
7rss を RSS 0.91 仕様にしてみるテスト。
#!perl -w
use CGI qw/:all channel link language description item textinput name/;charset
$C='EUC-JP';$w='7wiki';url=~m|[^/]+$|;$p=$`;sub e{title($d=pop),description($d)
,link pop}put header('text/xml'),join"\n",'<?xml version="1.0" encoding="'.$C.
'"?>','<!DOCTYPE rss SYSTEM "外部リンク:my.netscape.com
'dtd">','<rss version="0.91">',channel(e("$p$w.cgi",$w),language(ja),(map{item
e"$p$w.cgi/$_",$_}sort{-M$a<=>-M$b}grep/^([A-Z][a-z]+){2,}$/&-f,<*>)[0..9],
textinput(title($w),link($p.'7search.cgi'),name S)),'</rss>'
231: 7ch.cgi 04/01/18 14:25 ID:??? AAS
#!/usr/bin/perl
use CGI":all";charset$C=Shift_JIS;open F,'+<F';[<F>];seek F,0,2;*i=*param;s!>
;(\d+)!a{href,"#R$1"},$&!egx,s!https?外部リンク:.+!a{href,$&},$&!eg,s/\n/br/eg,($n=i(N)
||'nobodyさん')=~s/#.+/crypt$1,'◆'/e,eval{flock F,2},print F dt(++$.,':'.b(a{
name,"R$.",i(M)&&(href,'mailto:'.i M)},$n),':'.localtime),dd($_.p),"\n"if$_=
escapeHTML i T;seek F,0,0;*x=*textfield;put$/=header,start_html(-style=>{code=>
<DATA>},Title=>'7ch',encoding,$C,lang,ja),dl(<F>),hr,startform,p(submit('書き'.
'込む'),' 名前:',x(N),' E-mail:',x(M),br,textarea T,'',6,70),endform,end_html
__DATA__
b { color:#080 }
body { background:#fff }
232: 04/01/18 20:09 ID:Hq0k6H3L(1) AAS
CCC
233: 7blosxom 04/01/19 14:33 ID:??? AAS
外部リンク:cm.xrea.cc
仕様は >>182 辺りに。
テストファイル生成スクリプトも更新。
@c=('a'..'z','A'..'F');$t=time;$i=24;sub u{$t-=9**5;utime$t,$t,pop}sub j{join""
,@c[$_[0]..$_[0]+2]}while($i){open(T,'>'.($f=j(--$i).'.txt'))||die$!;print T j(
$i),"\n",j($i+3),"\n",j($i+6);close T;$t-=8**7if$i==13;u($f)||die$!}@f=sort
<*.txt>;$t=(stat$f[0])[9]-9**7;for(@f){open(S,$_)||die$!;s/(\w+)/uc($1).++$i/e;
open(D,">$_")||die$!;print D map uc,<S>;close D;u($_)||die$!}
234(3): 04/01/20 15:14 ID:F518czSp(1) AAS
激しく板違いなんですけど
for(@LOG){
my($no,$dammy)=split(/<>/,$_);
for(@LOG){
my($no2,$dammy)=split(/<>/,$_);
if($no eq "$no2"){
print "LOG";
for(@LOG){
my($no3,$dammy)=split(/<>/,$_);
if($no2 eq "$no3"){
print "LOG";
}
}
}
}
}
を一回のforルーチンで済ますことってできますか?
235: 234 [age] 04/01/20 15:22 ID:??? AAS
for(@LOG){
my($dammy,$no)=split(/<>/,$_);
for(@LOG){
my($dammy,$no2,$no3)=split(/<>/,$_);
if($no eq "$no3"){
print "LOG";
for(@LOG){
my($dammy,$no4,$no5)=split(/<>/,$_);
if($no2 eq "$no5"){
print "LOG";
}
}
}
}
}
間違えました。訂正しまつでつ。
236: 234 [age] 04/01/20 15:25 ID:??? AAS
ついでに2回のforルーチンでもいいです。
237: 04/01/20 16:52 ID:??? AAS
>>234
コードを短くしたいという意図はわかるけど、
実用的なプログラムでは、ここに挙がっている様なテクニックは、
なるべく使わない方が良いよ。
238(1): 04/02/01 15:24 ID:??? AAS
#!/usr/bin/perl
require 'bbs.pl';
bbsmain();
3行で掲示板作ったぞ
239: 04/02/01 22:12 ID:??? AAS
>>238
モジュール/ライブラリに関して >>46 >>135 >>136 >>174 >>175
240(1): 04/02/12 06:42 ID:??? AAS
転載
#!/usr/bin/perl -w
# 526-byte qrpff, Keith Winstein and Marc Horowitz <sipb-iap-dvd@mit.edu>
# MPEG 2 PS VOB file on stdin -> descrambled output on stdout
# arguments: title key bytes in least to most-significant order
$_='while(read+STDIN,$_,2048){$a=29;$c=142;if((@a=unx"C*",$_)[20]&48){$h=5;
$_=unxb24,join"",@b=map{xB8,unxb8,chr($_^$a[--$h+84])}@ARGV;s/...$/1$&/;$d=
unxV,xb25,$_;$b=73;$e=256|(ord$b[4])<<9|ord$b[3];$d=$d>>8^($f=($t=255)&($d
>>12^$d>>4^$d^$d/8))<<17,$e=$e>>8^($t&($g=($q=$e>>14&7^$e)^$q*8^$q<<6))<<9
,$_=(map{$_%16or$t^=$c^=($m=(11,10,116,100,11,122,20,100)[$_/16%8])&110;$t
^=(72,@z=(64,72,$a^=12*($_%16-2?0:$m&17)),$b^=$_%64?12:0,@z)[$_%8]}(16..271))
[$_]^(($h>>=8)+=$f+(~$g&$t))for@a[128..$#a]}print+x"C*",@a}';s/x/pack+/g;eval
241: 04/02/12 06:51 ID:??? AAS
>>240
それがそもそもの始まりだったりする。
2chスレ:tech
242: 04/02/16 23:08 ID:j3AvJVjF(1) AAS
保守age。ついでに、あまり役に立ちそうにないTip
配列と配列サイズを同時に宣言
my $length_of_array = my @array = (1, 2, 3, 4, 5);
243(2): 7wiki 04/02/18 20:32 ID:b6u9ly2x(1) AAS
* Added 空投稿でPage削除
* Diet evalの{}外してみた。-1 byte
#!/usr/bin/perl -w
use CGI":all";charset$c='EUC-JP';$w='\b(([A-Z][a-z]+){2,})';$f=script_name;$/=(
);($p)=(path_info||FrontPage)=~/$w/;($m=param z)||unlink$p;if(open F,$m?">$p":$
p){eval flock F,2;print F$m||=<F>}$_=pre(escapeHTML$m).hr.ul map{li"".localtime
((stat)[9]),$_}sort{-M$a<=>-M$b}grep/^$w$/&-f,<*>;s|$w|(!-f$1&&$1).a{href,"$f/$
1"},-f$1?$1:"?"|eg;put header,start_html(-title=>$p,encoding,$c,lang,ja),h1($p)
,startform(0,"$f/$p"),p(textarea(z,$m,6,60),br,submit),endform,hr,$_,end_html
244(1): 04/02/19 09:30 ID:??? AAS
>>243
eval の {} は外せないですよ。
eval flock F,2; だと flock() の戻り値から成る文字列を eval する事に。
unlink の問題はあっちでも指摘されてますが。:o)
245: 7uploader 04/02/19 11:44 ID:??? AAS
順番的には先に telnetd を何とかしたいけど、検証が大変なので後回し。
#!/usr/bin/perl
use CGI":all";sub v{open(F,pop)||die;binmode F}$CGI::POST_MAX=1024000;$/=\4096;
chdir D;%f=map{$_,[a({href,"?d=$_"},$_),-s,''.localtime((stat)[9])]}@f=sort{-M$
a<=>-M$b}<*>;$f{$f=upload f}or$f&&do{v">$f";print F$_ while<$f>;close F};$f{$F=
param d}?(v($F),put header(-type=>'application/octet-stream',Content_length,-s
$F,attachment,$F),<F>):put(header,start_html,start_multipart_form,filefield(f),
submit,endform,hr,table({border,1},Tr[th([qw/name size date/]),map{td$f{$_}}@f]
),end_html)
・windows 対応。
・既存ファイルへの上書きを防止。但し upload 後自力 reload が必要に。
ファイル名は連番や時刻等にする方が安心且つ楽かな。
246(2): 04/02/19 20:30 ID:mWwpYaYp(1) AAS
>>244
あ、なるほど。それではevalの意味がなくなってしまう。
一応、事前に実験したんですが、検証方法が間違ってました。m(_ _)
フォローありがとうございます。
> unlink の問題はあっちでも指摘されてますが。:o)
あぁ、やってしまったぁ。試してくれた方ありがとう&&すみません。
ひとまず >>243は無効って事で、代案考えます。
ところで、ライセンスや掲載許可みたいな事を尋ねられたのだけど、
wiki, や blosxom, はオリジナルと同じ GPL って事でいいかな?
実際、7wikiはYukiWiki, 7blosxomは初期のblosxomを参考にしたので。
247: SevenLines の中の人 04/02/19 21:28 ID:??? AAS
>>246
ライセンスやら何やらは原作者に尋ねるのがスジですが、初出が
2ch だけに連絡取り辛いですな。各スレで直接呼びかけるしか無いかも。
SevenLines で保守している作品については、各原作者と配布形態等を
逐一取り決めてはいないので、建前上あのような断り書きの縛りにして
います。拙作のは全部修正 BSD ライセンスで、アーカイヴにライセンス
文書も同梱してます。
ニーズがあるなら専用ドメイン取って、転送メールアドレスの提供ぐらいは
しますよん。:) >各原作者殿
248(1): 04/02/20 22:48 ID:g/Yl/nab(1) AAS
# 重要な事を書き忘れました。
246==7wiki, 7files, 7search, 7rss, 7blosxom, 7Unit, 7uploader, 7hoo 原作です。
(当然だけど、オリジナルではなくこのスレの7行版の方の、です)
掲載許可に関しては、手間のかからない方法で「連絡不要」って事でいいかな?
連絡先作って貰っても、どれほど需要があるかは自分にもわからないので。
ライセンスについては、
#!/usr/bin/perl -w -- "License: 外部リンク[txt]:www.gnu.org"
で、どぉでしょう?GPL以外でもいいけど
249: 246 04/02/22 02:18 ID:Sgt6pnb3(1) AAS
>ライセンスの件 ...
自分が叩き台を出したとは言え、成果物はこのスレで参加者皆のものなので
出来れば他の方の意見も伺っておきたいのですが。特に異論がなければ、
>>248通り連絡不要/GPLという事にしたいと思います。
# もしくは、保守して下さってるサイトの管理者さんにお任せ。m(_ _
# 7vote
use CGI':all';$p=POST;*P=*param;charset$c='EUC-JP';chdir V;($F)=P(f)=~/^(\d+)$/
;if(open F,"+<$F"){eval{flock F,2};$t=<F>;while(<F>){if(/^(.+)\t(\d+)$/){$D{$1}
=$2}}if(request_method==$p){($n=P(n))?$D{$n}||=1:($v=P(v))?$D{$v}++:0;seek F,0,
0;print F join("\n",$t,map{"$_\t$D{$_}"}keys%D)}}for(radio_group(v,[@K=sort{$D{
$b}<=>$D{$a}}keys%D])){$L{$K[$i++]}=$_}put header,start_html(title=>$t,encoding
,$c,lang,ja),h1($t),startform($p),table({},Tr[map{td["$L{$_}($D{$_})",hr{width
=>$D{$_}}]}@K]),hr,textfield(n),hidden(f,$F,force=>1),submit,endform,end_html
設定方法
1) ディレクトリV を作る。 mkdir V;chdir V
2) 題名を書いたファイルを作る。echo "What is your native language" > 00001 # ファイル名は番号で。
3) chmod 0666 00001 # 必要に応じてパーミッションの設定
./7vote.cgi?f=00001 # ブラウザからアクセス
上下前次1-新書関写板覧索設栞歴
あと 203 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.009s