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

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
257: 7Hoo 04/02/24 22:23 ID:??? AAS
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 に。
・登録フォームを常に表示。
258
(2): Store7.pm 04/02/27 22:01 ID:xssKWf0b(1) AAS
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');
259
(1): 04/02/27 23:21 ID:aqbVKltF(1) AAS
無造作に縮めてみる。

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]}
260
(1): 258 04/02/28 13:00 ID:GPwfHIuc(1) AAS
>>259
\->\\したあと、'->\'しなければいけないので、s/(\\|')/\\$1/g;はマズイっぽいです。
261
(1): 04/02/29 22:04 ID:??? AAS
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] のままに。
262
(1): 04/02/29 23:12 ID:??? AAS
改行しなければいいんでねーの?
263: 04/03/01 02:53 ID:??? AAS
>>262
>>1
一応こういうルールでやってます。
横79文字ってのは80文字-改行1文字ね。
264
(1): 04/03/03 04:38 ID:??? AAS
新しいお題目なんだけど

七行ハーボット

ってどう?
最低限、カウンタ・人工無能・ミニゲームつきって事で。
265: 04/03/03 14:35 ID:??? AAS
>>264
?でしょ
266
(6): nobody 04/03/04 17:41 ID:yJd59Upc(1) AAS
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);
267
(1): 04/03/04 21:42 ID:??? AAS
>>266
初級者お断りとは言わないし、むしろどんどんコードを書き込んでほしい
けれど、外部リンク[cgi]:cm.xrea.cc は一通り読んでほしいな。

ハッシュキーのクォート、ブロック末のセミコロン、関数の括弧、暗黙の
代入が行われる変数 etc etc... 文法的に省略可能な部分が沢山残って
いるのはちょっとねぇ。

print"Content-Type: text/plain\n\n";if(($_,$k)=split/&/,$ENV{QUERY_STRING}){/^
\d{8}$/x&&open F,"$_.txt";($k?/\Q$k/:1)&&($t++,print)while<F>;print"\n全$.件/".
"ヒット$t件"}else{s/^\d$/0$&/for($s,$n,$h,$d,$m,$y)=localtime;$y+=1900;$m++;$m
=~s/^\d$/0$&/;open F,">>$y$m$d.txt";print F join('<>',"$h$n$s",@ENV{REMOTE_ADDR
,HTTP_USER_AGENT,HTTP_REFERER}),"\n"}

Perl の習熟度に自信がないなら、自力で何とか10行、ぐらいのサイズ
から載せてくれたら、スレの住人がよってたかって縮めるんじゃないかな。
268
(1): 266 04/03/05 18:15 ID:EBEJkXEP(1) AAS
しっかりと読みました。
>>267さんが短くしてくれたおかげで、妥協した機能がつけれました。

日付の範囲指定を可能にして、データをtab区切りで記録して
ファイルを表示するのではなくCSV(TSV)としてDLするようにしてみました。

#! /usr/bin/perl
print"Content-Disposition: attachment;filename=log.csv;\nContent-Type: text/t".
"ab-separated-values\n\n";if(($f,$t,$k)=split/&/,$ENV{QUERY_STRING}){for($f...$
t){/^\d{8}$/x&&open F,"$_.txt";($k?/\Q$k/:1)&&(print)while<F>}}else{s/^\d$/0$&/
for($s,$n,$h,$d,$m,$y)=localtime;$y+=1900;$m++;$m=~s/^\d$/0$&/;open F,">>$y$m".
"$d.txt";print F join("\t",$h,$n,$s,@ENV{REMOTE_ADDR,HTTP_USER_AGENT,
HTTP_REFERER}),"\n"}

>>267さんのにただ付け足した感じです。
それでも、たった一日でものすごい勉強になりました。
269: 04/03/06 00:53 ID:??? AAS
>>261
オベンキョになります。
270: 04/03/12 09:33 ID:??? AAS
息抜きにテキストカウンタ。お題がお題なので、今日/昨日/総計のカウントと、
ランダムワード表示機能付けてまだ一行余ってるけど。

--- 7rwcntr.cgi ---
#!/usr/bin/perl
sub P{seek local*F=pop,0,0;print F@_}sub o{open(local*F,"+<@_")||die;eval{flock
F,2};*F}sub j{(localtime((stat pop)[9]))[3]}$l=@l=<$_chomp($r.=$l[rand$l])for
map{o$_}sort<?.dat>;$A=o"all.dat";$a=<$A>+1;j($T=o"tday.dat")==j($Y=o"yday.dat"
)?do{P$t=<$T>+1,$T;$y=<$Y>}:do{P$y=<$T$Y;P$t=1,$T};P$a,$A;$s=@ARGV?javascript
:plain;printf"Content-Type: text/$s\n\n".join('',<DATA>),$r,$a,$t,$y
__END__

