七行プログラミング (452レス)
上下前次1-新
204: nobodyさん [] 03/12/07 03:57 ID:enSfwhvY(1/3) AAS
 >201201(2): nobodyさん [sage] 03/12/06 00:29 ID:??? AAS
 >>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〜) 、参加作という事で 
 外部リンク:cm.xrea.cc に載せていいですか? >オリジナル作者各位 
 と言っても実際に載せるのは年越してからになると思いますが(苦)。  
参加してたんだw。どぉも。一年ぶりです。 
 <- 7blosxomのプロトタイプ提供者(===7wiki)です。 
  
 > 外部リンク:cm.xrea.cc に載せていいですか?  
 他にも幾つかストックあるので、公開時には掲載よろしくお願いします。m(_ _)m 
205: 7uploader [] 03/12/07 09:25 ID:enSfwhvY(2/3) AAS
 もっと詰めてからにしようと思ったけど、とりあえず公開します。後はよろしく:) 
  
 #!/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) 
 [ ] 他のブラウザへの対応。
206: nobodyさん [sage] 03/12/07 09:39 ID:??? AAS
 >>202202(1): nobodyさん [sage] 03/12/06 17:16 ID:??? AAS
 スレ汚し失礼。簡易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} 
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) 
207(1): nobodyさん [] 03/12/07 20:49 ID:enSfwhvY(3/3) AAS
 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が返らなかった。 
 端末への対応、悪化してたりしたらゴメン(焦 
208: 7hoo [] 03/12/09 13:46 ID:+unlQkjh(1) AAS
 PerlHoo(外部リンク:www.webreference.comです。 
 ディレクトリ型のリンク集。後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 {} \;
210: nobodyさん [sage] 03/12/10 15:33 ID:??? AAS
 おつかれ〜 
211: 200 [sage] 03/12/11 21:24 ID:??? AAS
 連投でうざかったらすみません。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行です。 
  
 //項目が全部ひらがななのは自サイトで使う用なので。苦笑 
212: 200 [sage] 03/12/11 21:51 ID:??? AAS
 それと、2行目の$Fでログファイル名、$nで自ファイル名を変更可能。 
 3行目の先頭にある18を「最大ログ数にしたい数-2」に変更すれば 
 最大ログを設定できます。 
213(1): nobodyさん [sage] 03/12/12 02:52 ID:??? AAS
 ● 最低限押さえるべきポイント for Perl 
 ・識別子は全て一文字にする 
 ・演算子の優先順位を把握して冗長な括弧を全て省く 
 ・サブルーチンは頭の方で宣言して routine(); から括弧を省く 
 ・ブロックの最後の文はセミコロンを省略できる ("main" ブロック然り) 
  
 ● 基本縮めテクニック for Perl 
 ・使用する関数に関してマニュアルを精読する :) 
 ・bare word ([A-Za-z]\w*) を使ってクォートを省く 
 ・長い名前の関数を複数回使うなら別名を作る (*P=*param;) 
 ・特殊変数や暗黙の代入を積極的に使う 
 ・(スカラー|リスト|ブール)コンテキストでの各挙動を意識する 
  
 ● Tips for Perl 
 ・同名のファイルハンドルを open し直すなら close は要らない (>>186186(4): nobodyさん [sage] 03/12/03 23:13 ID:??? AAS
 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<Fhr}put end_html 
  
 >>182 
 '..' さえ防いだら大丈夫な気も… 
 既に開かれてるファイルハンドルを open し直すと、開いていたファイルは 
 close されてから新しいファイルを open するので、close は明示しなくても 
 可な筈。 
 外部リンク[html]:perldoc.com  
 参照) 
 ・最も短くかける無限ループは "{ ... ;redo}" 
  
 ● 「使える」Web プログラムを目指す人に 
 ・XSS 脆弱性に配慮する 
 ・文字コードに依存する定数は外部へ追い出す 
 ・「想定外の入力」でどのように誤作動するか確認する 
 ・多機能より堅牢を 
  
 Tips を充実させたいところ。 
