七行プログラミング (452レス)
上下前次1-新
262(1): nobodyさん [sage] 04/02/29 23:12 ID:??? AAS
 改行しなければいいんでねーの? 
263: nobodyさん [sage] 04/03/01 02:53 ID:??? AAS
 >>262 
   >>1一応こういうルールでやってます。 
 横79文字ってのは80文字-改行1文字ね。 
264(1): nobodyさん [sage] 04/03/03 04:38 ID:??? AAS
 新しいお題目なんだけど 
  
 七行ハーボット 
  
 ってどう? 
 最低限、カウンタ・人工無能・ミニゲームつきって事で。 
265: nobodyさん [sage] 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): nobodyさん [sage] 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: nobodyさん [sage] 04/03/06 00:53 ID:??? AAS
 >>261261(1): nobodyさん [sage] 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] のままに。  
オベンキョになります。 
270: nobodyさん [sage] 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): nobodyさん [sage] 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 [sage] 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 [sage] 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 [sage] 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 [sage] 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 [sage] 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 の中の人 [sage] 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 [sage] 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 
280(1): 266 [sage] 04/03/16 18:36 ID:??? AAS
 >77(3): nobodyさん [0] 02/11/01 18:52 ID:??? AAS
 #!/usr/local/bin/perl 
  
 if (>>1 = "バカ") { 
     print "イッテヨシ"; 
 } else { 
     print "マターリしましょう"; 
 }  
accesslog 
 for で $f..$t ってやると、月や年をまたいだ時、 
 無駄なファイルオープン(できないやつ)が多発するので 
 そこをなんとかしたいです・・・。 
  
 ヘタレな私にはいい方法が思いつきませんが。 
281: nobodyさん [sage] 04/03/16 22:51 ID:??? AAS
 >>280 
 ・効率的な生成アルゴリズムを Web や本から探す。 
 ・思いつくまま色々書いて試す。 
 ・文字数を食っている機能を捨てる。 
 ・緩めのルール (shebang 無し 7 行 & モジュール可) で挑戦する。 
  
 とにかく足掻いて形にするのが大事。 
282: nobodyさん [sage] 04/03/16 23:11 ID:??? AAS
 >>277 
 202です。 ライセンスとかようわからないですが、telnetdとStore7はほかのと同じようにして置いていただければ結構です。 
283(1): 266 [sage] 04/03/17 10:18 ID:??? AAS
 ($a,$f,$t,$k)=@ARGV;$k=~s/%([\da-f]{2})/pack"H2",$1/egi;$l=$f.($t?"-$t":"").($k 
 ?"-$k":"");print"Content-Type: text/",$a?"tab-separated-values\nContent-Dispo". 
 "sition: attachment;filename=log$l.csv":plain,"\n\n";$f?do{/^\d{4}(\d\d)(\d\d)$ 
 /x&&$1*$2&&$1<13&&$2<32&&(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 
 $&/x;open F,">>$y$m$d.txt";print F join("\t",$y,$m,$d,$h,$n,$s,@ENV{REQUEST_URI 
 ,REMOTE_ADDR,HTTP_USER_AGENT,HTTP_REFERER}),"\n"} 
  
 ■記録時 
 ・ログファイルに日付も記録するよう変更。 
 (日付範囲を指定してログ表示した際に日付が無いとわけわからないため) 
  
 ■閲覧時 
 ・ダウンロード時のファイル名に抽出条件を盛り込むよう変更。 
 ・1〜12月の1〜31日の間だけファイルオープンを試みるよう変更。 
  
 いろいろ増やしたらshebang無し七行になっちゃいました。
284(1): nobodyさん [sage] 04/03/17 11:13 ID:??? AAS
 トイレに行かせただけで動作未確認。 
  
 ($k=$ARGV[3])=~s/%([\da-f]{2})/pack"H2",$1/egi;/\D/&&die for($a,$f,$t)=@ARGV; 
 print"Content-Type: text/",$a?"tab-separated-values\nContent-Disposition: atta" 
 ."achment;filename=log$f".($t&&"-$t").($k&&"-$k").'.csv':plain,"\n\n";$f?do{/^. 
 ...(..)(..)$/x&&$1*$2&&$1<13&&$2<32&&(open(F,"$_.txt"),print grep$k?/\Q$k/o:1, 
 <F>)for$f..$t||$f}:do{($d,$m,$y)=(localtime)[3,4,5];open F,sprintf">>%d%02d%02" 
 ."d.txt",$y+1900,$m+1,$d;print F join("\t",''.localtime,@ENV{REQUEST_URI, 
 REMOTE_ADDR,HTTP_USER_AGENT,HTTP_REFERER}),"\n"} 
  
 ログの日付を scalar localtime に変更。 
285(2): nobodyさん [sage] 04/03/17 14:13 ID:??? AAS
 ($a,$f,$t,$k)=@ARGV;$k=~s/%([\da-f]{2})/pack"H2",$1/egi;print"Content-Type: ". 
 "text/",$a?"tab-separated-values\nContent-Disposition: attachment;filename=l". 
 "og$f".($t&&"-$t").($k&&"-$k").'.csv':plain,"\n\n";$f?do{/^....(..)(..)$/&&$1* 
 $2&&$1<13&&$2<32&&(open(F,"$_.txt"),print grep$k?/\Q$k/o:1,<F>)for$f..$t||$f}: 
 do{($d,$m,$y)=(localtime)[3,4,5];open F,sprintf">>%d%02d%02d.txt",$y+1900,$m+1 
 ,$d;print F join("\t",''.localtime,@ENV{REQUEST_URI,REMOTE_ADDR, 
 HTTP_USER_AGENT,HTTP_REFERER}),"\n"} 
  
 >>284 
 1行目ってなんで変えたの?>>283の1行目で動くようなので戻すことで若干縮め。 
 あとattachmentのつづり直した。もう少しでshebang含7行。 
286: nobodyさん [sage] 04/03/17 15:03 ID:??? AAS
 >>285 
 コードそのまま。$a, $f, $t に数字以外の文字が 
 含まれない事を保障する為。 
 まぁここはチェック飛ばしても穴にはならんかな。 
上下前次1-新書関写板覧索設栞歴
あと 166 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.020s