七行プログラミング (452レス)
七行プログラミング http://medaka.5ch.net/test/read.cgi/php/1036141603/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
160: nobodyさん [sage] 03/08/18 07:15 ID:??? ちょっと長くなったけど、初心者質問スレを荒らしている彼に捧げよう。(w #--- br.p --- package P;sub c{bless pop,pop}sub s{$_[0]->{s}}sub n{$_[0]->{n}}sub h{my($s,$c) =@_;$c||return$s->{h};($s->{h}+=$c)>0or$s->{h}=0}sub b{my($s,$e)=@_;my@w=keys%{ $s->{w}};my$w=$w[int rand@w];print$s->n,' は ',$w," で攻撃!\n";my($d,$a)=@{$s-> {w}{$w}}{d,a};$d=(my$n=int rand 101)>$a?0:$n>$a/2?int($d/2)-$e->s:$n>$a/20?$d- $e->s:$d;print$d<=0?"ミス!\n":($e->n,' に ',$d," ポイントのダメージ!\n");$e->h( -$d)||print$e->n," を倒した!\n"}package main;sub p{splice@p,int rand@p,1}@p=map P->c($_),@{do'./p.dat'};while(@p>1){my$o=p;my$d=p;print"\n",$o->n,':',$o->h,' ' ,$d->n,':',$d->h,"\n";$o->b($d);push@p,$o;$d->h>0&&push@p,$d}print(shift(@p)->n , " の 勝利!\n") #--- p.dat --- [{n=>'煽り',h=>400,s=>10,w=>{'キック'=>{d=>60,a=>60},'パンチ'=>{d=>20,a=>70},}} ,{n=>'荒らし',h=>300,s=>0,w=>{'キック'=>{d=>100,a=>60},'パンチ'=>{d=>40,a=>70}} },{n=>'夏厨',h=>200,s=>20,w=>{'キック'=>{d=>80,a=>90},'パンチ'=>{d=>10,a=>100}} }]; http://medaka.5ch.net/test/read.cgi/php/1036141603/160
161: nobodyさん [sage] 03/08/18 12:36 ID:??? >>160 ワロタ http://medaka.5ch.net/test/read.cgi/php/1036141603/161
162: nobodyさん [sage] 03/08/19 11:57 ID:??? 縮めて CGI プログラムにした。これで彼も満足だろう。 #--- br.cgi --- #!/usr/local/bin/perl use CGI':all';put header(-charset=>($c='EUC-JP')),start_html(-lang=>ja,-title=> 'B.R.',-encoding=>$c);@p=@{do'br.dat'};sub e{splice@p,int rand@p,1}while(@p>1){ *o=e;*d=e;put p"$o{N}:$o{H} $d{N}:$d{H}";@w=keys%{$o{W}};$w=$w[int rand@w];($p, $a)=@{$o{W}{$w}}{D,A};put p("$o{N}は$wで攻撃!",(($p=($n=int rand 101)>$a?0:$n> $a/2?int($p/2)-$d{S}:$n>$a/20?$p-$d{S}:$p)>0or$p=0)?"$d{N}に$pポイントのダメー" .'ジ!':'ミス!');($d{H}-=$p)>0or put p"$d{N}を倒した!";push@p,\%o;$d{H}>0&&push @p,\%d}put p(pop(@p)->{N}, 'の勝利!'),end_html #--- br.dat --- [ {N=>'煽り', H=>400,S=>10,W=>{'キック'=>{D=>60, A=>60},'パンチ'=>{D=>20,A=>70 }}}, {N=>'荒らし',H=>300,S=>0, W=>{'キック'=>{D=>100,A=>60},'パンチ'=>{D=>40,A=>70 }}}, {N=>'夏厨', H=>200,S=>20,W=>{'キック'=>{D=>80, A=>90},'パンチ'=>{D=>10,A=>100}}}, ]; http://medaka.5ch.net/test/read.cgi/php/1036141603/162
163: nobodyさん [sage] 03/08/20 07:02 ID:??? メッセージを削るという安直な方法で七行達成。 #!/usr/local/bin/perl use CGI':all';put header(-charset=>($c='EUC-JP')),start_html -lang=>ja,-title=> BR,-encoding=>$c;@p=@{do'br.dat'};while(@p>1){put p map"$_->{N}:$_->{H}",@p;*d= splice@p,int rand@p,1;*o=$p[int rand@p];@w=keys%{$o{W}};($p,$a)=@{$o{W}{$w=$w[ int rand@w]}}{D,A};put p"$o{N}は$d{N}に$wで攻撃!",(($p=($n=int rand 100)>$a?0: $n>$a/2?int($p/2)-$d{S}:$n>$a/20?$p-$d{S}:$p)>0or$p=0)?"$pダメージ!":'ミス!';( $d{H}-=$p)>0?push@p,\%d:put p b"$d{N}を倒した!"}put p"$p[0]{N}の勝利!",end_html http://medaka.5ch.net/test/read.cgi/php/1036141603/163
164: nobodyさん [sage] 03/08/28 05:11 ID:??? 「素早さ」を実装したいけど、どうも巧くない。 #--- br.dat --- # 名前, 防御力, 体力, 素早さ(1〜99), [ [ 武器名, 攻撃力, 命中率(1〜99) ] ... ] [ [ '煽り', 10, 300, 99, [['キック',60,50], ['パンチ',30,70]] ], [ '荒らし', 0, 400, 50, [['キック',90,70], ['パンチ',40,80]] ], [ '夏厨', 20, 200, 25, [['キック',80,90], ['パンチ',20,90]] ], ]; #--- br.cgi (素早さ実装版) --- #!/usr/local/bin/perl use CGI':all';put header(-charset=>($C='EUC-JP')),start_html -encoding=>$C,lang ,ja,title=>BR;@p=@{do'br.dat'};while($#p){put p map"[$_->[0]:$_->[2]]",@p;$N=0; {for(0..$#p){int$c%(99/$p[$_][3])&&next;($N,*W)=@{*O=splice@p,$_,1}[0,4];($W,$D ,$A)=@{$W[rand@W]};last}$c=0if++$c>99;$N||redo}($n,$s)=@{*d=splice@p,rand@p,1}; put p"$Nは$nに$W!",(($D-=($i=rand 100)>$A?$D:$i>$A/2?int($D/2)+$s:$i>$A/20?$s:0 )>0or$D=0)?"$Dダメージ!":'ミス!';@p=sort{$b->[3]<=>$a->[3]}@p,\@O;($d[2]-=$D)>0 ?@p=(\@d,@p):put p b"$nを倒した!"}put p"$Nの勝利!",end_html #--- br.cgi (素早さ未実装版) --- #!/usr/local/bin/perl use CGI':all';put header(-charset=>($C='EUC-JP')),start_html -encoding=>$C,lang ,ja,title=>BR;@p=@{do'br.dat'};while($#p){put p map"[$_->[0]:$_->[2]]",@p;($N, *W)=@{$p[-1]}[0,4];($W,$D,$A)=@{$W[rand@W]};($n,$s)=@{*d=splice@p,rand$#p,1}; put p"$Nは$nに$W!",(($D-=($i=rand 100)>$A?$D:$i>$A/2?int($D/2)+$s:$i>$A/20?$s:0 )>0or$D=0)?"$Dダメージ!":'ミス!';($d[2]-=$D)>0?push@p,\@d:put p b"$nを倒した!"} put p"$Nの勝利!",end_html http://medaka.5ch.net/test/read.cgi/php/1036141603/164
165: nobodyさん [sage] 03/08/28 12:01 ID:??? >>164 まだやってたのかよw がんがれ! http://medaka.5ch.net/test/read.cgi/php/1036141603/165
166: 保守 [sage] 03/10/04 05:54 ID:??? $$_=1for"@ARGV"=~/\w/g;for('0019'..9999){my%c;$n=$_;next if$h{"@{[sort@v=/./g]} "}++&&$o||$z&&/0/||$d&&(grep$c{$_}++,@v);O:for(map[@{[qw(+ - * /)]}[$_&3,$_>>2& 3,$_>>4&3]],0..63){@x=(@$_,@v);eval==10&&do{print"$n:$_\n";$c&&last O}for grep s/(\d)/$x[$1]/g,qw/(304)1(526) ((304)15)26 30(41(526)) 30((415)26) (30(415))26/ }} http://medaka.5ch.net/test/read.cgi/php/1036141603/166
167: nobodyさん [sage] 03/10/05 03:33 ID:??? 本家スレで出てた切符問題の CGI プログラム版。 選択された4つの数字のみを調べる。 #!/usr/local/bin/perl use CGI':all';@n=param n;for(map[@{[qw(+ - * /)]}[$_&3,$_>>2&3,$_>>4&3]],0..63) {@x=(@$_,@n);for$t(qw/(304)1(526) ((304)15)26 30(41(526)) 30((415)26)/,'(30(41' .'5))26'){$_=$t;s/(\d)/$x[$1]/g;eval==10&&push@e,$_.br}}put header,start_html( -title=>7410),startform(0,script_name),p(scrolling_list(qw(-name n -size 10), -values=>[0..9])x4,submit),endform,p(@e),end_html >>166 は 5.005_03 なら動いたけど 5.8.0 だと不可。 http://medaka.5ch.net/test/read.cgi/php/1036141603/167
168: nobodyさん [sage] 03/10/05 20:23 ID:??? コマンドライン・CGI 両対応版。 #--- 7410.cgi --- #!/usr/local/bin/perl use CGI':all';sub e{for(map[@{[qw(+ - * /)]}[$_&3,$_>>2&3,$_>>4&3]],0..63){@x=( @$_,@n);for$t(qw/(304)1(526) ((304)15)26 30(41(526)) 30((415)26) (30(415))26/){ $_=$t;s/(\d)/$x[$1]/g;eval==10&&do{$r?push@e,$_.br:print"$n:$_\n";$c&&return}}} @e}if($r=$ENV{'REMOTE_ADDR'}){@n=param n;put header,start_html(-title=>7410), startform(0,script_name),p(scrolling_list(qw(-name n -size 10 -values),[0..9])x 4,submit),endform,p(e),end_html}else{$$_=1for"@ARGV"=~/\w/g;$n=$_,$h{"@{[sort@n =/./g]}"}++&&$o||$z&&/0/||$d&&do{my%c;grep$c{$_}++,@n}or e for'0019'..9999} __END__ usage: ./7410.cgi [ -cdoz ] -c : 1組の数字に対し1つの計算式のみ出力 -d : 同じ数字を使わない -o : 1組の数字に対し1つの出現順序のみ出力 -z : 0を含めない http://medaka.5ch.net/test/read.cgi/php/1036141603/168
169: nobodyさん [sage] 03/10/08 01:14 ID:??? 5.005_03 と 5.8.0 の両方でマジメにチェック & 縮め。 #!/usr/local/bin/perl use CGI':all';sub e{my@e;for(0..63){@x=(@{[qw(+ - * /)]}[$_&3,$_>>2&3,$_>>4&3], @n,param n);for$t(qw/(304)1(526) ((304)15)26 30(41(526)) 30((415)26) (30(415))26/){$_=$t;s/(\d)/$x[$1]/g;10-eval or$r?push@e,$_.br:put("$n:$_\n"),$c &&return}}@e}($r=$ENV{REMOTE_ADDR})?put(header,start_html(-title=>7410), startform(0,script_name),p(scrolling_list(-values=>[0..9],name,n,size,10)x4, submit),endform,p(e),end_html):do{$$_=1for"@ARGV"=~/\w/g;$n=$_,$h{"@{[sort@n= /./g]}"}++&&$o||$z&&/0/||$d&&4>keys%{{map{$_,1}@n}}or e for'0019'..'9999'} http://medaka.5ch.net/test/read.cgi/php/1036141603/169
170: 7blosxom [] 03/12/01 03:01 ID:i/vnv4B8 #!/usr/bin/perl use CGI':all';use File::Find;$n=param('n')||0;@i=split'/',path_info;shift@i;($y, $m,$d)=grep{/^\d+$/}@i;$p=join'/',grep{/^\D+$/}@i;find sub{($f=$File::Find::name )=~/\.txt$/and$e{$f}=-M},"./$p";put header,start_html;for((sort{$e{$a}<=>$e{$b}} keys%e)[$n..$n+40]){($z,$x,$c)=(localtime(time-60*60*24*$e{$_}))[5,4,3];next if( ($y&&$y!=$z+1900)or($m&&$m!=$x+1)or($d&&$d!=$c)or!-f);s/^\.\///;open(F,$_)&&{ chomp($t=<F>),put(a({-href=>url."/$_"},h2 $t),<F>,hr,"\n"),close F}}put end_html http://medaka.5ch.net/test/read.cgi/php/1036141603/170
171: 7blosxom [] 03/12/01 03:13 ID:i/vnv4B8 久しぶりに7行プログラミング。 PATH_INFOで指定できるのは、日付とカテゴリのみ。 月の指定は数字のみ可能。Decとかには未対応。 indexや他のFlavourは未実装。 リクエストの例 ./7blosxom.cgi ./7blosxom.cgi/2003 ./7blosxom.cgi/2003/11 ./7blosxom.cgi/2003/11/30 ./7blosxom.cgi/2003/11/foo ./7blosxom.cgi/2003/foo/bar ./7blosxom.cgi/foo/hoge.txt PAGING 機能。意味なくつけてみたけど、いらないよぉな気がする。(TODO remove) ./7blosxom.cgi?n=10 ./7blosxom.cgi?n=10/foo/2000 リクエスト例。例外 ./7blosxom.cgi///// ... 何も指定しないのと同じ。 ./7blosxom.cgi/2003/11/30/1/ ... 4つめ以降の数字は無視される。 ./7blosxom.cgi/foo2/ ... 正規表現が手抜きな為、数字+文字の組合せは無視される。 http://medaka.5ch.net/test/read.cgi/php/1036141603/171
172: nobodyさん [] 03/12/01 06:28 ID:i/vnv4B8 訂正。HTML&&桁数間違えてた。 #!/usr/bin/perl use CGI':all';use File::Find;@i=split'/',path_info;shift@i;($y,$m,$d)=grep/^\d+ $/x,@i;$p=join'/',grep{/^\D+$/}@i;find sub{($f=$File::Find::name)=~/\.txt$/and$ e{$f}=-M},"./$p";put header,start_html;for(sort{$e{$a}<=>$e{$b}}keys%e){($z,$x, $c)=(localtime(time-86400*$e{$_}))[5,4,3];if(!(($y&&$y!=$z+1900)or($m&&$m!=$x+1 )or($d&&$d!=$c))&&-f&&open F,$_){s/^\.\///;chomp($t=<F>);put hr,h2 a({href,url. "/$_"},$t),pre<F>,"\n";close F}}put end_html - データ用のディレクトリをカレントディレクトリ以外に指定したい場合。 ln -s /home/your/data/path home とリンクを作り。 7blosxom.cgi/home とアクセスする。 http://medaka.5ch.net/test/read.cgi/php/1036141603/172
173: 128 [] 03/12/01 18:34 ID:xLzdr2os それじゃ漏れも久々に投稿。 スレッド式掲示板です。 データ用ディレクトリ G が必要です。 ---------------------- 7thread.cgi ----------------------- use CGI":all";charset"x-sjis";*i=*param;*e=*escapeHTML;chdir G;i B,$b,open F,"> $b"if($b=e(i S))&&!-e$b;$b||=i(B);*x=*textfield;open F,"+<$b";[<F>];seekF,0,2;s !http://.+$!a{href,$&},$&!emg,s/\n/br/eg,$n=e(i N)||'七氏',print F dt(++$.,':'. b(a{i(M)&&(href,'mailto:'.e(i M))},$n),':'.localtime),dd($_.p),"\n"if$_=e(i T); seek F,0,0;put header,start_html($b),h1($b),startform,(i B)?dl(<F>).a{href,'?'} ,'一覧':ol(li[map{a{href,"?B=$_"},$_}sort{-A$a<=>-A$b}<*>]).hr.'スレ'.x(S),hidden (B),br,submit,'名前',x(N),'MAIL',x(M),br,textarea(T,'',6,80,1),endform,end_html ------------------------------------------------------ http://medaka.5ch.net/test/read.cgi/php/1036141603/173
174: nobodyさん [] 03/12/01 20:35 ID:lEOu0k9S モジュールありだったらいくらでも短くできるのでは? http://medaka.5ch.net/test/read.cgi/php/1036141603/174
175: nobodyさん [] 03/12/01 23:22 ID:i/vnv4B8 #!/usr/bin/perl #7blosxom.cgi use CGI':all';use File::Find;($p,$y,$m,$d)=grep/^\D+$/,(@i=split'/',path_info), grep/^\d+$/,@i;find sub{($f=$File::Find::name)=~/\.txt$/and $e{$f}=-M},"./$p"; put header,start_html;for(sort{$e{$a}<=>$e{$b}}keys%e){($c,$x,$z)=(localtime( time-86400*$e{$_}))[3..5];if(!($y&&$y!=$z+1900||$m&&$m!=$x+1||$d&&$d!=$c)&&-f&& open F,$_){s/^\.\///;chomp($t=<F>);put h2 a({href=>url."/$_"},$t),pre<F>,hr; close F}}put end_html __END__ 変更点 < shift@i はいらなかった。 < [5,4,3] をスライスに変更。 < 変数をまとめて宣言。 >174 そうだね。過去ログを読めばわかる通り、それは人によって意見がわかれる所。標準モジュールはokとか。 自分は、モジュールを使っても既存のリソースの有り合わせでおもしろいものが出来ればいいなと思ってる。 wikiもCPANのWiki::関連のモジュールを使えば制限内でも、もっと機能追加出来そうだし。 ただし、短くするためにわざわざモジュールを作る気はなし。 http://medaka.5ch.net/test/read.cgi/php/1036141603/175
176: nobodyさん [sage] 03/12/02 14:16 ID:??? >>175 h2タグの中にpreタグ(と本文)が入るのですが・・・ http://medaka.5ch.net/test/read.cgi/php/1036141603/176
177: nobodyさん [sage] 03/12/02 18:25 ID:??? >>175 Blosxom 知らんかったので和訳サイト読みながらゴニョゴニョ中。 動作確認用の txt ファイルセット用意してくれたら嬉しい。日付と 中身が違うファイルを沢山作るのは結構ダルい。;) http://medaka.5ch.net/test/read.cgi/php/1036141603/177
178: nobodyさん [sage] 03/12/02 22:21 ID:??? >>173 足したり引いたりしてみた。 use CGI":all";*i=*param;*x=*textfield;sub e{escapeHTML i(pop)}chdir G;-e($b=i(B )||e S)or open F,">$b";open F,"+<$b";eval{flock F,2};[<F>];s!http://.+$!a{href, $&},$&!eg,s/\n/br/eg,print F dt($.+1,':',b(a{href,'mailto:'.e M},e(N)||nobody), ':'.localtime),dd($_),"\n"if$_=e T;seek F,0,0;put header,start_html($b), startform,$b?h1($b).dl(<F>).hidden(B,$b).a{href,'?'},list:ol(li[map{a{href, "?B=$_"},$_}sort{-M$a<=>-M$b}<*>]).thread.x(S),br,submit,NAME,x(N),MAIL,x(M),br ,textarea(T,'',6,80,1),endform,end_html http://medaka.5ch.net/test/read.cgi/php/1036141603/178
179: nobodyさん [sage] 03/12/02 23:32 ID:??? >>177 #!/usr/bin/perl @c=('a'..'z','A'..'F');$t=time;sub j{join'',@c[$_[0]..$_[0]+2]}for(0..23){open( T,'>'.($f=j($_).'.txt'))||die$!;print T j($_),"\n",j($_+3),"\n",j($_+6);utime( $t,$t,$f)||die$!;$t-=25000}opendir(D,'.')||die$!;@f=grep!/^\./,sort readdir D; $t=(stat$f[0])[9]-32000000;for(@f){open(S,$_)||die$!;s/^(\w+)/++$i.uc$1/e;open( D,">$_")||die$!;print D map uc,<S>;utime$t,$t,$_;$t-=50000} http://medaka.5ch.net/test/read.cgi/php/1036141603/179
180: nobodyさん [sage] 03/12/03 02:02 ID:??? 5.005_03 と 5.8.2 で確認。元より長くなったけど…。 #!/usr/bin/perl use CGI':all';use File::Find;/^\d+$/?$y?$m?($d||=$_):($m=$_-1):($y=$_-1900):/\. txt$/x?($f||=$_):length&&($c.="/$_")for split'/',path_info;find sub{($D,$M,$Y)= (localtime($t=(stat)[9]))[3..5];$e{$File::Find::name}=$t if!($y&&$y-$Y)&&!($m&& $m-$M)&&!($d&&$d-$D)&&(!$f||/^$f$/)&&/\.txt$/},".$c";put header,start_html;for( sort{$e{$b}<=>$e{$a}}keys%e){open F,$_;s|\.||;chomp($h=<F>);put h2(a{href,url. $_},$h),pre<F>,hr}put end_html ・数字は年・月・日としてこの順に拾われ、4つ目以降は無視 ・数字のみのカテゴリ名は許されないが、含む事は可 ・カテゴリは出現順に階層化されているものとして処理する ・".txt" が末尾に付くものはファイルとし、最初に現れたもののみ有効 例 ./7blosxom.cgi ./7blosxom.cgi/2003 ./7blosxom.cgi/2003/11 ./7blosxom.cgi/2003/11/30 ./7blosxom.cgi/foo ./7blosxom.cgi/hoge.txt ./7blosxom.cgi/foo/hoge.txt ./7blosxom.cgi/2003/foo/bar ./7blosxom.cgi/2003/foo/11/bar/30/fuga.txt ./7blosxom.cgi/fuga.txt/2003/////foo1/11////bar2/30 http://medaka.5ch.net/test/read.cgi/php/1036141603/180
181: nobodyさん [sage] 03/12/03 02:13 ID:??? >>180 1月ダメじゃん…。 :($m=$_-1): => :($m=$_): !($m&&$m-$M) => !($m&&$m-$M-1) http://medaka.5ch.net/test/read.cgi/php/1036141603/181
182: nobodyさん [] 03/12/03 06:43 ID:4m1BwtbU >175 $p の指定に不具合あり。join忘れてた。 use CGI':all';use File::Find;$P=join'/',grep/^\D\w*$/,(@i=split'/',path_info);( $Y,$M,$D)=grep/^\d+$/,@i;find sub{($d,$m,$y)=(localtime($t=(stat)[9]))[3..5];!( !($Y&&$Y-$y-1900)&&!($M&&$M-$m-1)&&!($D&&$D-$d)&&/\.txt/&&(!$i[-1]||/^$i[-1]$/) )or$e{$File::Find::name}=$t},"./$P";put header,start_html;for(sort{$e{$b}<=>$e{ $a}}keys%e){open F,$_;s/^\.//;chomp($h=<F>);put h2(a{href,url.$_},$h),pre<F>,hr ;close F}put end_html; 若干仕様変更。 - カテゴリ名は /^\D\w*$/ - ファイルの指定は、PATH_INFO の末尾のみ有効。 - findの対象はカレントディレクトリ以下のみ。(絶対パス指定できるのは、流石にちょっと BTW,ファイルハンドルってスコープ抜けたら勝手にcloseされるんだっけ?perlって。 http://medaka.5ch.net/test/read.cgi/php/1036141603/182
183: nobodyさん [sage] 03/12/03 07:46 ID:??? >182 テスト不十分だった。訂正 > $i[-1]!~/\.txt$/||/^$i[-1]$/ http://medaka.5ch.net/test/read.cgi/php/1036141603/183
184: 7thread [sage] 03/12/03 09:43 ID:??? use CGI":all";*i=*param;*x=*textfield;sub e{escapeHTML i pop}sub l{a{href,pop}, pop}chdir G;-e($b=i(B)||e S)||open F,">$b";open F,"+<$b";eval{flock F,2};[<F>]; s!\w+://.+$!l$&,$&!eg,s/\n/br/eg,print F dt($.+1,':'.b(l e(N)||nobody,'mailto:' .e M),':'.localtime),dd($_),"\n"if$_=e T;seek F,0,0;put header,start_html($b), startform,$b?h1($b).dl(<F>).hidden(B,$b).l list,'?':ol(li[map{l$_,"?B=$_"}sort{ -M$a<=>-M$b}<*>]).thread.x(S),br,submit,NAME,x(N),MAIL,x(M),br,textarea(T,'',6, 80,1),endform,end_html http://medaka.5ch.net/test/read.cgi/php/1036141603/184
185: nobodyさん [sage] 03/12/03 20:55 ID:??? 7thread.cgi l10n for Japanese :) #!/usr/local/bin/perl use CGI":all";*i=*param;*x=*textfield;sub e{escapeHTML i pop}sub l{a{href,pop}, pop}chdir G;-e($b=i(B)||e S)||open F,">$b";open F,"+<$b";eval{flock F,2};[<F>]; s!\w+://.+$!l$&,$&!eg,s/\n/br/eg,print F dt($.+1,':'.b(l e(N)||'ナナシ','mailto:'. e M),':'.localtime),dd($_),"\n"if$_=e T;seek F,0,0;put header(-charset=>$c= Shift_JIS),start_html(-title=>$b||$0,encoding,$c,lang,ja),startform,$b?h1($b). dl(<F>).hidden(B,$b).l 'スレ','?':ol(li[map{l$_,"?B=$_"}sort{-M$a<=>-M$b}<*>]).'ス レ'.x(S),br,submit,Name,x(N),Mail,x(M),br,textarea(T,'',6,80,1),endform,end_html >>182 検証方法が思いつかず…。>スコープ抜けで close http://medaka.5ch.net/test/read.cgi/php/1036141603/185
186: nobodyさん [sage] 03/12/03 23:13 ID:??? 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<F>,hr}put end_html >>182 '..' さえ防いだら大丈夫な気も… 既に開かれてるファイルハンドルを open し直すと、開いていたファイルは close されてから新しいファイルを open するので、close は明示しなくても 可な筈。 http://perldoc.com/perl5.8.0/pod/func/close.html http://medaka.5ch.net/test/read.cgi/php/1036141603/186
187: nobodyさん [sage] 03/12/03 23:57 ID:??? >>186 ちと修正。 #!/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)& /\Q$R\E$/},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<F>,hr}put end_html http://medaka.5ch.net/test/read.cgi/php/1036141603/187
188: nobodyさん [sage] 03/12/04 01:07 ID:??? なにこのすれ(;´Д`) http://medaka.5ch.net/test/read.cgi/php/1036141603/188
189: 128 [] 03/12/04 03:24 ID:h3ZU5uFM 皆、お疲れ〜。 元気っぽいですな。 >>185 7thread 修正どうもです。かなりいけてました。 charset()を使わないと、escapeHTMLで文字化けが起こりますね。(「機能」とか) EUCにしようかとも思ったんだけど。 #!/usr/local/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;$b=e(B)||e S;open F,"+>>$b";flock F,2;[<F>];$t= 'スレッド';s!\w+://.+$!l$&,$&!emg,s/\n/br/eg,print F dt($.+1,':'.b(l e(N)||'七氏', 'mailto:'.e M),':'.gmtime),dd($_),"\n"if$_=e T;seek F,0,0;put header,start_html (-title=>$b||$t,encoding,$c,lang,ja,style,[<DATA>]),startform,h1($b||$t),$b?dl( <F>).hidden(B,$b).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 http://medaka.5ch.net/test/read.cgi/php/1036141603/189
190: 128 [] 03/12/04 03:32 ID:h3ZU5uFM オオボケでした。 開発中のを送ってしまった。 こっちです。 use CGI":all";charset$c=Shift_JIS;*i=*param;*x=*textfield;sub l{a{href,pop},pop }sub e{escapeHTML i pop}chdir G;$b=e(B)||e S;open F,"+>>$b";flock F,2;[<F>];$t= 'スレッド';s!\w+://.+$!l$&,$&!emg,s/\n/br/eg,print F dt($.+1,':'.b(l e(N)||'七氏', 'mailto:'.e M),':'.gmtime),dd($_),"\n"if$_=e T;seek F,0,0;put header,start_html (-title=>$b||$t,encoding,$c,lang,ja),startform,h1($b||$t),$b?dl(<F>).hidden(B, $b).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 http://medaka.5ch.net/test/read.cgi/php/1036141603/190
191: nobodyさん [sage] 03/12/04 06:04 ID:??? >>189 > charset()を使わないと、escapeHTMLで文字化け あぁ、確かに ad hoc な事やってますな…。相変わらず CGI.pm はダサい。:< #!/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}sub r{seek F,0,0}chdir G;($b=e(B)||e S)=~m![./]!&¨ open F,"+>>$b";flock F,2;r;[<F>];s!\w+://.+!l$&,$&!eg,s/\n/br/eg,print F dt($.+ 1,':'.b(l e(N)||'七氏','mailto:'.e M),':'.localtime),dd($_),"\n"if$_=e T;r;$t= 'スレ';put header,start_html(-title=>$b||$t,encoding,$c,lang,ja),startform,$b?h1( $b).dl(<F>).hidden(B,$b).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 ・レス番号が増えないのを fix 。 ・スレタイに [./] は使用不可 (「../7thread.cgi」なんてスレ立てられると…) 。 ・gmtime は流石にどうかと思う。 ・上記改造のしわ寄せを h1 周りに。 http://medaka.5ch.net/test/read.cgi/php/1036141603/191
192: nobodyさん [] 03/12/04 21:36 ID:b7RTKokI 7thread 差分 < *i=*param < sub e{escape i pop} > sub e{escape param pop} > -title=>$b=($t='スレ') >186 thx URL なるほど、close省略出来たんだ。 FileHandle にはスコープは関係なかったね。IO::Fileと勘違いしてた。 blosxom ... 残り1行じゃFlavourは無理かなぁ http://medaka.5ch.net/test/read.cgi/php/1036141603/192
193: 128 [] 03/12/05 03:38 ID:2kvaGCEL 乙カレーっす。 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=><DATA>,encoding,$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;} http://medaka.5ch.net/test/read.cgi/php/1036141603/193
194: nobodyさん [] 03/12/05 06:41 ID:1VQJofzV 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 http://medaka.5ch.net/test/read.cgi/php/1036141603/194
195: nobodyさん [sage] 03/12/05 06:41 ID:??? >>193 一引数の open で開き直すのはナイスですな。 start_html に -style を指定すると、外部 CSS への link 要素を吐く (少なくとも CGI.pm 3.00 では) 。ので、style 要素に変更。 #!/usr/bin/perl use CGI":all";sub l{a{href,pop},pop}sub e($){escapeHTML param pop}($C,$B,$S,$D) =<DATA>;charset$C;chdir G;($F=e B||e S)=~m![./]!?die:open F,">>$F";flock F,2;s! \w+://.+!l$&,$&!egx,s/\n/br/eg,print F li(b(e M?l e N||$D,'mailto:'.e M:e N||$D ),localtime.p$_)if$_=e T;*x=*textfield;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 Threads,'?':ol(li[map{l$_,"?B=$_"}sort{-M$a<=>-M$b}<*>]).NewThread.x(S),br, submit,Name,x(N),Mail,x(M),br,textarea(T,'',7,80,1),endform,end_html __DATA__ Shift_JIS 7ch h1{color:red; font-size:140%;} p {margin:0; padding:0.5em; background:#EEF;} 七氏 http://medaka.5ch.net/test/read.cgi/php/1036141603/195
196: 195 [sage] 03/12/05 06:42 ID:??? >>194 むぅ。(w http://medaka.5ch.net/test/read.cgi/php/1036141603/196
197: nobodyさん [sage] 03/12/05 07:03 ID:??? >193 お疲れ様。取り急ぎ、動作報告します。 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="..." となるので特に影響はないけど。 http://medaka.5ch.net/test/read.cgi/php/1036141603/197
198: nobodyさん [sage] 03/12/05 13:00 ID:??? >>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 だと開いたままいぢれたけど。 http://medaka.5ch.net/test/read.cgi/php/1036141603/198
199: 128 [sage] 03/12/05 18:07 ID:??? 皆様。乙! 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;} http://medaka.5ch.net/test/read.cgi/php/1036141603/199
200: nobodyさん [sage] 03/12/05 22:30 ID:??? マ板から誘導されました。 既出と承知しつつ、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;} http://medaka.5ch.net/test/read.cgi/php/1036141603/200
201: nobodyさん [sage] 03/12/06 00:29 ID:??? >>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 (>>128〜) 、参加作という事で http://cm.xrea.cc/ に載せていいですか? >オリジナル作者各位 と言っても実際に載せるのは年越してからになると思いますが(苦)。 http://medaka.5ch.net/test/read.cgi/php/1036141603/201
202: nobodyさん [sage] 03/12/06 17:16 ID:??? スレ汚し失礼。簡易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} http://medaka.5ch.net/test/read.cgi/php/1036141603/202
203: 128 [sage] 03/12/07 00:41 ID:??? >>201 7ch と 7thread のオリジナル作者です。 どうぞ載せてくださいませ。 http://medaka.5ch.net/test/read.cgi/php/1036141603/203
204: nobodyさん [] 03/12/07 03:57 ID:enSfwhvY >201 参加してたんだw。どぉも。一年ぶりです。 <- 7blosxomのプロトタイプ提供者(===7wiki)です。 > http://cm.xrea.cc/ に載せていいですか? 他にも幾つかストックあるので、公開時には掲載よろしくお願いします。m(_ _)m http://medaka.5ch.net/test/read.cgi/php/1036141603/204
205: 7uploader [] 03/12/07 09:25 ID:enSfwhvY もっと詰めてからにしようと思ったけど、とりあえず公開します。後はよろしく:) #!/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) [ ] 他のブラウザへの対応。 http://medaka.5ch.net/test/read.cgi/php/1036141603/205
206: nobodyさん [sage] 03/12/07 09:39 ID:??? >>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) http://medaka.5ch.net/test/read.cgi/php/1036141603/206
207: nobodyさん [] 03/12/07 20:49 ID:enSfwhvY 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が返らなかった。 端末への対応、悪化してたりしたらゴメン(焦 http://medaka.5ch.net/test/read.cgi/php/1036141603/207
208: 7hoo [] 03/12/09 13:46 ID:+unlQkjh PerlHoo(http://www.webreference.com/perl/xhoo/)です。 ディレクトリ型のリンク集。後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 {} \; http://medaka.5ch.net/test/read.cgi/php/1036141603/208
210: nobodyさん [sage] 03/12/10 15:33 ID:??? おつかれ〜 http://medaka.5ch.net/test/read.cgi/php/1036141603/210
211: 200 [sage] 03/12/11 21:24 ID:??? 連投でうざかったらすみません。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行です。 //項目が全部ひらがななのは自サイトで使う用なので。苦笑 http://medaka.5ch.net/test/read.cgi/php/1036141603/211
212: 200 [sage] 03/12/11 21:51 ID:??? それと、2行目の$Fでログファイル名、$nで自ファイル名を変更可能。 3行目の先頭にある18を「最大ログ数にしたい数-2」に変更すれば 最大ログを設定できます。 http://medaka.5ch.net/test/read.cgi/php/1036141603/212
213: nobodyさん [sage] 03/12/12 02:52 ID:??? ● 最低限押さえるべきポイント for Perl ・識別子は全て一文字にする ・演算子の優先順位を把握して冗長な括弧を全て省く ・サブルーチンは頭の方で宣言して routine(); から括弧を省く ・ブロックの最後の文はセミコロンを省略できる ("main" ブロック然り) ● 基本縮めテクニック for Perl ・使用する関数に関してマニュアルを精読する :) ・bare word ([A-Za-z]\w*) を使ってクォートを省く ・長い名前の関数を複数回使うなら別名を作る (*P=*param;) ・特殊変数や暗黙の代入を積極的に使う ・(スカラー|リスト|ブール)コンテキストでの各挙動を意識する ● Tips for Perl ・同名のファイルハンドルを open し直すなら close は要らない (>>186 参照) ・最も短くかける無限ループは "{ ... ;redo}" ● 「使える」Web プログラムを目指す人に ・XSS 脆弱性に配慮する ・文字コードに依存する定数は外部へ追い出す ・「想定外の入力」でどのように誤作動するか確認する ・多機能より堅牢を Tips を充実させたいところ。 http://medaka.5ch.net/test/read.cgi/php/1036141603/213
214: nobodyさん [] 03/12/12 19:15 ID:O0tbE8Vp 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を出力する関数を作る。 事例 >>122 7rss.cgi - 自分自身のURL -> url, self_url - 他。 大抵の機能はモジュールで提供してくれてるが、VERSIONの違いには注意。 http://medaka.5ch.net/test/read.cgi/php/1036141603/214
215: PATH_INFO 内での '..' [] 03/12/12 19:52 ID:O0tbE8Vp >>186 読んで思い出した。 PATH_INFO に .. が現れるのってどういった場合なんでしょう? 親ディレクトリより上を参照出来る危険があるのかなと思ったけど。 QUERY_STRINGからなら勿論チェックが必要ですが。 PATH_INFOの場合CGI自体が呼ばれない様な気がする。 以下のようなリクエストを試してみました ttp://www.example.com/bar.cgi/../ ttp://www.example.com/~foo/bar.cgi/../ ttp://www.example.com/~foo/bar.cgi/../~foo/bar.cgi bar.cgi/../ とすると、 サーバーは bar.cgi のあるディレクトリの indexを返してくる様なんだけど。 これって、サーバーの実装に依存するのかな?apache,IIS他幾つかのサイトで確認。 流石にDocumentRootより上を参照しようとするとBad Requestになるけど。 今、丁度7行HTTPdを公開しようと調整していたので、自分でも調べるつもりですが もし、詳しく知ってる方いたらフォローお願いします。m(_ _)m http://medaka.5ch.net/test/read.cgi/php/1036141603/215
216: nobodyさん [sage] 03/12/13 16:17 ID:??? ご自由に編集して下さい。(´ω` http://cm.xrea.cc/techinfo.cgi #--- 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 を参考に色々いぢってみました。 http://medaka.5ch.net/test/read.cgi/php/1036141603/216
217: nobodyさん [sage] 03/12/15 02:27 ID:??? >>215 /foo%5C..%5C..%5Cbar なんてのをそのまま Win 鯖で食うとヤバいかと。 http://medaka.5ch.net/test/read.cgi/php/1036141603/217
218: 7memo [sage] 03/12/15 13:08 ID:??? ちょぼちょぼいぢり。 #!/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 http://medaka.5ch.net/test/read.cgi/php/1036141603/218
219: nobodyさん [sage] 03/12/15 13:18 ID:??? >>218 s/\$F/\$_/g; _| ̄|○ http://medaka.5ch.net/test/read.cgi/php/1036141603/219
220: Unit7.pm [] 03/12/15 17:14 ID:zoqm3JaO #!/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 で実行できるかな?と互換性を期待したけど、無理だった。 http://medaka.5ch.net/test/read.cgi/php/1036141603/220
221: nobodyさん [] 03/12/15 17:21 ID:zoqm3JaO >>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"); } } http://medaka.5ch.net/test/read.cgi/php/1036141603/221
222: nobodyさん [] 03/12/15 18:50 ID:zoqm3JaO >>220.diff - $o ... 成功したテストの数 + $O ... 成功したテストの数 >>221 の捕捉。 基底クラスを Test::Unit::TestCase に変更するとTestRunner.pl でも実行できます。 でも、Test::Unit::TestCase => Unit7の互換はなし。 >>216 ありがとう。早速使わせてもらってます。 >>218 ()や{}の末尾では、引数の型宣言なしに弧省略出来たと思う。 nice tricky closure. FP的なアプローチってコードの短縮に貢献出来るテクニック多いよね。 >>217 Windows 環境の事すっかり忘れてた。 でも、エンコードしなきゃ大丈夫じゃない? %5C http://medaka.5ch.net/test/read.cgi/php/1036141603/222
223: nobodyさん [sage] 03/12/16 04:29 ID:??? >>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 は周りに無いので未調査。 http://medaka.5ch.net/test/read.cgi/php/1036141603/223
224: 7memo [sage] 03/12/16 14:56 ID:??? これで一旦完成。 #!/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 http://example.com/path/to/your.css save Default Page Title 20 70 http://medaka.5ch.net/test/read.cgi/php/1036141603/224
225: nobodyさん [sage] 03/12/20 01:06 ID:??? >>224 お疲れ様です。 使いやすいしいい感じ。 http://medaka.5ch.net/test/read.cgi/php/1036141603/225
226: ?O?????|?X [] 03/12/28 16:50 ID:7YW8A3U6 c http://medaka.5ch.net/test/read.cgi/php/1036141603/226
227: ?O?????|?X [] 03/12/28 21:24 ID:7YW/F4a6 b http://medaka.5ch.net/test/read.cgi/php/1036141603/227
228: ?O?????|?X [] 03/12/30 16:01 ID:2yZZI8A2 ccv http://medaka.5ch.net/test/read.cgi/php/1036141603/228
229: nobodyさん [ ] 04/01/02 08:14 ID:??? (・Д・) http://medaka.5ch.net/test/read.cgi/php/1036141603/229
230: nobodyさん [sage] 04/01/18 12:18 ID:??? テクニックメモを基に既存プログラムのメンテ中。 ・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 "http://my.netscape.com/publish/formats/rss-0.91.'. '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>' http://medaka.5ch.net/test/read.cgi/php/1036141603/230
231: 7ch.cgi [sage] 04/01/18 14:25 ID:??? #!/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 } http://medaka.5ch.net/test/read.cgi/php/1036141603/231
232: nobodyさん [] 04/01/18 20:09 ID:Hq0k6H3L CCC http://medaka.5ch.net/test/read.cgi/php/1036141603/232
233: 7blosxom [sage] 04/01/19 14:33 ID:??? http://cm.xrea.cc/prog/7blosxom.shtml 仕様は >>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$!} http://medaka.5ch.net/test/read.cgi/php/1036141603/233
234: nobodyさん [] 04/01/20 15:14 ID:F518czSp 激しく板違いなんですけど 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ルーチンで済ますことってできますか? http://medaka.5ch.net/test/read.cgi/php/1036141603/234
235: 234 [age] 04/01/20 15:22 ID:??? 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"; } } } } } 間違えました。訂正しまつでつ。 http://medaka.5ch.net/test/read.cgi/php/1036141603/235
236: 234 [age] 04/01/20 15:25 ID:??? ついでに2回のforルーチンでもいいです。 http://medaka.5ch.net/test/read.cgi/php/1036141603/236
237: nobodyさん [sage] 04/01/20 16:52 ID:??? >>234 コードを短くしたいという意図はわかるけど、 実用的なプログラムでは、ここに挙がっている様なテクニックは、 なるべく使わない方が良いよ。 http://medaka.5ch.net/test/read.cgi/php/1036141603/237
238: nobodyさん [sage] 04/02/01 15:24 ID:??? #!/usr/bin/perl require 'bbs.pl'; bbsmain(); 3行で掲示板作ったぞ http://medaka.5ch.net/test/read.cgi/php/1036141603/238
239: nobodyさん [sage] 04/02/01 22:12 ID:??? >>238 モジュール/ライブラリに関して >>46, >>135 >>136, >>174 >>175 http://medaka.5ch.net/test/read.cgi/php/1036141603/239
240: nobodyさん [sage] 04/02/12 06:42 ID:??? 転載 #!/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 http://medaka.5ch.net/test/read.cgi/php/1036141603/240
241: nobodyさん [sage] 04/02/12 06:51 ID:??? >>240 それがそもそもの始まりだったりする。 http://pc3.2ch.net/tech/kako/984/984182993.html http://medaka.5ch.net/test/read.cgi/php/1036141603/241
242: nobodyさん [] 04/02/16 23:08 ID:j3AvJVjF 保守age。ついでに、あまり役に立ちそうにないTip 配列と配列サイズを同時に宣言 my $length_of_array = my @array = (1, 2, 3, 4, 5); http://medaka.5ch.net/test/read.cgi/php/1036141603/242
243: 7wiki [] 04/02/18 20:32 ID:b6u9ly2x * 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 http://medaka.5ch.net/test/read.cgi/php/1036141603/243
244: nobodyさん [sage] 04/02/19 09:30 ID:??? >>243 eval の {} は外せないですよ。 eval flock F,2; だと flock() の戻り値から成る文字列を eval する事に。 unlink の問題はあっちでも指摘されてますが。:o) http://medaka.5ch.net/test/read.cgi/php/1036141603/244
245: 7uploader [sage] 04/02/19 11:44 ID:??? 順番的には先に 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 が必要に。 ファイル名は連番や時刻等にする方が安心且つ楽かな。 http://medaka.5ch.net/test/read.cgi/php/1036141603/245
246: nobodyさん [] 04/02/19 20:30 ID:mWwpYaYp >>244 あ、なるほど。それではevalの意味がなくなってしまう。 一応、事前に実験したんですが、検証方法が間違ってました。m(_ _) フォローありがとうございます。 > unlink の問題はあっちでも指摘されてますが。:o) あぁ、やってしまったぁ。試してくれた方ありがとう&&すみません。 ひとまず >>243は無効って事で、代案考えます。 ところで、ライセンスや掲載許可みたいな事を尋ねられたのだけど、 wiki, や blosxom, はオリジナルと同じ GPL って事でいいかな? 実際、7wikiはYukiWiki, 7blosxomは初期のblosxomを参考にしたので。 http://medaka.5ch.net/test/read.cgi/php/1036141603/246
247: SevenLines の中の人 [sage] 04/02/19 21:28 ID:??? >>246 ライセンスやら何やらは原作者に尋ねるのがスジですが、初出が 2ch だけに連絡取り辛いですな。各スレで直接呼びかけるしか無いかも。 SevenLines で保守している作品については、各原作者と配布形態等を 逐一取り決めてはいないので、建前上あのような断り書きの縛りにして います。拙作のは全部修正 BSD ライセンスで、アーカイヴにライセンス 文書も同梱してます。 ニーズがあるなら専用ドメイン取って、転送メールアドレスの提供ぐらいは しますよん。:) >各原作者殿 http://medaka.5ch.net/test/read.cgi/php/1036141603/247
248: nobodyさん [] 04/02/20 22:48 ID:g/Yl/nab # 重要な事を書き忘れました。 246==7wiki, 7files, 7search, 7rss, 7blosxom, 7Unit, 7uploader, 7hoo 原作です。 (当然だけど、オリジナルではなくこのスレの7行版の方の、です) 掲載許可に関しては、手間のかからない方法で「連絡不要」って事でいいかな? 連絡先作って貰っても、どれほど需要があるかは自分にもわからないので。 ライセンスについては、 #!/usr/bin/perl -w -- "License: http://www.gnu.org/licenses/gpl.txt" で、どぉでしょう?GPL以外でもいいけど http://medaka.5ch.net/test/read.cgi/php/1036141603/248
249: 246 [] 04/02/22 02:18 ID:Sgt6pnb3 >ライセンスの件 ... 自分が叩き台を出したとは言え、成果物はこのスレで参加者皆のものなので 出来れば他の方の意見も伺っておきたいのですが。特に異論がなければ、 >>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 # ブラウザからアクセス http://medaka.5ch.net/test/read.cgi/php/1036141603/249
250: SevenLines の中の人 [sage] 04/02/22 20:17 ID:??? とりあえず 7wiki, 7files, 7search, 7rss, 7blosxom を GPL で パッケージングしときました。README やライセンス文書の 和訳同梱までは手が回らなかったので、その辺はご希望が あれば追々。 あー、ココに載せるにゃデカ目のファイルのやり取り用に 7uploader 改良して設置しますかのぅ(笑)。 7Unit, 7uploader, 7hoo もその内転載させてもらいますね。 http://medaka.5ch.net/test/read.cgi/php/1036141603/250
251: nobodyさん [sage] 04/02/22 23:23 ID:??? 7wiki と 7uploader 。どちらも shebang 無し七行ルールじゃないと辛いですな。 use CGI":all";charset$c='EUC-JP';$w='\b(([A-Z][a-z]+){2,})';$f=script_name;$/=( );($p)=(path_info||FrontPage)=~/$w/;if(open F,($m=param z)?">$p":$p){eval{flock F,2};print F$m||=<F>;close F}param(d)eq"D"&&unlink$p;$_=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,map{submit d,$ _}Write,Delete),endform,hr,$_,end_html ・削除機能の実装案。 use CGI":all";$CGI::POST_MAX=1024000;$/=\4096;sub v{open(F,pop)||die;binmode F} chdir D;if($f=upload f){$f=~/\.\w+$/;v">".time.$&;print F$_ while<$f>;close F}$ i++<20?push@f,$_:unlink for sort{-M$a<=>-M$b}<*>;($_=param d)?(v($_),put header (-Content_length=>-s,attachment,$_,Type,'application/octet-stream'),<F>):put( header,start_html,start_multipart_form,filefield(f),submit,endform,hr,table({ border,1},Tr[th([qw/name date size/]),map{td([a({href,"?d=$_"},$_),''.localtime ((stat)[9]),-s])}@f]),end_html) ・ファイル名を time に。 ・最大保存数を設定可能に。 http://medaka.5ch.net/test/read.cgi/php/1036141603/251
252: nobodyさん [sage] 04/02/23 22:42 ID:??? 7wikiがすこし結城さんとかにとりあげられて話題になってるんですね。 http://medaka.5ch.net/test/read.cgi/php/1036141603/252
253: nobodyさん [sage] 04/02/24 00:00 ID:??? >>251 7wiki 修正。 s/param(d)eq"D"/param(d)=~D/; s/Delete/Del/; http://medaka.5ch.net/test/read.cgi/php/1036141603/253
254: nobodyさん [sage] 04/02/24 10:13 ID:??? >>250 ありがとうございます。7voteもついでによろしく。 7hooがまだ8行なのを先に何とかしたいけど、他のドキュメント類も暇みて整理してみます。 # 7wiki 削除機能案 B ... POSTで空投稿のときページ削除 use CGI":all";charset$c='EUC-JP';$w='\b(([A-Z][a-z]+){2,})';$f=script_name;$/=( );($p)=(path_info||FrontPage)=~$w;unlink$p if!($m=param z)&&request_method=~/PO ST/x;(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(POST,"$f/$p"),p(textarea(z,$m,6,60),br, submit),endform,hr,$_,end_html 後、削れそうなとこといったら、charset'utf-8'にしてencodingはデフォルトにする 位かな。不便になるけど。それでもShebang込7行はちょっと難しそぉ。 http://medaka.5ch.net/test/read.cgi/php/1036141603/254
255: nobodyさん [sage] 04/02/24 12:35 ID:??? >>254 こっちの方がシンプルですな。微妙に縮め。 use CGI":all";charset$c="EUC-JP";$w='\b(([A-Z][a-z]+){2,})';$f=script_name;$/=( );($p)=(path_info||FrontPage)=~/$w/;request_method=~PO&!($m=param z)&&unlink$p; 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,lang,ja, encoding,$c),h1($p),startform(0,"$f/$p"),p(textarea(z,$m,6,60),br,submit), endform,hr,$_,end_html http://medaka.5ch.net/test/read.cgi/php/1036141603/255
256: nobodyさん [sage] 04/02/24 13:06 ID:??? charset "utf-8"; にしても XML 宣言の encoding は iso-8859-1 のままなので、 start_html の encoding は外せませんな…。(CGI.pm v3.04) iso-8859-1 && en-US なら楽勝。 use CGI":all";$w='\b(([A-Z][a-z]+){2,})';$f=script_name;$/=();($p)=(path_info|| FrontPage)=~/$w/;request_method=~PO&!($m=param z)&&unlink$p;open(F,$m?">$p":$p) ,eval{flockF,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),h1($p),startform(0,"$f/$p"), p(textarea(z,$m,6,60),br,submit),endform,hr,$_,end_html http://medaka.5ch.net/test/read.cgi/php/1036141603/256
257: 7Hoo [sage] 04/02/24 22:23 ID:??? use CGI":all";charset$c="EUC-JP";($p=path_info||Home)=~s!^/+|/+$!!g;chdir("./". $p)||die;$F='.7hoo';if(@p=map{param$_}U,T,D){s/\s/ /g for@p;open F,">>$F";eval{ flock F,2};$"="\t";print F"@p\n"}put header,start_html(-encoding=>$c,lang,ja, Title,"7Hoo"),p(join" / ",map{a{href,url.($i.="/$_")},$_}split"/",$p),hr,ul(li[ map{a{href,url."/$p/$_"},$_}grep-d,<*>]),open(F)&&hr.dl(map{@N=split/\t/;dt(a{ href,$N[0]},b$N[1]),dd$N[2]}<F>),hr,startform(0,url."/$p"),p((map{textfield( /(.)/,$_,40),br}Url,Title),textarea(D,"",3,40,1),br,submit,),endform,end_html ・l10n 。 ・Home ディレクトリをスクリプトと同階層に用意。 ・カテゴリの table をやめて ul 一つに。 ・リンクリストを dl に。 ・登録フォームを常に表示。 http://medaka.5ch.net/test/read.cgi/php/1036141603/257
258: Store7.pm [] 04/02/27 22:01 ID:xssKWf0b package Store7;sub E{$_=shift;s/\\/\\\\/g;s/'/\\'/g;$_}@ISA='Exporter';@EXPORT= @EXPORT_OK=qw/store retrieve/;sub store{open my$o,">$_[1]";print$o ''.d($_[0]); }sub retrieve{do$_[0]}sub d{my$f=shift;my$e=ref$f;$e eq'SCALAR'?"'".E($$f)."'": $e eq'ARRAY'?'['.join(',',map{d($_)}@$f).']':$e eq'HASH'?'{'.join(',',map{my$k= $_;$_="'".E($k)."'=>".d($f->{$k})}keys%$f).'}':"'".E($f)."'"};use Exporter;1 なんとか5行でStorable.pmと同じ使い方です(storeとretrieveだけ)。 store( \%hashとか\@array, 'data.txt' ); $hash_ref = retrieve('data.txt'); http://medaka.5ch.net/test/read.cgi/php/1036141603/258
259: nobodyさん [] 04/02/27 23:21 ID:aqbVKltF 無造作に縮めてみる。 package Store7;@ISA=Exporter;@EXPORT=@EXPORT_OK=qw/store retrieve/;use Exporter ;sub E{$_=pop;s/(\\|')/\\$1/g;$_}sub d{my$e=ref(my$f=pop);$e eq 'SCALAR'?"'".E$ $f."'":$e eq 'ARRAY'?'['.join(',',map{d$_}@$f).']':$e eq 'HASH'?'{'.join(',', map{"'".E($_)."'=>".d($f->{$_})}keys%$f).'}':"'".E($f)."'"}sub store{open my$o, ">$_[1]";print$o d($_[0])}sub retrieve{do$_[0]} http://medaka.5ch.net/test/read.cgi/php/1036141603/259
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 193 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
アボンOFF
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.021s