・7行×79文字
・Perl
どうぞ。
探検
七行プログラミング
1nobodyさん
02/11/01 18:06ID:umVq3FGM166保守
03/10/04 05:54ID:??? $$_=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/
}}
"}++&&$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/
}}
167nobodyさん
03/10/05 03:33ID:??? 本家スレで出てた切符問題の 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 だと不可。
選択された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 だと不可。
168nobodyさん
03/10/05 20:23ID:??? コマンドライン・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を含めない
#--- 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を含めない
169nobodyさん
03/10/08 01:14ID:??? 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'}
#!/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'}
1707blosxom
03/12/01 03:01ID: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
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
1717blosxom
03/12/01 03:13ID: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/ ... 正規表現が手抜きな為、数字+文字の組合せは無視される。
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/ ... 正規表現が手抜きな為、数字+文字の組合せは無視される。
172nobodyさん
03/12/01 06:28ID: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 とアクセスする。
#!/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 とアクセスする。
173128
03/12/01 18:34ID: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
------------------------------------------------------
スレッド式掲示板です。
データ用ディレクトリ 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
------------------------------------------------------
174nobodyさん
03/12/01 20:35ID:lEOu0k9S モジュールありだったらいくらでも短くできるのでは?
175nobodyさん
03/12/01 23:22ID: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::関連のモジュールを使えば制限内でも、もっと機能追加出来そうだし。
ただし、短くするためにわざわざモジュールを作る気はなし。
#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::関連のモジュールを使えば制限内でも、もっと機能追加出来そうだし。
ただし、短くするためにわざわざモジュールを作る気はなし。
177nobodyさん
03/12/02 18:25ID:???178nobodyさん
03/12/02 22:21ID:??? >>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
足したり引いたりしてみた。
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
179nobodyさん
03/12/02 23:32ID:??? >>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}
#!/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}
180nobodyさん
03/12/03 02:02ID:??? 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
#!/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
181nobodyさん
03/12/03 02:13ID:???182nobodyさん
03/12/03 06:43ID: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って。
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って。
183nobodyさん
03/12/03 07:46ID:??? >182
テスト不十分だった。訂正
> $i[-1]!~/\.txt$/||/^$i[-1]$/
テスト不十分だった。訂正
> $i[-1]!~/\.txt$/||/^$i[-1]$/
1847thread
03/12/03 09:43ID:??? 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
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
185nobodyさん
03/12/03 20:55ID:??? 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
#!/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
186nobodyさん
03/12/03 23:13ID:??? 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
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
187nobodyさん
03/12/03 23:57ID:??? >>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
ちと修正。
#!/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
188nobodyさん
03/12/04 01:07ID:??? なにこのすれ(;´Д`)
189128
03/12/04 03:24ID: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
元気っぽいですな。
>>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
190128
03/12/04 03:32ID: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
開発中のを送ってしまった。
こっちです。
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
191nobodyさん
03/12/04 06:04ID:??? >>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 周りに。
> 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 周りに。
192nobodyさん
03/12/04 21:36ID: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は無理かなぁ
< *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は無理かなぁ
193128
03/12/05 03:38ID: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;}
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;}
194nobodyさん
03/12/05 06:41ID:1VQJofzVsage機能実装。大幅に機能削ってしまったので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
195nobodyさん
03/12/05 06:41ID:??? >>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;}
七氏
一引数の 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;}
七氏
197nobodyさん
03/12/05 07:03ID:??? >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="..." となるので特に影響はないけど。
お疲れ様。取り急ぎ、動作報告します。
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="..." となるので特に影響はないけど。
198nobodyさん
03/12/05 13:00ID:??? >>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 だと開いたままいぢれたけど。
*本当に下がる* 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 だと開いたままいぢれたけど。
199128
03/12/05 18:07ID:??? 皆様。乙!
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;}
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;}
200nobodyさん
03/12/05 22:30ID:??? マ板から誘導されました。
既出と承知しつつ、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;}
既出と承知しつつ、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;}
201nobodyさん
03/12/06 00:29ID:??? >>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/ に載せていいですか? >オリジナル作者各位
と言っても実際に載せるのは年越してからになると思いますが(苦)。
特にヒネりもなく縮め。
#!/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/ に載せていいですか? >オリジナル作者各位
と言っても実際に載せるのは年越してからになると思いますが(苦)。
202nobodyさん
03/12/06 17:16ID:??? スレ汚し失礼。簡易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}
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}
204nobodyさん
03/12/07 03:57ID:enSfwhvY >201
参加してたんだw。どぉも。一年ぶりです。
<- 7blosxomのプロトタイプ提供者(===7wiki)です。
> http://cm.xrea.cc/ に載せていいですか?
他にも幾つかストックあるので、公開時には掲載よろしくお願いします。m(_ _)m
参加してたんだw。どぉも。一年ぶりです。
<- 7blosxomのプロトタイプ提供者(===7wiki)です。
> http://cm.xrea.cc/ に載せていいですか?
他にも幾つかストックあるので、公開時には掲載よろしくお願いします。m(_ _)m
2057uploader
03/12/07 09:25ID: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)
[ ] 他のブラウザへの対応。
#!/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)
[ ] 他のブラウザへの対応。
206nobodyさん
03/12/07 09:39ID:??? >>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)
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)
207nobodyさん
03/12/07 20:49ID: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が返らなかった。
端末への対応、悪化してたりしたらゴメン(焦
後、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が返らなかった。
端末への対応、悪化してたりしたらゴメン(焦
2087hoo
03/12/09 13:46ID:+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 {} \;
ディレクトリ型のリンク集。後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 {} \;
209nobodyさん
03/12/09 17:55ID:??? # rules >1 >48
# モジュール/ライブラリに関して >46, >135 >136, >174 >175
# カウンター >8, >9, >10, >11
# SWFファイルからJPEGを取り出す >17
# 掲示板(1) >24 >43 >52
# 掲示板(2) >41 >42
# 2ch型掲示板 >55
# スレッド型掲示板 >53
# cgi-lib.po >40
# アクセス解析 >58 >62
# 7wiki.cgi >65 >66 >67 >68 >69 >70 >71 >74 >75 >76 >77 >78 >79 >80 >82 >83 >84 >85 >86 >87 >91 >92 >93 >96 >97 >98 >101 >103
# files.cgi ファイル・マネージャ >88 >94 >95 >99 >100 >102 >104 >105 >106 >107 >108 >109 >110 >111
# 7wiki.cgi 用 RSS出力 >112 >113 >114 >115 >119
# 7wiki.cgi 用 検索 >112 >114 >119
# kat2xhtml 2ch の dat ファイル (かちゅ〜しゃのログ) を XHTML ファイルに変換 >121 >122 >124 >158 >159
# 7ch >128 >130 >131 >132 >134 >137 >139
# portscan.pl >145 >147 >149 >150
# br.cgi >160 >161 >162 >163 >164
# 切符問題 >166 >167 >168 >169
# 7blosxom >170 >171 >172 >175 >180 >181 >182 >183 >186 >187
# 7thread >173 >178 >184 >185 >189 >190 >191 >193 >194 >195 >197 >198 >199
# 動作確認用ファイル生成 4 7blosxom >177 >179
# 掲示板(3) >200 >201
# telnetd >202 >206 >207
# 7uploader.cgi >205
# 7hoo (PerlHoo) >208
# モジュール/ライブラリに関して >46, >135 >136, >174 >175
# カウンター >8, >9, >10, >11
# SWFファイルからJPEGを取り出す >17
# 掲示板(1) >24 >43 >52
# 掲示板(2) >41 >42
# 2ch型掲示板 >55
# スレッド型掲示板 >53
# cgi-lib.po >40
# アクセス解析 >58 >62
# 7wiki.cgi >65 >66 >67 >68 >69 >70 >71 >74 >75 >76 >77 >78 >79 >80 >82 >83 >84 >85 >86 >87 >91 >92 >93 >96 >97 >98 >101 >103
# files.cgi ファイル・マネージャ >88 >94 >95 >99 >100 >102 >104 >105 >106 >107 >108 >109 >110 >111
# 7wiki.cgi 用 RSS出力 >112 >113 >114 >115 >119
# 7wiki.cgi 用 検索 >112 >114 >119
# kat2xhtml 2ch の dat ファイル (かちゅ〜しゃのログ) を XHTML ファイルに変換 >121 >122 >124 >158 >159
# 7ch >128 >130 >131 >132 >134 >137 >139
# portscan.pl >145 >147 >149 >150
# br.cgi >160 >161 >162 >163 >164
# 切符問題 >166 >167 >168 >169
# 7blosxom >170 >171 >172 >175 >180 >181 >182 >183 >186 >187
# 7thread >173 >178 >184 >185 >189 >190 >191 >193 >194 >195 >197 >198 >199
# 動作確認用ファイル生成 4 7blosxom >177 >179
# 掲示板(3) >200 >201
# telnetd >202 >206 >207
# 7uploader.cgi >205
# 7hoo (PerlHoo) >208
210nobodyさん
03/12/10 15:33ID:??? おつかれ〜
211200
03/12/11 21:24ID:??? 連投でうざかったらすみません。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行です。
//項目が全部ひらがななのは自サイトで使う用なので。苦笑
普通の掲示板に変更してみました。
#!/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行です。
//項目が全部ひらがななのは自サイトで使う用なので。苦笑
212200
03/12/11 21:51ID:??? それと、2行目の$Fでログファイル名、$nで自ファイル名を変更可能。
3行目の先頭にある18を「最大ログ数にしたい数-2」に変更すれば
最大ログを設定できます。
3行目の先頭にある18を「最大ログ数にしたい数-2」に変更すれば
最大ログを設定できます。
213nobodyさん
03/12/12 02:52ID:??? ● 最低限押さえるべきポイント for Perl
・識別子は全て一文字にする
・演算子の優先順位を把握して冗長な括弧を全て省く
・サブルーチンは頭の方で宣言して routine(); から括弧を省く
・ブロックの最後の文はセミコロンを省略できる ("main" ブロック然り)
● 基本縮めテクニック for Perl
・使用する関数に関してマニュアルを精読する :)
・bare word ([A-Za-z]\w*) を使ってクォートを省く
・長い名前の関数を複数回使うなら別名を作る (*P=*param;)
・特殊変数や暗黙の代入を積極的に使う
・(スカラー|リスト|ブール)コンテキストでの各挙動を意識する
● Tips for Perl
・同名のファイルハンドルを open し直すなら close は要らない (>>186 参照)
・最も短くかける無限ループは "{ ... ;redo}"
● 「使える」Web プログラムを目指す人に
・XSS 脆弱性に配慮する
・文字コードに依存する定数は外部へ追い出す
・「想定外の入力」でどのように誤作動するか確認する
・多機能より堅牢を
Tips を充実させたいところ。
・識別子は全て一文字にする
・演算子の優先順位を把握して冗長な括弧を全て省く
・サブルーチンは頭の方で宣言して routine(); から括弧を省く
・ブロックの最後の文はセミコロンを省略できる ("main" ブロック然り)
● 基本縮めテクニック for Perl
・使用する関数に関してマニュアルを精読する :)
・bare word ([A-Za-z]\w*) を使ってクォートを省く
・長い名前の関数を複数回使うなら別名を作る (*P=*param;)
・特殊変数や暗黙の代入を積極的に使う
・(スカラー|リスト|ブール)コンテキストでの各挙動を意識する
● Tips for Perl
・同名のファイルハンドルを open し直すなら close は要らない (>>186 参照)
・最も短くかける無限ループは "{ ... ;redo}"
● 「使える」Web プログラムを目指す人に
・XSS 脆弱性に配慮する
・文字コードに依存する定数は外部へ追い出す
・「想定外の入力」でどのように誤作動するか確認する
・多機能より堅牢を
Tips を充実させたいところ。
214nobodyさん
03/12/12 19:15ID: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の違いには注意。
僕も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の違いには注意。
215PATH_INFO 内での '..'
03/12/12 19:52ID: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
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
216nobodyさん
03/12/13 16:17ID:??? ご自由に編集して下さい。(´ω`
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://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 を参考に色々いぢってみました。
2187memo
03/12/15 13:08ID:??? ちょぼちょぼいぢり。
#!/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
#!/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
220Unit7.pm
03/12/15 17:14ID: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 で実行できるかな?と互換性を期待したけど、無理だった。
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 で実行できるかな?と互換性を期待したけど、無理だった。
221nobodyさん
03/12/15 17:21ID: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");
}
}
- 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");
}
}
222nobodyさん
03/12/15 18:50ID:zoqm3JaO >>220.diff
- $o ... 成功したテストの数
+ $O ... 成功したテストの数
>>221 の捕捉。
基底クラスを Test::Unit::TestCase に変更するとTestRunner.pl でも実行できます。
でも、Test::Unit::TestCase => Unit7の互換はなし。
>>216
ありがとう。早速使わせてもらってます。
>>218
()や{}の末尾では、引数の型宣言なしに弧省略出来たと思う。
nice tricky closure.
FP的なアプローチってコードの短縮に貢献出来るテクニック多いよね。
>>217
Windows 環境の事すっかり忘れてた。
でも、エンコードしなきゃ大丈夫じゃない? %5C
- $o ... 成功したテストの数
+ $O ... 成功したテストの数
>>221 の捕捉。
基底クラスを Test::Unit::TestCase に変更するとTestRunner.pl でも実行できます。
でも、Test::Unit::TestCase => Unit7の互換はなし。
>>216
ありがとう。早速使わせてもらってます。
>>218
()や{}の末尾では、引数の型宣言なしに弧省略出来たと思う。
nice tricky closure.
FP的なアプローチってコードの短縮に貢献出来るテクニック多いよね。
>>217
Windows 環境の事すっかり忘れてた。
でも、エンコードしなきゃ大丈夫じゃない? %5C
223nobodyさん
03/12/16 04:29ID:??? >>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 は周りに無いので未調査。
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 は周りに無いので未調査。
2247memo
03/12/16 14:56ID:??? これで一旦完成。
#!/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
#!/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
226?O?????|?X
03/12/28 16:50ID:7YW8A3U6 c
227?O?????|?X
03/12/28 21:24ID:7YW/F4a6 b
228?O?????|?X
03/12/30 16:01ID:2yZZI8A2 ccv
229nobodyさん
04/01/02 08:14ID:??? (・Д・)
230nobodyさん
04/01/18 12:18ID:??? テクニックメモを基に既存プログラムのメンテ中。
・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>'
・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>'
2317ch.cgi
04/01/18 14:25ID:??? #!/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 }
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 }
232nobodyさん
04/01/18 20:09ID:Hq0k6H3L CCC
2337blosxom
04/01/19 14:33ID:??? 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$!}
仕様は >>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$!}
234nobodyさん
04/01/20 15:14ID: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ルーチンで済ますことってできますか?
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ルーチンで済ますことってできますか?
235234
04/01/20 15:22ID:??? 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";
}
}
}
}
}
間違えました。訂正しまつでつ。
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";
}
}
}
}
}
間違えました。訂正しまつでつ。
236234
04/01/20 15:25ID:??? ついでに2回のforルーチンでもいいです。
237nobodyさん
04/01/20 16:52ID:???238nobodyさん
04/02/01 15:24ID:??? #!/usr/bin/perl
require 'bbs.pl';
bbsmain();
3行で掲示板作ったぞ
require 'bbs.pl';
bbsmain();
3行で掲示板作ったぞ
240nobodyさん
04/02/12 06:42ID:??? 転載
#!/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
#!/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
241nobodyさん
04/02/12 06:51ID:???242nobodyさん
04/02/16 23:08ID:j3AvJVjF 保守age。ついでに、あまり役に立ちそうにないTip
配列と配列サイズを同時に宣言
my $length_of_array = my @array = (1, 2, 3, 4, 5);
配列と配列サイズを同時に宣言
my $length_of_array = my @array = (1, 2, 3, 4, 5);
2437wiki
04/02/18 20:32ID: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
* 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
244nobodyさん
04/02/19 09:30ID:??? >>243
eval の {} は外せないですよ。
eval flock F,2; だと flock() の戻り値から成る文字列を eval する事に。
unlink の問題はあっちでも指摘されてますが。:o)
eval の {} は外せないですよ。
eval flock F,2; だと flock() の戻り値から成る文字列を eval する事に。
unlink の問題はあっちでも指摘されてますが。:o)
2457uploader
04/02/19 11:44ID:??? 順番的には先に 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 が必要に。
ファイル名は連番や時刻等にする方が安心且つ楽かな。
#!/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 が必要に。
ファイル名は連番や時刻等にする方が安心且つ楽かな。
246nobodyさん
04/02/19 20:30ID:mWwpYaYp04/02/19 21:28ID:???
>>246
ライセンスやら何やらは原作者に尋ねるのがスジですが、初出が
2ch だけに連絡取り辛いですな。各スレで直接呼びかけるしか無いかも。
SevenLines で保守している作品については、各原作者と配布形態等を
逐一取り決めてはいないので、建前上あのような断り書きの縛りにして
います。拙作のは全部修正 BSD ライセンスで、アーカイヴにライセンス
文書も同梱してます。
ニーズがあるなら専用ドメイン取って、転送メールアドレスの提供ぐらいは
しますよん。:) >各原作者殿
ライセンスやら何やらは原作者に尋ねるのがスジですが、初出が
2ch だけに連絡取り辛いですな。各スレで直接呼びかけるしか無いかも。
SevenLines で保守している作品については、各原作者と配布形態等を
逐一取り決めてはいないので、建前上あのような断り書きの縛りにして
います。拙作のは全部修正 BSD ライセンスで、アーカイヴにライセンス
文書も同梱してます。
ニーズがあるなら専用ドメイン取って、転送メールアドレスの提供ぐらいは
しますよん。:) >各原作者殿
248nobodyさん
04/02/20 22:48ID: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以外でもいいけど
246==7wiki, 7files, 7search, 7rss, 7blosxom, 7Unit, 7uploader, 7hoo 原作です。
(当然だけど、オリジナルではなくこのスレの7行版の方の、です)
掲載許可に関しては、手間のかからない方法で「連絡不要」って事でいいかな?
連絡先作って貰っても、どれほど需要があるかは自分にもわからないので。
ライセンスについては、
#!/usr/bin/perl -w -- "License: http://www.gnu.org/licenses/gpl.txt"
で、どぉでしょう?GPL以外でもいいけど
249246
04/02/22 02:18ID: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 # ブラウザからアクセス
自分が叩き台を出したとは言え、成果物はこのスレで参加者皆のものなので
出来れば他の方の意見も伺っておきたいのですが。特に異論がなければ、
>>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 # ブラウザからアクセス
04/02/22 20:17ID:???
とりあえず 7wiki, 7files, 7search, 7rss, 7blosxom を GPL で
パッケージングしときました。README やライセンス文書の
和訳同梱までは手が回らなかったので、その辺はご希望が
あれば追々。
あー、ココに載せるにゃデカ目のファイルのやり取り用に
7uploader 改良して設置しますかのぅ(笑)。
7Unit, 7uploader, 7hoo もその内転載させてもらいますね。
パッケージングしときました。README やライセンス文書の
和訳同梱までは手が回らなかったので、その辺はご希望が
あれば追々。
あー、ココに載せるにゃデカ目のファイルのやり取り用に
7uploader 改良して設置しますかのぅ(笑)。
7Unit, 7uploader, 7hoo もその内転載させてもらいますね。
251nobodyさん
04/02/22 23:23ID:??? 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 に。
・最大保存数を設定可能に。
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 に。
・最大保存数を設定可能に。
252nobodyさん
04/02/23 22:42ID:??? 7wikiがすこし結城さんとかにとりあげられて話題になってるんですね。
254nobodyさん
04/02/24 10:13ID:??? >>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行はちょっと難しそぉ。
ありがとうございます。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行はちょっと難しそぉ。
255nobodyさん
04/02/24 12:35ID:??? >>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
こっちの方がシンプルですな。微妙に縮め。
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
256nobodyさん
04/02/24 13:06ID:??? 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
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
2577Hoo
04/02/24 22:23ID:??? 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 に。
・登録フォームを常に表示。
$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 に。
・登録フォームを常に表示。
258Store7.pm
04/02/27 22:01ID: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');
@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');
259nobodyさん
04/02/27 23:21ID: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]}
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]}
260258
04/02/28 13:00ID:GPwfHIuc >>259
\->\\したあと、'->\'しなければいけないので、s/(\\|')/\\$1/g;はマズイっぽいです。
\->\\したあと、'->\'しなければいけないので、s/(\\|')/\\$1/g;はマズイっぽいです。
261nobodyさん
04/02/29 22:04ID:??? package Store7;use base Exporter;@EXPORT=qw/store retrieve/;sub retrieve{do$_[0
]}sub E{$_=pop;s/\\/\\\\/g;s/'/\\'/g;"'$_'"}sub d{my$e=ref(my$f=pop);"SCALAR"eq
$e?E$$f:"ARRAY"eq$e?"[".join(',',map{d($_)}@$f)."]":"HASH"eq$e?"{".join(',',map
{E($_),d($f->{$_})}keys%$f)."}":E$f}local*F;sub store{open F,">".pop;print F d
pop;close F}1
・明示的に close しないとバッファに溜まったデータが print されない為、
store 直後に retrieve できない。
・Perl 5.005_03 では do pop が出来なかったので、do $_[0] のままに。
]}sub E{$_=pop;s/\\/\\\\/g;s/'/\\'/g;"'$_'"}sub d{my$e=ref(my$f=pop);"SCALAR"eq
$e?E$$f:"ARRAY"eq$e?"[".join(',',map{d($_)}@$f)."]":"HASH"eq$e?"{".join(',',map
{E($_),d($f->{$_})}keys%$f)."}":E$f}local*F;sub store{open F,">".pop;print F d
pop;close F}1
・明示的に close しないとバッファに溜まったデータが print されない為、
store 直後に retrieve できない。
・Perl 5.005_03 では do pop が出来なかったので、do $_[0] のままに。
262nobodyさん
04/02/29 23:12ID:??? 改行しなければいいんでねーの?
264nobodyさん
04/03/03 04:38ID:??? 新しいお題目なんだけど
七行ハーボット
ってどう?
最低限、カウンタ・人工無能・ミニゲームつきって事で。
七行ハーボット
ってどう?
最低限、カウンタ・人工無能・ミニゲームつきって事で。
266nobody
04/03/04 17:41ID:yJd59Upc accesslog.cgi - 7行アクセス解析。
SSIで埋め込むことで記録。例:<!--#exec cgi="accesslog.cgi"-->
データを見るときは http://○○/accesslog.cgi?20040304&MSIE 6
みたいにパラメータ’日付 & 検索文字列(省略可))を渡して呼び出します。
正直perl歴はまだ半年で、テクニック的なものは使えないのでこの程度です。
#! /usr/bin/perl
sub z{local(*z)=$_[0];$z=~s/^(\d)$/0$1/;}print"Content-Type:text/plain\n\n";%e=
%ENV;$q=$e{'QUERY_STRING'};($s,$n,$h,$d,$m,$y)=localtime;$y+=1900;$m++;z(*m);z(
*d);z(*h);z(*n);z(*s);if(!$q){open(F,">>$y$m$d.txt");print F
"$h$n$s<>$e{'REMOTE_ADDR'}<>$e{'HTTP_USER_AGENT'}<>$e{'HTTP_REFERER'}\n";}else{
($p,$k)=split(/&/,$q);open(F,"$p.txt");while(<F>){$c++;if($_=~/$k/){print;$t++;
}}print"\n全$c件/ヒット$t件\n";}close(F);
SSIで埋め込むことで記録。例:<!--#exec cgi="accesslog.cgi"-->
データを見るときは http://○○/accesslog.cgi?20040304&MSIE 6
みたいにパラメータ’日付 & 検索文字列(省略可))を渡して呼び出します。
正直perl歴はまだ半年で、テクニック的なものは使えないのでこの程度です。
#! /usr/bin/perl
sub z{local(*z)=$_[0];$z=~s/^(\d)$/0$1/;}print"Content-Type:text/plain\n\n";%e=
%ENV;$q=$e{'QUERY_STRING'};($s,$n,$h,$d,$m,$y)=localtime;$y+=1900;$m++;z(*m);z(
*d);z(*h);z(*n);z(*s);if(!$q){open(F,">>$y$m$d.txt");print F
"$h$n$s<>$e{'REMOTE_ADDR'}<>$e{'HTTP_USER_AGENT'}<>$e{'HTTP_REFERER'}\n";}else{
($p,$k)=split(/&/,$q);open(F,"$p.txt");while(<F>){$c++;if($_=~/$k/){print;$t++;
}}print"\n全$c件/ヒット$t件\n";}close(F);
レスを投稿する
ニュース
- 【文春】元TOKIO・国分太一(51)「女性スタッフ2名への“わいせつ事案”」日テレ事情聴取の全貌が分かった! ★6 [Ailuropoda melanoleuca★]
- 【サッカー】UEFA-CL第5節 アーセナル×バイエルン、PSG×トッテナム、リバプール×PSV、オリンピアコス×レアル [久太郎★]
- 【金沢地裁】「風俗嬢に着せようと」南砺の高校で女子バレー部のユニホームを窃盗した男が説明 検察側、拘禁刑4年を求刑 [nita★]
- 【国際法を無視】日本での「中華人民共和国に台湾問題を論じる資格なし」との声に 中国外交部が厳しく反論… ★2 [BFU★]
- 【工作員】「X」のアカウント所在地公開機能が暴いた世論操作の実態 MAGA支持著名アカウントの多くが米国外から運営 日本にも波及 ★3 [ごまカンパチ★]
- 「脅迫だ」国分太一に同情論 音声データ削除要求など日テレの対応を疑問視する声ネットに噴出「それこそコンプラ違反では」★3 [muffin★]
- 足立区の男は何で実名報道されないの?
- 【高市悲報】中国「ふにゃふにゃ言いながら、時が自然に解決するのを期待する—そんなジャップ流は決して通用しない」 [115996789]
- 【悲報】撮り鉄が線路脇で撮影→運転手が降りて退去を促すもゴネて動かず電車が遅延→どっちが悪いか意見が真っ二つに [802034645]
- 【悲報】ゼレンスキー大統領、和平案に大筋合意 ホンコンみたいなウヨ芸人を大統領にするとこうなる [455031798]
- 【悲報】亀田和毅「世界基準の判定では115-113で那須川天心の勝ち。ジャップの糞採点で井上勝利にされた」 [802034645]
- 神聖うんち帝国💩👑🏡