空ファイル all.dat, tday.dat, yday.dat を予め用意。
?.dat というファイルがあると、そのファイルから一行ランダムに選んで表示。
?.dat が複数あった場合は、各ファイルからランダムに取り出して繋げて表示。

例えば 0.dat に人名、1.dat に場所、2.dat に行動のリストをそれぞれ用意
しておけば、「誰々が何処で何々」のようなランダム文を表示します。
271
(1): 04/03/12 09:36 ID:??? AAS
● SSI での使用

__END__ トークン以下に
%s<br />all:%06d today:%03d yesterday:%03d

HTML ファイルの body 要素内に
<!--#include virtual="/cgi-bin/7rwcntr.cgi"-->

● JavaScript 経由で CGI プログラムとして使用

__END__ トークン以下に
function writeCount() {
  document.write("%s<br />all:%06d today:%03d yesterday:%03d");
}

HTML ファイルの header 要素内に
<script src="/cgi-bin/7rwcntr.cgi?1" type="text/javascript"></script>

body 要素内に
<script type="text/javascript"><!--
  writeCount();
//-->
</script>
272: 7rwcntr 04/03/12 11:11 ID:??? AAS
日付切替部分修正。

sub P{seek local*F=pop,0,0;print F@_}sub o{open(local*F,"+<@_")||die;eval{flock
F,2};*F}$l=@l=<$_chomp($r.=$l[rand$l])for map{o$_}sort<?.dat>;$T=o"tday.dat";
$Y=o"yday.dat";$A=o"all.dat";$a=<$A>+1;(localtime)[3]-(localtime((stat$Y)[9]))[
3]?do{P$y=<$T$Y;P$t=1,$T}:do{P$t=<$T>+1,$T;$y=<$Y>};P$a,$A;$s=@ARGV?
javascript:plain;printf"Content-Type: text/$s\n\n".join('',<DATA>),$r,$a,$t,$y
273: 7rwcntr 04/03/14 02:10 ID:??? AAS
sub o{open(F,"+<@_")?eval{flock F,2}:die;<F>}($a,$t,$y,$l)=split/\t/,o"cnt.dat"
;dbmopen%r,remote,420or die;if(time-$r{$r="@ENV{REMOTE_ADDR,HTTP_USER_AGENT}"}>
3600&&$r ne$l){$y=$t,$t=0if(localtime)[3]-(localtime((stat F)[9]))[3];seek F,0,
0;print F join"\t",++$a,++$t,$y,$r;eval{truncate F,tell F}}$r{$r}=time;chomp($w
.=$l[rand(@l=o$_)])for sort<?.dat>;$/=@ARGV?javascript:plain;printf
"Content-Type: text/$/\n\n".<DATA$w,$a,$t,$y

・カウンタファイル三つを cnt.dat 一つに統合。
・重複カウント防止。(一時間以内と直前)
274
(3): 7wiki 04/03/14 15:28 ID:??? AAS
use CGI":all";charset$c="EUC-JP";$w='\b(([A-Z][a-z]+){2,})';$f=script_name;$/=(
);($p)=path_info=~/$w/;$p||=FrontPage;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:"?"|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

・「〜/7wiki.cgi/」に対応。
275
(1): 7uploader 04/03/14 15:30 ID:??? AAS
use CGI":all";$CGI::POST_MAX=1024000;$/=\4096;chdir D;sub v{open(F,pop)?binmode
F:die}if($f=upload f){$f=~/\.\w+$/;v">".time.$&;print F$_ while<$f>;close F}++$
i<51?push@f,$_:unlink for sort{$b<=>$a}<*>;($_=param d)?(v($_),put header(-type
=>'application/octet-stream',Content_length,-s,attachment,$_),<F>):put(header,
start_html,start_multipart_form,filefield(f),submit,endform,table({border,1},Tr
[th([Name,Date,Size]),map{td[a({href,"?d=$_"},$_),''.localtime((stat)[9]),-s]}
@f]),end_html)

・縮め。
276
(2): 7Hoo 04/03/14 15:31 ID:??? AAS
use CGI":all";charset$c="EUC-JP";($p=path_info||Home)=~s!^/+|/+$!!g;chdir"./$p"
||die;$F='.7hoo';s/\s/ /g for@p=map{param$_}U,T,D;open(F,">>$F"),eval{flock F,2
},$"="\t",print F"@p\n"if@p;sub A{a{href,url.pop},$_}sub e{escapeHTML@N[@_]}put
header,start_html(-title=>"7Hoo",encoding,$c,lang,ja),p(join" / ",map{A$i.="/".
$_}split"/",$p),ul(li[map{A"/$p/$_"}grep-d,<*>]),open(F)&&hr.dl(map{@N=split/\t
/x;dt(a{href,$N[0]},b e 1),dd e 2}<F>),hr,startform(0,url."/$p"),p(join br,(map
{textfield/(.)/,$_,40}Url,Title),textarea(D,"",3,40,1),submit),endform,end_html

