七行プログラミング (452レス)
七行プログラミング http://medaka.5ch.net/test/read.cgi/php/1036141603/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
208: 7hoo [] 03/12/09 13:46 ID:+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 {} \; http://medaka.5ch.net/test/read.cgi/php/1036141603/208
210: nobodyさん [sage] 03/12/10 15:33 ID:??? おつかれ〜 http://medaka.5ch.net/test/read.cgi/php/1036141603/210
211: 200 [sage] 03/12/11 21:24 ID:??? 連投でうざかったらすみません。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行です。 //項目が全部ひらがななのは自サイトで使う用なので。苦笑 http://medaka.5ch.net/test/read.cgi/php/1036141603/211
212: 200 [sage] 03/12/11 21:51 ID:??? それと、2行目の$Fでログファイル名、$nで自ファイル名を変更可能。 3行目の先頭にある18を「最大ログ数にしたい数-2」に変更すれば 最大ログを設定できます。 http://medaka.5ch.net/test/read.cgi/php/1036141603/212
213: nobodyさん [sage] 03/12/12 02:52 ID:??? ● 最低限押さえるべきポイント for Perl ・識別子は全て一文字にする ・演算子の優先順位を把握して冗長な括弧を全て省く ・サブルーチンは頭の方で宣言して routine(); から括弧を省く ・ブロックの最後の文はセミコロンを省略できる ("main" ブロック然り) ● 基本縮めテクニック for Perl ・使用する関数に関してマニュアルを精読する :) ・bare word ([A-Za-z]\w*) を使ってクォートを省く ・長い名前の関数を複数回使うなら別名を作る (*P=*param;) ・特殊変数や暗黙の代入を積極的に使う ・(スカラー|リスト|ブール)コンテキストでの各挙動を意識する ● Tips for Perl ・同名のファイルハンドルを open し直すなら close は要らない (>>186 参照) ・最も短くかける無限ループは "{ ... ;redo}" ● 「使える」Web プログラムを目指す人に ・XSS 脆弱性に配慮する ・文字コードに依存する定数は外部へ追い出す ・「想定外の入力」でどのように誤作動するか確認する ・多機能より堅牢を Tips を充実させたいところ。 http://medaka.5ch.net/test/read.cgi/php/1036141603/213
214: nobodyさん [] 03/12/12 19:15 ID: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の違いには注意。 http://medaka.5ch.net/test/read.cgi/php/1036141603/214
215: PATH_INFO 内での '..' [] 03/12/12 19:52 ID: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 http://medaka.5ch.net/test/read.cgi/php/1036141603/215
216: nobodyさん [sage] 03/12/13 16:17 ID:??? ご自由に編集して下さい。(´ω` 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://medaka.5ch.net/test/read.cgi/php/1036141603/216
217: nobodyさん [sage] 03/12/15 02:27 ID:??? >>215 /foo%5C..%5C..%5Cbar なんてのをそのまま Win 鯖で食うとヤバいかと。 http://medaka.5ch.net/test/read.cgi/php/1036141603/217
218: 7memo [sage] 03/12/15 13:08 ID:??? ちょぼちょぼいぢり。 #!/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 http://medaka.5ch.net/test/read.cgi/php/1036141603/218
219: nobodyさん [sage] 03/12/15 13:18 ID:??? >>218 s/\$F/\$_/g; _| ̄|○ http://medaka.5ch.net/test/read.cgi/php/1036141603/219
220: Unit7.pm [] 03/12/15 17:14 ID: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 で実行できるかな?と互換性を期待したけど、無理だった。 http://medaka.5ch.net/test/read.cgi/php/1036141603/220
221: nobodyさん [] 03/12/15 17:21 ID: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"); } } http://medaka.5ch.net/test/read.cgi/php/1036141603/221
222: nobodyさん [] 03/12/15 18:50 ID:zoqm3JaO >>220.diff - $o ... 成功したテストの数 + $O ... 成功したテストの数 >>221 の捕捉。 基底クラスを Test::Unit::TestCase に変更するとTestRunner.pl でも実行できます。 でも、Test::Unit::TestCase => Unit7の互換はなし。 >>216 ありがとう。早速使わせてもらってます。 >>218 ()や{}の末尾では、引数の型宣言なしに弧省略出来たと思う。 nice tricky closure. FP的なアプローチってコードの短縮に貢献出来るテクニック多いよね。 >>217 Windows 環境の事すっかり忘れてた。 でも、エンコードしなきゃ大丈夫じゃない? %5C http://medaka.5ch.net/test/read.cgi/php/1036141603/222
223: nobodyさん [sage] 03/12/16 04:29 ID:??? >>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 は周りに無いので未調査。 http://medaka.5ch.net/test/read.cgi/php/1036141603/223
224: 7memo [sage] 03/12/16 14:56 ID:??? これで一旦完成。 #!/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 http://medaka.5ch.net/test/read.cgi/php/1036141603/224
225: nobodyさん [sage] 03/12/20 01:06 ID:??? >>224 お疲れ様です。 使いやすいしいい感じ。 http://medaka.5ch.net/test/read.cgi/php/1036141603/225
226: ?O?????|?X [] 03/12/28 16:50 ID:7YW8A3U6 c http://medaka.5ch.net/test/read.cgi/php/1036141603/226
227: ?O?????|?X [] 03/12/28 21:24 ID:7YW/F4a6 b http://medaka.5ch.net/test/read.cgi/php/1036141603/227
228: ?O?????|?X [] 03/12/30 16:01 ID:2yZZI8A2 ccv http://medaka.5ch.net/test/read.cgi/php/1036141603/228
229: nobodyさん [ ] 04/01/02 08:14 ID:??? (・Д・) http://medaka.5ch.net/test/read.cgi/php/1036141603/229
230: nobodyさん [sage] 04/01/18 12:18 ID:??? テクニックメモを基に既存プログラムのメンテ中。 ・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>' http://medaka.5ch.net/test/read.cgi/php/1036141603/230
231: 7ch.cgi [sage] 04/01/18 14:25 ID:??? #!/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 } http://medaka.5ch.net/test/read.cgi/php/1036141603/231
232: nobodyさん [] 04/01/18 20:09 ID:Hq0k6H3L CCC http://medaka.5ch.net/test/read.cgi/php/1036141603/232
233: 7blosxom [sage] 04/01/19 14:33 ID:??? 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$!} http://medaka.5ch.net/test/read.cgi/php/1036141603/233
234: nobodyさん [] 04/01/20 15:14 ID: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ルーチンで済ますことってできますか? http://medaka.5ch.net/test/read.cgi/php/1036141603/234
235: 234 [age] 04/01/20 15:22 ID:??? 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"; } } } } } 間違えました。訂正しまつでつ。 http://medaka.5ch.net/test/read.cgi/php/1036141603/235
236: 234 [age] 04/01/20 15:25 ID:??? ついでに2回のforルーチンでもいいです。 http://medaka.5ch.net/test/read.cgi/php/1036141603/236
237: nobodyさん [sage] 04/01/20 16:52 ID:??? >>234 コードを短くしたいという意図はわかるけど、 実用的なプログラムでは、ここに挙がっている様なテクニックは、 なるべく使わない方が良いよ。 http://medaka.5ch.net/test/read.cgi/php/1036141603/237
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 215 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
アボンOFF
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.014s