214: nobodyさん [] 03/12/12 19:15 ID:O0tbE8Vp(1/2) AAS
 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を出力する関数を作る。 事例 >>122122(2): nobodyさん [] 03/03/10 02:24 ID:drTO4vMw(1) AAS
 使い方わからなかったけど…(かちゅーしゃのログ持っていないので。 
  
 '<a href="'.pop().'</a> 
 ↓ 
 "a href=\"$_[0]</a>" 
 7rss.cgi 
 - 自分自身のURL -> url, self_url 
 - 他。 
  
 大抵の機能はモジュールで提供してくれてるが、VERSIONの違いには注意。 
215(1): PATH_INFO 内での '..' [] 03/12/12 19:52 ID:O0tbE8Vp(2/2) AAS
 >>186 読んで思い出した。 
 PATH_INFO に .. が現れるのってどういった場合なんでしょう? 
 親ディレクトリより上を参照出来る危険があるのかなと思ったけど。 
 QUERY_STRINGからなら勿論チェックが必要ですが。 
 PATH_INFOの場合CGI自体が呼ばれない様な気がする。 
  
 以下のようなリクエストを試してみました 
  
 外部リンク:www.example.com 
 外部リンク:www.example.com 
 外部リンク[cgi]:www.example.com 
  
 bar.cgi/../ とすると、 
 サーバーは bar.cgi のあるディレクトリの indexを返してくる様なんだけど。 
 これって、サーバーの実装に依存するのかな?apache,IIS他幾つかのサイトで確認。 
 流石にDocumentRootより上を参照しようとするとBad Requestになるけど。 
今、丁度7行HTTPdを公開しようと調整していたので、自分でも調べるつもりですが 
 もし、詳しく知ってる方いたらフォローお願いします。m(_ _)m 
216(1): nobodyさん [sage] 03/12/13 16:17 ID:??? AAS
 ご自由に編集して下さい。(´ω` 
 外部リンク[cgi]:cm.xrea.cc 
  
 #--- 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 を参考に色々いぢってみました。 
217(1): nobodyさん [sage] 03/12/15 02:27 ID:??? AAS
 >>215 
 /foo%5C..%5C..%5Cbar なんてのをそのまま Win 鯖で食うとヤバいかと。 
218(2): 7memo [sage] 03/12/15 13:08 ID:??? AAS
 ちょぼちょぼいぢり。 
  
 #!/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 
219: nobodyさん [sage] 03/12/15 13:18 ID:??? AAS
 >>218 
 s/\$F/\$_/g; _| ̄|○ 
220(2): Unit7.pm [] 03/12/15 17:14 ID:zoqm3JaO(1/3) AAS
 #!/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 で実行できるかな?と互換性を期待したけど、無理だった。
221(1): nobodyさん [] 03/12/15 17:21 ID:zoqm3JaO(2/3) AAS
 >>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"); 
  } 
 } 
222(1): nobodyさん [] 03/12/15 18:50 ID:zoqm3JaO(3/3) AAS
 >>220.diff 
 - $o ... 成功したテストの数  
 + $O ... 成功したテストの数  
  
 >>221 の捕捉。 
 基底クラスを Test::Unit::TestCase に変更するとTestRunner.pl でも実行できます。 
 でも、Test::Unit::TestCase => Unit7の互換はなし。 
>>216 
 ありがとう。早速使わせてもらってます。 
 >>218 
 ()や{}の末尾では、引数の型宣言なしに弧省略出来たと思う。 
  
 nice tricky closure. 
 FP的なアプローチってコードの短縮に貢献出来るテクニック多いよね。 
>>217 
 Windows 環境の事すっかり忘れてた。 
 でも、エンコードしなきゃ大丈夫じゃない? %5C 
223: nobodyさん [sage] 03/12/16 04:29 ID:??? AAS
 >>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 は周りに無いので未調査。 
224(1): 7memo [sage] 03/12/16 14:56 ID:??? AAS
 これで一旦完成。 
  
 #!/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 
 外部リンク[css]:example.com 
 save 
 Default Page Title 
 20 
 70 
225: nobodyさん [sage] 03/12/20 01:06 ID:??? AAS
 >>224 
 お疲れ様です。 
 使いやすいしいい感じ。 
226: ?O?????|?X [] 03/12/28 16:50 ID:7YW8A3U6(1) AAS
 c 
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 
上下前次1-新書関写板覧索設栞歴
あと 224 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル アボンOFF
ぬこの手 ぬこTOP 0.024s