・XSS 脆弱性の fix
277
(1): SevenLines の中の人 04/03/14 15:52 ID:??? AAS
>>274-276 の三つ、問題無いようでしたらサイトに載せます。
7uploader と 7Hoo は仕様や出力を随分いぢってしまったので、
軌道修正もお願いします。(w >原作者殿

作業用のアップローダ用意しましたので、ファイルの受け渡しに
ご利用下さい。 外部リンク[cgi]:cm.xrea.cc

TODO: 7rwcntr > telnetd > Unit7 > Store7 > 7vote
telnetd と accesslog.cgi は 202 さんと 266 さんに掲載許可を
頂け次第サイトに載せようと思ってますので、適用ライセンス等
ご連絡下されば幸いです。
278: 266 04/03/15 14:12 ID:jJ3gsLA0(1) AAS
#! /usr/bin/perl
sub r{$r=$_[0]?"tab-separated-values\nContent-Disposition: attachment;filenam".
"e=log.csv":"plain";print"Content-Type: text/$r\n\n"}if(($a,$f,$t,$k)=split/&/,
$ENV{QUERY_STRING}){r $a;for($f...$t){/^\d{8}$/x&&open F,"$_.txt";($k?/\Q$k/:1)
&&(print)while<F>}}else{r;s/^\d$/0$&/for($s,$n,$h,$d,$m,$y)=localtime;$y+=1900;
$m++;$m=~s/^\d$/0$&/;open F,">>$y$m$d.txt";print F join("\t",$h,$n,$s,@ENV{
REQUEST_URI,REMOTE_ADDR,HTTP_USER_AGENT,HTTP_REFERER}),"\n"}

>>266です。
>>268はアクセスログ記録モードで呼び出したときもCSVのダウンロードダイアログが出る
という致命的なバグがありました。すみません。

バグ修正と、さらにパラメータで画面に表示/ダウンロードを選択できるようにしました。
また、REQUEST_URIも記録するようにしたので、サイト全体の解析にも使えるようになったと思います。
スクリプト名は他にあわせて、7accesslog.cgi と変更しようと思います。

こんなので掲載していただけるのであれば是非お願いします。
このスレのおかげで完成したと思っているので、私としては権利等の主張をする
つもりはありませんのでGPLあたりの他のスクリプト同様のライセンスにしてください。

■使用法
・記録時はSSI等で呼び出します。>>271さんみたいにJavaScriptでも呼び出せそうな気はします。
・表示およびダウンロード時はパラメータをつけて普通に呼び出します。
パラメータなし  アクセスログを記録。
   日付.txt に 時,分,秒,REQUEST_URI,REMOTE_ADDR,HTTP_USER_AGENT,HTTP_REFERER を記録します。
パラメータあり  アクセスログを表示/ダウンロード
   第1パラメータ ・・・ 0:表示 1:ダウンロード
   第2パラメータ ・・・ ログの取得開始日(yyyymmdd)
   第3パラメータ ・・・ ログの取得終了日(yyyymmdd)
   第4パラメータ ・・・ ログ取得時の絞込みキーワード(省略すると全件取得)
   (例) 外部リンク[cgi]:hoge.com
   この例では、2004年3月1日〜2004年3月31日までの「MSIE」を含むログがダウンロードされます。
279: 7accesslog 04/03/16 15:40 ID:??? AAS
($a,$f,$t,$k)=@ARGV;print"Content-Type: text/",!$a?plain:"tab-separated-values
Content-Disposition: attachment;filename=log.csv","\n\n";$k=~s/%([\da-f]{2})/
pack"H2",$1/egi;$f?do{/^\d{8}$/&&(open(F,"$_.txt"),print grep$k?/\Q$k/o:1,<F>)
for$f..$t||$f}:do{s/^\d$/0$&/for($s,$n,$h,$d,$m,$y)=localtime;$y+=1900;$m++;$m
=~s/^\d$/0$&/;open F,">>$y$m$d.txt";print F join("\t",$h,$n,$s,
@ENV{REQUEST_URI,REMOTE_ADDR,HTTP_USER_AGENT,HTTP_REFERER}),"\n"}

・検索ワードを URI-unescape
・第 3 引数を省略可能に
・パラメータをクエリ渡しから引数渡しへ
  (例)
  外部リンク[cgi]:hoge.com
  外部リンク[cgi]:hoge.com
1-
あと 173 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.011s