七行プログラミング (452レス)
1-

227: ?O?????|?X 03/12/28 21:24 ID:7YW/F4a6(1) AAS
b
228: ?O?????|?X 03/12/30 16:01 ID:2yZZI8A2(1) AAS
ccv
229: [ ] 04/01/02 08:14 ID:??? AAS
(・Д・)
230: 04/01/18 12:18 ID:??? AAS
テクニックメモを基に既存プログラムのメンテ中。
・CGI.pm は最新版縛りで。
・日本語が通るように。
・改めて調べたら Win32 でもグロブ使えたのでそのように。
・XSS 脆弱性や open に渡す値の再確認。

7rss を RSS 0.91 仕様にしてみるテスト。

#!perl -w
use CGI qw/:all channel link language description item textinput name/;charset
$C='EUC-JP';$w='7wiki';url=~m|[^/]+$|;$p=$`;sub e{title($d=pop),description($d)
,link pop}put header('text/xml'),join"\n",'<?xml version="1.0" encoding="'.$C.
'"?>','<!DOCTYPE rss SYSTEM "外部リンク:my.netscape.com
'dtd">','<rss version="0.91">',channel(e("$p$w.cgi",$w),language(ja),(map{item
e"$p$w.cgi/$_",$_}sort{-M$a<=>-M$b}grep/^([A-Z][a-z]+){2,}$/&-f,<*>)[0..9],
textinput(title($w),link($p.'7search.cgi'),name S)),'</rss>'
231: 7ch.cgi 04/01/18 14:25 ID:??? AAS
#!/usr/bin/perl
use CGI":all";charset$C=Shift_JIS;open F,'+<F';[<F>];seek F,0,2;*i=*param;s!>
;(\d+)!a{href,"#R$1"},$&!egx,s!https?外部リンク:.+!a{href,$&},$&!eg,s/\n/br/eg,($n=i(N)
||'nobodyさん')=~s/#.+/crypt$1,'◆'/e,eval{flock F,2},print F dt(++$.,':'.b(a{
name,"R$.",i(M)&&(href,'mailto:'.i M)},$n),':'.localtime),dd($_.p),"\n"if$_=
escapeHTML i T;seek F,0,0;*x=*textfield;put$/=header,start_html(-style=>{code=>
<DATA>},Title=>'7ch',encoding,$C,lang,ja),dl(<F>),hr,startform,p(submit('書き'.
'込む'),' 名前:',x(N),' E-mail:',x(M),br,textarea T,'',6,70),endform,end_html

__DATA__
b { color:#080 }
body { background:#fff }
232: 04/01/18 20:09 ID:Hq0k6H3L(1) AAS
CCC
233: 7blosxom 04/01/19 14:33 ID:??? AAS
外部リンク:cm.xrea.cc
仕様は >>182 辺りに。

テストファイル生成スクリプトも更新。

@c=('a'..'z','A'..'F');$t=time;$i=24;sub u{$t-=9**5;utime$t,$t,pop}sub j{join""
,@c[$_[0]..$_[0]+2]}while($i){open(T,'>'.($f=j(--$i).'.txt'))||die$!;print T j(
$i),"\n",j($i+3),"\n",j($i+6);close T;$t-=8**7if$i==13;u($f)||die$!}@f=sort
<*.txt>;$t=(stat$f[0])[9]-9**7;for(@f){open(S,$_)||die$!;s/(\w+)/uc($1).++$i/e;
open(D,">$_")||die$!;print D map uc,<S>;close D;u($_)||die$!}
234
(3): 04/01/20 15:14 ID:F518czSp(1) AAS
激しく板違いなんですけど
for(@LOG){
my($no,$dammy)=split(/<>/,$_);
for(@LOG){
my($no2,$dammy)=split(/<>/,$_);
if($no eq "$no2"){
print "LOG";
for(@LOG){
my($no3,$dammy)=split(/<>/,$_);
if($no2 eq "$no3"){
print "LOG";
}
}
}
}
}
を一回のforルーチンで済ますことってできますか?
235: 234 [age] 04/01/20 15:22 ID:??? AAS
for(@LOG){
my($dammy,$no)=split(/<>/,$_);
for(@LOG){
my($dammy,$no2,$no3)=split(/<>/,$_);
if($no eq "$no3"){
print "LOG";
for(@LOG){
my($dammy,$no4,$no5)=split(/<>/,$_);
if($no2 eq "$no5"){
print "LOG";
}
}
}
}
}
間違えました。訂正しまつでつ。
236: 234 [age] 04/01/20 15:25 ID:??? AAS
ついでに2回のforルーチンでもいいです。
237: 04/01/20 16:52 ID:??? AAS
>>234
コードを短くしたいという意図はわかるけど、
実用的なプログラムでは、ここに挙がっている様なテクニックは、
なるべく使わない方が良いよ。
238
(1): 04/02/01 15:24 ID:??? AAS
#!/usr/bin/perl
require 'bbs.pl';
bbsmain();

3行で掲示板作ったぞ
239: 04/02/01 22:12 ID:??? AAS
>>238
モジュール/ライブラリに関して >>46 >>135 >>136 >>174 >>175
240
(1): 04/02/12 06:42 ID:??? AAS
転載
#!/usr/bin/perl -w
# 526-byte qrpff, Keith Winstein and Marc Horowitz <sipb-iap-dvd@mit.edu>
# MPEG 2 PS VOB file on stdin -> descrambled output on stdout
# arguments: title key bytes in least to most-significant order
$_='while(read+STDIN,$_,2048){$a=29;$c=142;if((@a=unx"C*",$_)[20]&48){$h=5;
$_=unxb24,join"",@b=map{xB8,unxb8,chr($_^$a[--$h+84])}@ARGV;s/...$/1$&/;$d=
unxV,xb25,$_;$b=73;$e=256|(ord$b[4])<<9|ord$b[3];$d=$d>>8^($f=($t=255)&($d
>>12^$d>>4^$d^$d/8))<<17,$e=$e>>8^($t&($g=($q=$e>>14&7^$e)^$q*8^$q<<6))<<9
,$_=(map{$_%16or$t^=$c^=($m=(11,10,116,100,11,122,20,100)[$_/16%8])&110;$t
^=(72,@z=(64,72,$a^=12*($_%16-2?0:$m&17)),$b^=$_%64?12:0,@z)[$_%8]}(16..271))
[$_]^(($h>>=8)+=$f+(~$g&$t))for@a[128..$#a]}print+x"C*",@a}';s/x/pack+/g;eval
241: 04/02/12 06:51 ID:??? AAS
>>240
それがそもそもの始まりだったりする。
2chスレ:tech
242: 04/02/16 23:08 ID:j3AvJVjF(1) AAS
保守age。ついでに、あまり役に立ちそうにないTip
配列と配列サイズを同時に宣言
my $length_of_array = my @array = (1, 2, 3, 4, 5);
243
(2): 7wiki 04/02/18 20:32 ID:b6u9ly2x(1) AAS
* Added 空投稿でPage削除
* Diet evalの{}外してみた。-1 byte

#!/usr/bin/perl -w
use CGI":all";charset$c='EUC-JP';$w='\b(([A-Z][a-z]+){2,})';$f=script_name;$/=(
);($p)=(path_info||FrontPage)=~/$w/;($m=param z)||unlink$p;if(open F,$m?">$p":$
p){eval flock F,2;print F$m||=<F>}$_=pre(escapeHTML$m).hr.ul map{li"".localtime
((stat)[9]),$_}sort{-M$a<=>-M$b}grep/^$w$/&-f,<*>;s|$w|(!-f$1&&$1).a{href,"$f/$
1"},-f$1?$1:"?"|eg;put header,start_html(-title=>$p,encoding,$c,lang,ja),h1($p)
,startform(0,"$f/$p"),p(textarea(z,$m,6,60),br,submit),endform,hr,$_,end_html
244
(1): 04/02/19 09:30 ID:??? AAS
>>243
eval の {} は外せないですよ。
eval flock F,2; だと flock() の戻り値から成る文字列を eval する事に。
unlink の問題はあっちでも指摘されてますが。:o)
245: 7uploader 04/02/19 11:44 ID:??? AAS
順番的には先に telnetd を何とかしたいけど、検証が大変なので後回し。

#!/usr/bin/perl
use CGI":all";sub v{open(F,pop)||die;binmode F}$CGI::POST_MAX=1024000;$/=\4096;
chdir D;%f=map{$_,[a({href,"?d=$_"},$_),-s,''.localtime((stat)[9])]}@f=sort{-M$
a<=>-M$b}<*>;$f{$f=upload f}or$f&&do{v">$f";print F$_ while<$f>;close F};$f{$F=
param d}?(v($F),put header(-type=>'application/octet-stream',Content_length,-s
$F,attachment,$F),<F>):put(header,start_html,start_multipart_form,filefield(f),
submit,endform,hr,table({border,1},Tr[th([qw/name size date/]),map{td$f{$_}}@f]
),end_html)

・windows 対応。
・既存ファイルへの上書きを防止。但し upload 後自力 reload が必要に。

ファイル名は連番や時刻等にする方が安心且つ楽かな。
246
(2): 04/02/19 20:30 ID:mWwpYaYp(1) AAS
>>244
あ、なるほど。それではevalの意味がなくなってしまう。
一応、事前に実験したんですが、検証方法が間違ってました。m(_ _)
フォローありがとうございます。

> unlink の問題はあっちでも指摘されてますが。:o)
あぁ、やってしまったぁ。試してくれた方ありがとう&&すみません。
ひとまず >>243は無効って事で、代案考えます。

ところで、ライセンスや掲載許可みたいな事を尋ねられたのだけど、
wiki, や blosxom, はオリジナルと同じ GPL って事でいいかな?
実際、7wikiはYukiWiki, 7blosxomは初期のblosxomを参考にしたので。
247: SevenLines の中の人 04/02/19 21:28 ID:??? AAS
>>246
ライセンスやら何やらは原作者に尋ねるのがスジですが、初出が
2ch だけに連絡取り辛いですな。各スレで直接呼びかけるしか無いかも。

SevenLines で保守している作品については、各原作者と配布形態等を
逐一取り決めてはいないので、建前上あのような断り書きの縛りにして
います。拙作のは全部修正 BSD ライセンスで、アーカイヴにライセンス
文書も同梱してます。

ニーズがあるなら専用ドメイン取って、転送メールアドレスの提供ぐらいは
しますよん。:) >各原作者殿
248
(1): 04/02/20 22:48 ID:g/Yl/nab(1) AAS
# 重要な事を書き忘れました。
246==7wiki, 7files, 7search, 7rss, 7blosxom, 7Unit, 7uploader, 7hoo 原作です。
(当然だけど、オリジナルではなくこのスレの7行版の方の、です)

掲載許可に関しては、手間のかからない方法で「連絡不要」って事でいいかな?
連絡先作って貰っても、どれほど需要があるかは自分にもわからないので。

ライセンスについては、
#!/usr/bin/perl -w -- "License: 外部リンク[txt]:www.gnu.org"
で、どぉでしょう?GPL以外でもいいけど
249: 246 04/02/22 02:18 ID:Sgt6pnb3(1) AAS
>ライセンスの件 ...
自分が叩き台を出したとは言え、成果物はこのスレで参加者皆のものなので
出来れば他の方の意見も伺っておきたいのですが。特に異論がなければ、
>>248通り連絡不要/GPLという事にしたいと思います。
# もしくは、保守して下さってるサイトの管理者さんにお任せ。m(_ _

# 7vote
use CGI':all';$p=POST;*P=*param;charset$c='EUC-JP';chdir V;($F)=P(f)=~/^(\d+)$/
;if(open F,"+<$F"){eval{flock F,2};$t=<F>;while(<F>){if(/^(.+)\t(\d+)$/){$D{$1}
=$2}}if(request_method==$p){($n=P(n))?$D{$n}||=1:($v=P(v))?$D{$v}++:0;seek F,0,
0;print F join("\n",$t,map{"$_\t$D{$_}"}keys%D)}}for(radio_group(v,[@K=sort{$D{
$b}<=>$D{$a}}keys%D])){$L{$K[$i++]}=$_}put header,start_html(title=>$t,encoding
,$c,lang,ja),h1($t),startform($p),table({},Tr[map{td["$L{$_}($D{$_})",hr{width
=>$D{$_}}]}@K]),hr,textfield(n),hidden(f,$F,force=>1),submit,endform,end_html

設定方法
1) ディレクトリV を作る。 mkdir V;chdir V
2) 題名を書いたファイルを作る。echo "What is your native language" > 00001 # ファイル名は番号で。
3) chmod 0666 00001 # 必要に応じてパーミッションの設定
./7vote.cgi?f=00001 # ブラウザからアクセス
250
(1): SevenLines の中の人 04/02/22 20:17 ID:??? AAS
とりあえず 7wiki, 7files, 7search, 7rss, 7blosxom を GPL で
パッケージングしときました。README やライセンス文書の
和訳同梱までは手が回らなかったので、その辺はご希望が
あれば追々。

あー、ココに載せるにゃデカ目のファイルのやり取り用に
7uploader 改良して設置しますかのぅ(笑)。

7Unit, 7uploader, 7hoo もその内転載させてもらいますね。
251
(1): 04/02/22 23:23 ID:??? AAS
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 に。
・最大保存数を設定可能に。
252: 04/02/23 22:42 ID:??? AAS
7wikiがすこし結城さんとかにとりあげられて話題になってるんですね。
253: 04/02/24 00:00 ID:??? AAS
>>251
7wiki 修正。
s/param(d)eq"D"/param(d)=~D/;
s/Delete/Del/;
254
(1): 04/02/24 10:13 ID:??? AAS
>>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行はちょっと難しそぉ。
255: 04/02/24 12:35 ID:??? AAS
>>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
256: 04/02/24 13:06 ID:??? AAS
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
1-
あと 196 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.037s